【问题标题】:Remove duplicate elements from array along with element in Java 1.7从数组中删除重复元素以及 Java 1.7 中的元素
【发布时间】:2017-08-08 02:54:37
【问题描述】:

我需要编写一个方法,其中 int[] 将作为输入提供,它应该返回一个数组,但所有出现超过 n 次的数字都被完全删除。

Inputs:
    (int list) data = [1, 2, 2, 3, 3, 3, 4, 5, 5]

Output:
    (int list) [1, 4]

这些是我尝试过的步骤。

  1. 将 int 数组复制到 ArrayList (inputList)。
  2. 创建 LinkedHashset 以查找唯一值
  3. 迭代LH,用迭代器求ArrayList的收集频率。

    int[] intArray = new int[0];
    
    if(n!=0){
        if(data.length<100){
    
            ArrayList<Integer> inputList = new ArrayList<Integer>(data.length);
            //System.out.println(Arrays.toString(data));
            for (int i = 0; i < data.length; i++){
                inputList.add(Integer.valueOf(data[i]));
            }
    
            LinkedHashSet<Integer> lhs = new LinkedHashSet<>(inputList);
    
            intArray = new int[lhs.size()];
            int i=0;
            int j=0;
            Iterator<Integer> itr = lhs.iterator();
            while(itr.hasNext()){
                Integer shiftNumber = itr.next();
    
                if(Collections.frequency(inputList, shiftNumber)==1) {
                    intArray[i++] = shiftNumber.intValue();
                    j++;
                }
    
    
            }
            intArray = Arrays.copyOf(intArray, j);
            return intArray;
        }
    }
    
    return intArray;
    

我能够使用上述 sn-p 实现结果。但是,我需要通过使用任何算法或其他集合对象来减少代码段并提高性能的建议。

【问题讨论】:

  • 看起来你想发帖到Code Review,所以不是为了改进工作代码,而是修复损坏的代码。
  • 或者您可以寻找答案进行比较并查看其他解决方案进行测试。 Removing Duplicates
  • @Underbalanced 请重新阅读声明。要求是删除具有重复项的项目。输入:(int list) data = [1, 2, 2, 3, 3, 3, 4, 5, 5] 输出:(int list) [1, 4]
  • 为什么问题是-1?我希望它不是重复的

标签: java arrays collections


【解决方案1】:

您可以改用地图。

映射键将表示在数组中找到的值;地图值将是一个计数器。

您迭代您的数组,并为每个元素放置一个 counter=1(当第一次找到该值时);或者你只是增加那个计数器。

最后,您只收集那些显示计数器值为 1 的映射键。

【讨论】:

    【解决方案2】:

    您可能使算法过于复杂。将每个值映射到其频率然后复制频率小于n 的值可能更简单。另请注意,您无需在 intInteger 之间显式转换:Java 会自动为您完成。

    int[] output = new int[input.length];
    Map<Integer,Integer> counts = new HashMap<>();
    int size = 0;
    for (int i = 0; i < input.length; i++) {
        counts.put(input[i], counts.getOrDefault(input[i], 0) + 1);
    }
    for (int i = 0; i < input.length; i++) {
        if (counts.get(input[i]) < n)
            output[size++] = input[i];
    }
    return Arrays.copyOf(output, size);
    

    如果您熟悉 Java 8 流,那么代码可以大大减少:

    Map<Integer,Integer> count = Arrays.stream(input).boxed()
        .collect(groupingBy(identity(), counting()));
    return Arrays.stream(input).filter(i -> count.get(i) < n).toArray();
    

    【讨论】:

    • 对于 java 8,您可以使用更简洁的方法来计算地图值。 for (int i = 0; i v == null ? 1 : v++); }
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2011-07-03
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多