【问题标题】:Print duplicate values and non duplicate values separately in java [duplicate]在java中分别打印重复值和非重复值[重复]
【发布时间】:2019-12-02 02:01:59
【问题描述】:

我想分别打印重复值和非重复值。

String[] values= { "Java","C", "JavaScript", "JavaScript", "Java" ,"Java", "Java" , "JavaScript", "Java", "Ruby"};

我的输出应该在下面。

String[] duplicate = {"Java", "Java", "Java", "Java", "Java", "JavaScript", "JavaScript", "Java"}

String[] unique = {"C", "Ruby"} 

我尝试了几种方法,但我无法做到。

public static void main(String[] args) {

        String[] a = { "Java","C", "JavaScript", "JavaScript", "Java" ,"Java", "Java" , "JavaScript", "Java", "Ruby"};

         List<String> uniq = new ArrayList<String>();
         List<String> dupe = new ArrayList<String>();

        int count = 0;
        for (int j = 0; j < a.length; j++) {
            for (int k = j + 1; k < a.length; k++) {
                if (a[j] == a[k]) {
                    count++;
                }
            }
            if (count == 1){
                System.out.println("Dupe: "+a[j]);
                dupe.add(a[j]);
            } 
            count = 0;

        }
    }

输出


String[] Duplicate = {"Java", "Java", "Java", "Java", "Java", "JavaScript", "JavaScript"}

String[] Unique = {"C", "Ruby"}

【问题讨论】:

  • 你知道集合是如何工作的吗?我建议看看他们
  • 是的。但它会为所有值创建唯一列表。但我需要单独的列表。
  • 是的,看看套装
  • @User 输出的顺序重要吗?

标签: java printing java-8 duplicates printf


【解决方案1】:

您可以使用Collectors.partitioningBy 在一次迭代中完成,但返回类型将为Map&lt;Boolean, List&lt;String&gt;&gt;

List<String> l = Arrays.asList(values);
Map<Boolean, List<String>> d = Arrays.stream(values)
             .collect(Collectors.partitioningBy(i->Collections.frequency(l, i)>1));

输出true键关联的List在重复数组中,其他不在重复数组中

{false=[C, Ruby], true=[Java, JavaScript, JavaScript, Java, Java, Java, JavaScript, Java]}

【讨论】:

  • 看起来不错,但不是最佳解决方案,因为您有 O(n^2)
【解决方案2】:

下面的代码将为您提供一个包含字符串及其出现次数的地图:

import java.util.HashMap;
import java.util.Map;

public class TestSample {
    public static void main(String[] args) {
        String[] values =
                { "Java", "C", "JavaScript", "JavaScript", "Java", "Java", "Java", "JavaScript", "Java", "Ruby" };

        Map<String, Integer> decisionMap = new HashMap<>();
        for (String str : values) {
            if (decisionMap.containsKey(str)) {
                decisionMap.put(str, decisionMap.get(str) + 1);
                continue;
            }
            decisionMap.put(str, 0);
        }

        System.out.println(decisionMap.toString());

    }
}

唯一的字符串对键的值为 0。 您现在可以选择您喜欢的打印方式。

【讨论】:

    【解决方案3】:

    可能不是最有效的,但一种方法:

    // input: String []  a
    // initialize empty:
    Set<String> u = new HashSet<>(a.length);
    // initialize with all values of a:
    List<String> d = new ArrayList<>(Arrays.asList(a));
    for(String s:a) {
      if (u.add(a)) {// s is added to u for the first time:
        d.remove(a);
      } else { // s is duplicate in u:
        u.remove(a);
      }
    }
    String [] us = u.toArray(new String[0]);
    String [] ds = d.toArray(new String[0]); 
    

    ...利用集合的特性(元素唯一性)和Set.add():boolean 方法,当“集合被添加操作修改”时,该方法向true 发出信号。

    【讨论】:

      【解决方案4】:

      要打印唯一值,您可以使用 收集框架

          HashSet<String> h = new HashSet<String>(); 
         //Adding elements into HashSet add() 
         for(int i = 0; i < length; i++)
         {
         h.add(a[i]);           //adding element in the set
         }
            // Iterating over hash set items 
         for (String i : h)
         {  
            System.out.println(i);     //printing unique elements  
          }
      

      【讨论】:

        【解决方案5】:

        这是使用 java 8 的另一种方法

        public class Test {
            public static void main(String[] args) {
                String[] values = { "Java", "C", "JavaScript", "JavaScript", "Java", "Java", "Java", "JavaScript", "Java",
                        "Ruby" };
                List<String> l = new LinkedList<>(Arrays.asList(values));// you can not use List<String> l = Arrays.asList(values); because we will be removing the duplicate values later so you will get java.lang.UnsupportedOperationException
                Set<String> allItems = new HashSet<String>();
                List<String> duplicates = Arrays.stream(values).filter(n -> !allItems.add(n)).collect(Collectors.toList());
                System.out.println(duplicates);//this will print all the duplicate values
                l.removeAll(duplicates);// input=duplicate+unique so removing the duplicate will give the unique values
                System.out.println(l);
        
            }
        
        }
        

        输出:

        [JavaScript, Java, Java, Java, JavaScript, Java]
        [C, Ruby]
        

        【讨论】:

          【解决方案6】:

          这个answer 可能对你有帮助。

          它说您可以使用集合来创建输入数组的唯一值的集合,例如:

          int length= a.length;
          Set<String> set = new HashSet<String>();
          
          for(int i = 0; i < length; i++){
            set.add(a[i]);
          }
          

          然后,您可以通过从原始数组 a 创建一个 ArrayList 并从新的 ArrayList 中删除所有唯一值来确定重复值,例如:

          ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(a));
          arrayList.removeAll(set)
          

          这两个命令的最终结果是arrayList 只包含a 最初拥有的重复值,而set 只包含a 的唯一值。

          【讨论】:

          • " 通过 casting 将原始数组 a 作为 ArrayList" - 措辞错误
          猜你喜欢
          • 2020-09-19
          • 1970-01-01
          • 1970-01-01
          • 2015-01-23
          • 2020-10-01
          • 2017-01-14
          • 1970-01-01
          • 1970-01-01
          • 2020-10-25
          相关资源
          最近更新 更多