java - 用另一个多个字符串替换多个字符串
问题描述
我有这样的字符串 -
- 是的,我有两个、三个、四个数字
- 我有五个、六个、七个字母。
- 八、二、五是我的幸运数字。
我也有地图
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.
解决方案
我会将句子分成单词,然后重建句子,使用您的地图检查每个单词是否有数字版本,以及是否使用数字版本代替单词。
诀窍是重新添加分隔符,因为标准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.
推荐阅读
- python - 如何获得模块层次图?
- c# - C# UWP 如何在 xaml 中显示字符串 []?
- pandas - 将数据透视表堆叠在一起
- octobercms - 每个列表项只能选择一次下拉选项吗?
- swift - iOS 13 位置权限 - 从 iOS 12 升级后的行为是什么
- java - 下载的文件已损坏,由 Java 中的客户端共享
- javascript - 如何遍历一个对象(评估三个属性)并正确推入一个数组?
- c# - 如何仅获取 c# 上下文中两个 xml 文件的更改?
- html - Angular Material Nav Sidebar 仅在响应式调整大小时显示
- visual-studio-code - 如何在 WebStorm 中属性 src 和 href 中的斜线后自动显示文件列表?