Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:用相应的ID替换给定字符串上的数字_Java_String_Hashmap_Substitution - Fatal编程技术网

Java:用相应的ID替换给定字符串上的数字

Java:用相应的ID替换给定字符串上的数字,java,string,hashmap,substitution,Java,String,Hashmap,Substitution,我有一根这样的线: “[1]、[2,4]、[1,2,3]、[12,42]…”具有不可预测结构(即括号内可能有更多括号或数字) 这些数字对应于HashMap中包含的特定id。 例如: 1->11 2->纽约12 4->Hello3 42->Joe4 如何用相应的id替换字符串中的数字,而不产生歧义? 例如,如果我用数字替换数字,我可以: 替换1->即使属于12的1也会受到影响 如果我从最大的数字开始,即42,当4被替换时,即使Joe4中的“4”也会受到影响 感谢您的关注。您已经发现,简单地用相

我有一根这样的线:

“[1]、[2,4]、[1,2,3]、[12,42]…”具有不可预测结构(即括号内可能有更多括号或数字)

这些数字对应于HashMap中包含的特定id。 例如:

1->11

2->纽约12

4->Hello3

42->Joe4

如何用相应的id替换字符串中的数字,而不产生歧义? 例如,如果我用数字替换数字,我可以:

替换1->即使属于12的1也会受到影响

如果我从最大的数字开始,即42,当4被替换时,即使Joe4中的“4”也会受到影响


感谢您的关注。

您已经发现,简单地用相关名称替换出现的数字会有一些缺点:

  • 如果字符串较大或有大量对,则需要多次传递,这可能意味着显著的性能损失
  • 如果您将数字从大到小替换,您仍然可能会遇到问题,例如,如果您只有4的映射,那么您仍然会替换42中的4
  • 使用正则表达式,您可以匹配不被字符或其他数字包围的数字,但这可能会进一步提高性能,并且仍然有些脆弱,例如,如果您将1替换为
    Apollo 11
    ,然后替换为
    11
因此,最安全的方法可能是在数字处拆分字符串,迭代标记,替换任何数字并重新连接元素

例如:

Map<String, String> mapping = ...;
String input = "[1] ,[2,4], [1,2,3] ,[12,42]";
String[] elements = input.split("(?<=\\d++|\\D++)");
StringBuilder result = new StringBuilder();
for( String element : elements ) {
  //simple way to get around checking whether an element is a number: 
  //if there is nothing mapped, use the element itself - this also keeps unmapped numbers
  String replacement = mapping.get( element );
  result.appdend( replacement != null ? replacement : element );
}
Map映射=。。。;
字符串输入=“[1]、[2,4]、[1,2,3]、[12,42]”;
String[]elements=input.split((?这是我的解决方案(没有经过修饰,但我希望你能理解)。由于没有查找值,我只是将所有值替换为
**value**
,作为示例:

public static void main(String[] args) {
    String input = "[1] ,[2,4], [1,2,3] ,[12,42]...";
    int start = -1;
    StringBuilder builder = new StringBuilder();
    for (int idx = 0; idx < input.length(); idx++) {
        char c = input.charAt(idx);
        if (start == -1) {
            if (Character.isDigit(c)) {
                start = idx;
            } else {
                builder.append(c);
            }
        } else if (!Character.isDigit(c)) {
            builder.append(valueOf(input.substring(start, idx)) + c);
            start = -1;
        }
    }
    if (start != -1) {
        builder.append(valueOf(input.substring(start, input.length())));
    }
    System.out.println(builder);
}

private static String valueOf(String num) {
    int val = Integer.parseInt(num);
    return map.getOrDefault(val,"**" + val + "**");
}

您必须将表达式
map.getOrDefault(val,“**”+val+“**”)替换为包含替换字符串的映射的引用。

我建议查看正则表达式,这或多或少是一个简单的解决方案。另一种方法是先解析字符串(格式非常简单),处理数据,然后将其转换回字符串。
[**1**] ,[**2**,**4**], [**1**,**2**,**3**] ,[**12**,**42**]...