Java中查找字符串中的重复字符

培训教学 潘老师 8个月前 (09-13) 441 ℃ (0) 扫码查看

学习编写一个简单的 Java 程序来查找 String 中的重复字符。这可能是一个可能的Java 面试问题,而面试官可能会评估我们的编码技能。

我们可以使用给定的代码来查找重复的字符,或者修改代码来查找字符串中的非重复字符

1. 使用纯Java

让我们从自己编写程序逻辑开始。在此解决方案中,我们创建Map,其中字符串中的每个唯一字符都是Map键,并且字符出现的次数存储为值。

1.1. 算法

  • 将字符串拆分为字符数组。
  • 迭代字符数组。
  • 对于每次迭代,使用该字符作为Map的key并检查Map中是否已存在相同的字符。
  • 如果Map的key不存在,则该字符是第一次出现,将其存储在map中,计数value为1。
  • 如果Map的key存在,则增加关联的计数器。
  • 重复此操作,直到迭代完数组中的所有字符。
  • 检查Map,重复字符的计数大于1。
  • 不重复字符的计数为 1。

1.2. Java程序

public static Map<Character, Integer> getCharBag(String input) {

  Map<Character, Integer> map = new HashMap<>();
  
  if(input == null || input.length() == 0)
    return map;
  
  for (char c : input.toCharArray()) {

    if (map.containsKey(c)) {
      int counter = map.get(c);
      map.put(c, ++counter);
    } else {
      map.put(c, 1);
    }
  }
  return map;
}

现在我们可以使用上面的Map来了解每个字符的出现次数并确定哪些字符是重复的或唯一的。

//duplicate chars
List duplicateChars = bag.keySet()
    .stream()
    .filter(k -> bag.get(k) > 1)
    .collect(Collectors.toList());

System.out.println(duplicateChars); //[a, o]

我们还可以找到该字符串中的重复字符及其出现次数。

Map<Character, Integer> duplicateCharsWithCount = bag.entrySet()
    .stream()
    .filter(e -> bag.get(e.getKey()) > 1)
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

System.out.println(duplicateCharsWithCount); //{a=2, o=3}

同样,我们可以通过将计数与 1 进行比较来获取所有唯一字符。

//unique chars
List duplicateChars = bag.keySet()
    .stream()
    .filter(k -> bag.get(k) == 1)
    .collect(Collectors.toList());

System.out.println(duplicateChars); //[t, d, v, w, h, i, j, n]

2.使用Google Guava

寻找重复字符的方法与前一节讨论的相同。我们只需将HashMap类替换为Google Guava库中的Multiset类。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.1-jre</version>
</dependency>

我们需要将所有字符一一添加到Multiset中。Multiset类允许通过跟踪它包含的每个唯一元素的计数来存储同一元素的多次出现。

Multiset multiset = HashMultiset.create();
for (char c : input.toCharArray()) {
  multiset.add(c);
}

从这一点来看,我们可以使用Multiset来使用上一节中的类似逻辑来查找不同且唯一的字符。

Map<Character, Integer> duplicateCharsWithCount = (Map<Character, Integer>) multiset.elementSet()
  .stream()
  .filter(k -> multiset.count(k) > 1)
  .collect(Collectors.toMap(p -> p, p -> multiset.count(p)));
System.out.println(duplicateCharsWithCount); //{a=2, o=3}

我们学习了如何使用映射来查找字符串中的重复字符,并检查非重复字符。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/8993.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】