gpt4 book ai didi

java - 如何使用 java8 在字符串中查找第一个重复和不重复的字符

转载 作者:行者123 更新时间:2023-12-02 14:00:17 24 4
gpt4 key购买 nike

我有一个工作示例来查找第一个重复的和使用 java 7 字符串中的非重复字符

下面是工作示例

public class FindFirstRepeatedAndNonRepeatedChar {
static void firstRepeatedNonRepeatedChar(String inputString) {

HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();

char[] strArray = inputString.toCharArray();

for (char c : strArray) {
if (charCountMap.containsKey(c)) {
charCountMap.put(c, charCountMap.get(c) + 1);
} else {
charCountMap.put(c, 1);
}
}

for (char c : strArray) {
if (charCountMap.get(c) == 1) {
System.out.println("First Non-Repeated Character In '" + inputString + "' is '" + c + "'");

break;
}
}

for (char c : strArray) {
if (charCountMap.get(c) > 1) {
System.out.println("First Repeated Character In '" + inputString + "' is '" + c + "'");

break;
}
}
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the string :");
String input = sc.next();
firstRepeatedNonRepeatedChar(input);
}
}

任何人都可以帮助我如何使用 Java8 重构上述代码吗?

最佳答案

通过一些有用的输入,我用更少的代码调整了我的答案:

public class FirstRepeat {

public static void main(String[] args) {
Map<Character, Long> collect = "abcsdnvs".chars().mapToObj(i -> (char)i).collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));
collect.forEach( (x,y) -> System.out.println( "Key: " + x + " Val: " + y));

Optional<Character> firstNonRepeat = collect.entrySet().stream().filter( (e) -> e.getValue() == 1).map(e -> e.getKey()).findFirst();
if(firstNonRepeat.isPresent()) {
System.out.println("First non repeating:" + firstNonRepeat.get());
}
Optional<Character> firstRepeat = collect.entrySet().stream().filter( (e) -> e.getValue() > 1).map(e -> e.getKey()).findFirst();
System.out.println("First repeating:" + firstRepeat.orElse(null));
}
}

上面的作用:

  1. 创建字符流:"abcsdnvs".chars().mapToObj(i -> (char)i)
  2. 使用收集器对这些字符进行分组:.collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));

分组分为 3 个不同的部分:

  1. 分类器

正如所指出的,我可以使用 Function.identity() 来实现这一点。相当于x -> x。这意味着我们是按实际角色分组的。

  • map 工厂
  • 我们为此使用LinkedHashMap::new。原因是我们需要保留插入顺序才能找到第一个元素。默认实现使用 HashMap,它不会保留插入顺序。

  • 下游收集器
  • 由于我们使用分组,因此我们需要决定如何收集分组元素。在这种情况下,我们需要出现的次数。为此,您可以使用:Collectors.counting(),它将简单地总结给定字符的可用元素数量。

    程序然后打印:

    Key: a Val: 1
    Key: b Val: 1
    Key: c Val: 1
    Key: s Val: 2
    Key: d Val: 1
    Key: n Val: 1
    Key: v Val: 1
    First non repeating:a
    First repeating:s

    我们使用流操作来查找第一个元素(基于过滤器):

    Optional<Character> firstNonRepeat = collect.entrySet().stream().filter( (e) -> e.getValue() == 1).map(e -> e.getKey()).findFirst();

    我们可以在其中流式传输分组元素,并按值过滤它们(>1表示第一个重复字符,==1表示第一个非重复字符)。如果存在这样的元素,findFirst 方法就会返回该元素。

    返回值是可选值,应安全处理。正如所指出的,您可以使用 isPresent() 来检查是否已找到值(请参阅第一个打印语句)或使用 orElse(...) 来返回默认值value 而不是抛出异常(请参阅打印语句编号 2,其中我返回 null 作为默认值,以防止在没有找到重复字母的情况下抛出异常)

    关于java - 如何使用 java8 在字符串中查找第一个重复和不重复的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39529831/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com