【问题标题】:To compare 2 integer arrays using Java 8 Features [duplicate]使用 Java 8 功能比较 2 个整数数组 [重复]
【发布时间】:2016-09-22 13:33:45
【问题描述】:

是否可以在没有外部 foreach 的情况下进行迭代 b.需要使用 Java 8 识别 2 个数组中的公共值

Integer a[]={1,2,3,4};
Integer b[]={9,8,2,3};
for(Integer b1:b) {
    Stream.of(a).filter(a1 -> (a1.compareTo(b1) ==0)).forEach(System.out::println);
    }
Output: 2 3

【问题讨论】:

  • a1 -> (a1.compareTo(b1) ==0) 表示a1 -> a1.equals(b1) 是一种相当模糊的方式。顺便说一句,您也可以使用Predicate.isEqual(b1),或者,如果您可以确定您的数组中不会有null,则使用b1::equals
  • @Tunaki:这些都是非常糟糕的参考。在这两种情况下,接受的答案实际上都与问题不匹配。

标签: java-8


【解决方案1】:

如果您只想要公共值(即不考虑重复),我建议使用集合

Integer a[]={1,2,3,4};
Integer b[]={9,8,2,3};

Set<Integer> aSet = new HashSet<>(Arrays.asList(a));
Set<Integer> bSet = new HashSet<>(Arrays.asList(b));

aSet.retainAll(bSet);

【讨论】:

    【解决方案2】:

    可能是这样的:

    public static void main(String[] args) {
        Integer a[] = {1, 2, 3, 4};
        Integer b[] = {9, 8, 2, 3};
    
        Stream<Integer> as = Arrays.stream(a).distinct();
        Stream<Integer> bs = Arrays.stream(b).distinct();
    
        List<Integer> collect = Stream.concat(as, bs)
                .collect(Collectors.groupingBy(Function.identity()))
                .entrySet()
                .stream()
                .filter(e -> e.getValue().size() > 1)
                .map(e -> e.getKey())
                .collect(Collectors.toList());
    
        System.out.println(collect);
    }
    
    • 我们将两个数组合并为一个流
    • groupBy 按值计数
    • 然后我们过滤长度超过 1 的列表,该列表包含重复项
    • map 用于提取重复条目值的键
    • 打印出来。

    编辑:为初始流添加了不同的内容。

    【讨论】:

    • 如果你做 a = {1,1} and b= {2,3} 它会说 1 在 a 和 b 中,这是错误的
    • 添加 distinct 以解决该问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2020-08-18
    • 2015-02-17
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多