首页 > 解决方案 > 用另一个多个字符串替换多个字符串

问题描述

我有这样的字符串 -

  1. 是的,我有两个、三个、四个数字
  2. 我有五个、六个、七个字母。
  3. 八、二、五是我的幸运数字。

我也有地图

Map <String, String> wordToDigit = new HashMap<>;
Map.put("two", 2);
Map.put("three", 3);
Map.put("four", 4);
Map.put("five", 5);
Map.put("six", 6);
Map.put("eight",8);

我需要用地图中的相应值替换字符串中的单词。由于每个字符串不包含所有的键,存储在一个映射中。那么,如何通过迭代作为字符串一部分的属性而不是迭代整个地图来更有效地做到这一点?

在输出中:-

1. yes, I have 2, 3, 4 numbers.
2. I have 5, 6, 7 alphabets.
3. 8, 2, 5 are my lucky numbers. 

标签: javastring

解决方案


我会将句子分成单词,然后重建句子,使用您的地图检查每个单词是否有数字版本,以及是否使用数字版本代替单词。

诀窍是重新添加分隔符,因为标准String.split方法不包含这些分隔符。

Map <String, Integer> wordToDigit = new HashMap<>();
wordToDigit.put("two", 2);
wordToDigit.put("three", 3);
wordToDigit.put("four", 4);
wordToDigit.put("five", 5);
wordToDigit.put("six", 6);
wordToDigit.put("eight",8); 

String sentence = "yes, I have two, three, four numbers";

String[] words = sentence.split("[^a-zA-Z]+", -1);

int pos = 0;
StringBuilder sb = new StringBuilder();
for(String word : words)
{
    int idx = sentence.indexOf(word, pos);
    String delim = sentence.substring(pos, idx);
    sb.append(delim);        

    Integer n = wordToDigit.get(word.toLowerCase());
    sb.append(n == null ? word : n);

    pos += delim.length() + word.length();      
}
sb.append(sentence.substring(pos, sentence.length()));        

System.out.println(sb);

输出:

yes, I have 2, 3, 4 numbers

对于其他 2 个句子

I have 5, 6, seven alphabets
8, 2, 5 are my lucky numbers.

推荐阅读