如何将列表中的重复元素放入数组中?

时间:2019-01-20 21:31:52

标签: java java-8 java-stream

我需要在集合中找到重复的项目并将其放入数组中。

我写了这个方法:

String[] mass = new String[(int) limit];

        for (int i = 0; i < duplicates.size(); i++){
            for (int j = 1; j < duplicates.size(); j++){
                if (i != j && duplicates.get(i).equalsIgnoreCase(duplicates.get(j))){
                    mass[j - 1] = duplicates.get(j);
                }
            }

我有这个收藏集:

List<String> duplicates = new ArrayList<>();
        Collections.addAll(duplicates, "java", "JaVa", "mm", "Mama", "ss", "MaMa");

但是当我在屏幕上显示结果时,我得到了这个答案。

JaVa
MaMa
Mama

我想念什么?

3 个答案:

答案 0 :(得分:2)

如果您想通过使用Java-8流来做到这一点

  1. 首先将List流到Map中,键为String,值是Long发生次数

 Map<String, Long> result =  duplicates.stream().map(String::toLowerCase)
          .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
  System.out.println(result);    //{ss=1, mm=1, java=2, mama=2}
  1. 然后过滤器(如果出现的次数大于1)并将其收集为String数组,下面的代码显示了两者的组合

String[] array = duplicates.stream().map(String::toLowerCase)
          .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
          .entrySet().stream().filter(entry->entry.getValue()>1).map(Map.Entry::getKey).toArray(String[]::new);

   System.out.println(Arrays.toString(array));  //[java, mama]

答案 1 :(得分:1)

我不想放弃它,因为看起来您正在学习。提示:您可以(也许应该在实践中)通过一个循环完成此任务。无需使用嵌套循环。请记住,可以通过使用重复项.size()-1缩短循环。

答案 2 :(得分:1)

有些事情,内循环只需要向前看,这样.FirstLine可以从j开始,因此,外循环以i+1结束。然后,在分配给i < duplicates.size() -1时不能使用I或j,为此需要一个单独的计数器

mass