【问题标题】:Remove duplicates from an array in Java [duplicate]从Java中的数组中删除重复项[重复]
【发布时间】:2014-04-16 16:06:11
【问题描述】:

我正在尝试编写一个程序,该程序将生成一个随机的十整数数组(1 到 6 之间的整数),然后我必须形成另一个删除所有重复项的数组。所以 {1,3,5,5,3,4,2,2,2,1} 应该返回 {1,3,5,4,2}。 问题是我得到了答案,但输出数组在重复项所在的位置包含 0,我不知道如何减少临时数组的长度(如果可能的话)。 这是我的程序:

import java.util.*;
public class Lab9Tut12{
public static void main (String[]args){
    int [] numbers = new int[10];
    //int length = 10;
    int[] temp = new int[length];
    for(int i=0;i<10;i++){
        numbers [i] = (int)(Math.random()*6+1);
        System.out.print(numbers [i]);
        System.out.println();
    }
    for(int i=1;i<10;i++){
       if(numbers[i-1]!=numbers[i]){
         temp[i]= numbers[i];
         //length--;
       }
    }
    System.out.println(Arrays.toString(temp));
}

}

【问题讨论】:

  • 你不能减少数组长度,因为它有一个固定的大小,不能在运行时改变。
  • 你需要第一个数组吗?如果不是,您可以在输入重复项的新值时进行验证。或者您可以使用 Set(不允许重复)。
  • 如果他们中的任何一个对您有帮助,您应该接受答案。

标签: java arrays duplicates


【解决方案1】:

一个很好的方法是使用Set。这是一个结构,只包含唯一值。

Set<Integer> set = new HashSet<Integer>();
int[] array = {1,1,2,2,2,3,3,4,5,6,8};

for (int num : array) {
    set.add(num);
}

System.out.println(set);

输出:

[1, 2, 3, 4, 5, 6, 8]

要将集合转换为数组,您可以使用set.toArray()

【讨论】:

  • 这真的很好,因为 add 方法不会添加一个整数,如果它已经在集合中。干杯! :)
  • 危险! HashSet 中的迭代顺序是保证的。如果迭代顺序很重要,您想使用LinkedHashSet
【解决方案2】:

请改用Set。将所有数组值放入一个集合中,然后转换回数组。

Set<Integer> numbersSet = new HashSet<>(Arrays.asList(numbers));

Integer[] uniqueNumbers = numbersSet.toArray(new Integer[0]);

Set 将消除你所有的重复,你不需要为它做任何事情。把数字放在那里。

【讨论】:

    【解决方案3】:

    您可以使用Set 来存储您唯一的随机数。 Set API

    Set<Integer> set = new HashSet<Integer>();
    set.add(randomNumber);
    ...
    

    稍后转换为列表:

     List<Integer> list = new ArrayList<Integer>(set);
    

    【讨论】:

    • 感谢您的快速响应! :)
    • Set 和 List 有什么区别,彼此有什么优势? :)
    • A Set 没有重复元素。
    【解决方案4】:

    尝试使用这段代码。 Set 不允许您放置 2 个相同的对象。

    import java.util.HashSet;
    import java.util.Set;
    
    public class MyClass {
    
        public static void main(String[] args) {
    
            int size = 10;
            Set<Integer> numbers = new HashSet<Integer>();
    
            for (int i = 0; i < size; i++) {
                numbers.add((int) (Math.random() * 6 + 1));
            }
    
            System.out.println(numbers);
    
        }
    }
    

    【讨论】:

    • 谢谢,这是处理我们不知道长度的数组的好方法。干杯!
    【解决方案5】:

    使用Set 很好,但是您会遇到问题:它的.toArray() 将返回Integer[],而不是int[](并且您不能使用Set&lt;int&gt;)。

    这是一个仍然使用集合但不同的解决方案:

    public static int[] onlyUniqueElements(final int[] inputArray)
    {
        final Set<Integer> set = new HashSet<>();
        final int[] tmp = new int[inputArray.length];
        int index = 0;
        for (final int i: inputArray)
            if (set.add(i))
                tmp[index++] = i;
    
        return Arrays.copyOfRange(tmp, 0, index);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 2014-04-23
      • 2011-06-29
      • 2013-08-03
      • 2015-11-07
      • 2011-01-04
      相关资源
      最近更新 更多