java 均值插值_Java简单字符串插值实现

本文介绍了如何在Java中实现字符串插值,包括使用MessageFormat的简单示例以及自定义的索引和命名插值方式。通过提供的代码示例展示了如何创建和使用这些插值方法,以提高编码效率。
摘要由CSDN通过智能技术生成

字符串插值是非常有用的功能,可以提高编码效率。Java语言没有提供原生的字符串插值功能,但在标准库中 MessageFormat 提供了部分功能。现在把积累的相关代码整理重构一下,以便以后使用。

例子:

import static java.lang.System.out;

import static cc.interpolation.Interpolations.indexed;

import static cc.interpolation.Interpolations.named;

import java.util.Collections;

public class Test {

public static void main(String[] args) {

out.println(indexed("{0} and {1}", "Li Lei", "Han Meimei"));

out.println(named("{a} and {b}", "a", "Li Lei", "b", "Han Meimei"));

out.println(named("{a} and {unknown}", "a", "A", "default"));

out.println(named("{a} and {unknown}",

Collections.singletonMap("a", "A"), "default"));

}

}

输出:

Li Lei and Han Meimei

Li Lei and Han Meimei

A and default

A and default

具体实现如下:

import java.util.Map;

public class Interpolations {

private static final InterpolationEngine INDEXED_ENGINE = new IndexedInterpolationEngine();

private static final InterpolationEngine NAMED_ENGINE = new NamedInterpolationEngine();

public static String indexed(String template, Object... bindings) {

return INDEXED_ENGINE.combine(template,

IndexedInterpolationEngine.createBindings(bindings));

}

public static String named(String template, Object... bindings) {

return NAMED_ENGINE.combine(template,

NamedInterpolationEngine.createBindings(bindings));

}

public static String named(String template, Map bindings) {

return named(template, bindings, null);

}

public static String named(String template, Map bindings,

Object defaultValue) {

return NAMED_ENGINE.combine(template, NamedInterpolationEngine

.createBindings(bindings, defaultValue));

}

}

插值引擎接口:

public interface InterpolationEngine {

public interface Bindings {

Object get(String name);

}

String combine(String template, Bindings bindings);

}

根据主要用到了两种插值方式:索引、命名。

这两种方式都可以使用正则表达式实现。基本的正则表达式插值代码为:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class PatternInterpolationEngine implements InterpolationEngine {

private final Pattern pattern;

public PatternInterpolationEngine(Pattern pattern) {

this.pattern = pattern;

}

@Override

public String combine(String template, Bindings bindings) {

StringBuffer buffer = new StringBuffer(template.length());

Matcher matcher = pattern.matcher(template);

while (matcher.find()) {

String name = matcher.group(1);

Object value = bindings.get(name);

matcher.appendReplacement(buffer, String.valueOf(value));

}

matcher.appendTail(buffer);

return buffer.toString();

}

}

索引方式:

import java.util.regex.Pattern;

public class IndexedInterpolationEngine extends PatternInterpolationEngine {

private static final Pattern PATTERN = Pattern.compile("\\{([0-9]+)\\}");

public IndexedInterpolationEngine() {

super(PATTERN);

}

public static Bindings createBindings(Object... array) {

return new ArrayBindings(array);

}

private static final class ArrayBindings implements Bindings {

private final Object[] array;

public ArrayBindings(Object[] array) {

this.array = array;

}

@Override

public Object get(String name) {

return array[Integer.parseInt(name)];

}

}

}

命名方式:

import java.util.Map;

import java.util.regex.Pattern;

public class NamedInterpolationEngine extends PatternInterpolationEngine {

private static final Pattern PATTERN = Pattern

.compile("\\{([_a-zA-Z0-9]+)\\}");

public NamedInterpolationEngine() {

super(PATTERN);

}

public static Bindings createBindings(Object... array) {

return new AssociativeArrayBindings(array);

}

public static Bindings createBindings(Map map,

Object defaultValue) {

return new MapBindings(map, defaultValue);

}

private static final class AssociativeArrayBindings implements Bindings {

private final Object[] associativeArray;

private final int lookupLength;

private final Object defaultValue;

public AssociativeArrayBindings(Object[] associativeArray) {

this.associativeArray = associativeArray;

if (associativeArray.length % 2 == 0) {

lookupLength = associativeArray.length;

defaultValue = null;

} else {

lookupLength = associativeArray.length - 1;

defaultValue = associativeArray[associativeArray.length - 1];

}

}

@Override

public Object get(String name) {

for (int i = 0; i < lookupLength; i += 2) {

if (name.equals(associativeArray[i])) {

return associativeArray[i + 1];

}

}

return defaultValue;

}

}

private static final class MapBindings implements Bindings {

private final Map map;

private final Object defaultValue;

public MapBindings(Map map, Object defaultValue) {

this.map = map;

this.defaultValue = defaultValue;

}

@Override

public Object get(String name) {

if (map.containsKey(name)) {

return map.get(name);

} else {

return defaultValue;

}

}

}

}

目前只实现了基本的功能,但是足以应付我现在的需要。如以后有更多的功能需求,再行扩展。

以下是代码实现: ```python def is_int(num_str): """ 判断字符串是否为整数 """ try: int(num_str) return True except ValueError: return False def input_sequence(): """ 输入数列并存入列表中 """ while True: seq_str = input("请输入数列,用逗号或空格等字符隔开:") seq_list = seq_str.replace(",", " ").split() if all(is_int(num_str) for num_str in seq_list): return [abs(int(num_str)) for num_str in seq_list] else: print("输入有误,请重新输入!") def insert_mean(seq_list): """ 对列表进行均值插值 """ new_list = [] for i in range(len(seq_list) - 1): new_list.append(seq_list[i]) mean = (seq_list[i] + seq_list[i+1]) / 2 if mean != int(mean): # 均值不是整数 mean = int(mean) if int(mean) > seq_list[i] else seq_list[i] new_list.append(mean) new_list.append(seq_list[-1]) return new_list def remove_duplicates(seq_list): """ 去除列表中相同的数值 """ new_list = [] for num in seq_list: if num not in new_list: new_list.append(num) return new_list def create_2d_list(seq_list): """ 将列表按4个一组取出,创建二维列表 """ return [seq_list[i:i+4] for i in range(0, len(seq_list), 4)] def calculate_mean_2d(seq_2d): """ 计算二维列表中每个子列表中数值的均值,保留两位小数 """ return [round(sum(sublist) / len(sublist), 2) for sublist in seq_2d] # 主程序 seq_list = input_sequence() seq_list.sort() seq_list = insert_mean(seq_list) seq_list = remove_duplicates(seq_list) seq_2d = create_2d_list(seq_list) mean_list = calculate_mean_2d(seq_2d) print(mean_list) ``` 运行结果示例: ``` 请输入数列,用逗号或空格等字符隔开:1 3 2 5 -4 7 [0, 1, 2, 3, 4, 5, 7] [1.5, 2.5, 3.0, 4.0, 5.5, 6.0] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值