Java场景下如何去除字符串中的非相邻重复字符?
如何去除字符串中的非相邻重复字符
需求背景:
- 生成两个各含5个随机数的数组,找出两数组的共同数字并存入
SameNums字符串 - 需要去除
SameNums中的所有重复字符(包括非相邻的重复项),例如:- 输入
"12355"→ 输出"1235" - 输入
"12928"→ 输出"1298"
- 输入
现有实现代码:
// 创建数组 Random rand = new Random(); int[] first5num = new int[5]; int[] second5num = new int[5]; for (int i = 0; i < 5; i++) { first5num[i] = rand.nextInt(9 + 1); System.out.print(" " + first5num[i]); } for (int j = 0; j < 5; j++) { second5num[j] = rand.nextInt(9 + 1); System.out.print(" " + second5num[j]); } // 遍历数组找共同数字 String SameNums = ""; int comparitive; for (int k = 0; k < 5; k++) { comparitive = first5num[k]; for (int l = 0; l < 5; l++) { if (comparitive == second5num[l]) { SameNums += comparitive; } } }
已尝试的思路代码:
// 用while循环处理字符串 boolean run = true; int counter = 0; int restrict = counter + 1; String word1, word3; while (run == true) { if (counter == SameNums.length() - 1) { run = false; } if (SameNums.charAt(counter) == SameNums.charAt(restrict)) { word1 = SameNums.substring(0, restrict); word3 = SameNums.substring(restrict + 1, SameNums.length()); SameNums = word1 + word3; counter++; restrict = counter + 1; continue; } }
解决方案
方法1:构建字符串时直接去重(更高效)
不需要先把所有重复项加入字符串再处理,而是在添加前判断数字是否已存在,避免重复写入:
String SameNums = ""; int comparitive; for (int k = 0; k < 5; k++) { comparitive = first5num[k]; // 先判断当前数字是否已在结果中,避免重复添加 if (SameNums.indexOf(String.valueOf(comparitive)) == -1) { for (int l = 0; l < 5; l++) { if (comparitive == second5num[l]) { SameNums += comparitive; break; // 找到匹配就退出内层循环,避免重复添加同一数字 } } } }
方法2:用Set集合去重(简洁可靠)
利用Set的元素唯一性特性,先存储共同数字再转成字符串:
Set<Character> uniqueChars = new HashSet<>(); int comparitive; for (int k = 0; k < 5; k++) { comparitive = first5num[k]; for (int l = 0; l < 5; l++) { if (comparitive == second5num[l]) { uniqueChars.add((char)(comparitive + '0')); // 将int转为对应字符 break; } } } // 把Set转为字符串 StringBuilder sb = new StringBuilder(); for (char c : uniqueChars) { sb.append(c); } String SameNums = sb.toString();
方法3:修复原while循环逻辑
如果坚持用字符串遍历去重,补充完整逻辑避免死循环:
int counter = 0; while (counter < SameNums.length()) { char current = SameNums.charAt(counter); // 从当前位置下一位开始查找重复字符 int duplicateIndex = SameNums.indexOf(current, counter + 1); if (duplicateIndex != -1) { // 删除重复字符 SameNums = SameNums.substring(0, duplicateIndex) + SameNums.substring(duplicateIndex + 1); } else { // 无重复则移动到下一个字符 counter++; } }
说明
- 方法1和2在构建结果阶段就避免了重复,比事后处理字符串的效率更高
- Set集合的方式代码简洁,能天然保证元素唯一性,推荐使用
内容的提问来源于stack exchange,提问作者CodeGeek
相关产品推荐
相关产品推荐

