使用条件逻辑将多个for循环转换为Java 8流

问题描述 投票:0回答:4

我需要将包含多个for循环和if语句的代码转换为Java 8 Streams

public static List<String> removeDuplicateNames(String[] namesArray){
  List<String> uniqueNames = new ArrayList<>();
        int occurrence  = 0;
        for(String name:  namesArray) {
            for (String name2 : namesArray)
                if (name.equalsIgnoreCase(name2))
                    occurrence++;
            if (occurrence == 1)
                uniqueNames.add(name);
            occurrence = 0;
        }
  return uniqueNames;
}

我需要遍历名称数组,并返回仅包含不重复名称的列表。如果一个名称出现多次,则需要从最终列表中删除

输入-> [“汤姆”,“乔治”,“汤姆”,“麦克”,“布莱恩”]

Output-> [“ George”,“ Mike”,“ Brian”]

任何人都可以帮忙吗?

java for-loop if-statement stream
4个回答
0
投票
您建立了一个name到频率计数的映射,然后得到计数为1的名称。

实际上,您的非流代码也应该这样做,以获得更好的性能。

public static List<String> removeDuplicateNames(String... namesArray) { return Stream.of(namesArray) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream() .filter(e -> e.getValue() == 1) .map(Entry::getKey) .collect(Collectors.toList()); }

Test

System.out.println(removeDuplicateNames("This", "is", "a", "test", "a", "real", "good", "test"));

输出

[This, is, real, good]

0
投票
您可以根据equalsIgnoreCase分组相等的名称(通过将所有String转换为小写),并仅保留大小为1的组。

public static List<String> removeDuplicateNames(String[] namesArray){ return Arrays.stream(namesArray) .collect(Collectors.groupingBy(String::toLowerCase)) .values() .stream() .filter(l -> l.size() == 1) .map(l -> l.get(0)) .collect(Collectors.toList()); }

测试:

System.out.println(removeDuplicateNames(new String[] {"This", "is", "a", "test", "A", "better", "Test"}));

输出:

[better, This, is]


0
投票
您必须首先为每个名称创建一个频率表。然后遍历它的条目集,并检查其中一个的频率,获取关联的密钥并将其收集到列表中。这是它的外观。

List<String> uniqueNames = Arrays.stream(namesArray) .collect(Collectors.groupingBy(n -> n, Collectors.counting())) .entrySet().stream() .filter(e -> e.getValue() == 1) .map(Map.Entry::getKey) .collect(Collectors.toList());

这里是输出。

[Brian, Mike, George]


-1
投票
尝试一下:

List<String> unique = Arrays.stream(namesArray).distinct().collect(Collectors.toList());

© www.soinside.com 2019 - 2024. All rights reserved.