从 Java 中的数组中删除重复项

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22352934/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 15:09:58  来源:igfitidea点击:

Remove duplicates from an array in Java

javaarraysduplicates

提问by Georgi Koemdzhiev

I am trying to write a program which will generate a random ten integer array(integers between 1 and 6) and then I have to form another array with all duplicates removed. So {1,3,5,5,3,4,2,2,2,1} should return {1,3,5,4,2}. The problem is that I get an answer but the output array contains 0s in the places where the duplicates were and I do not know how to decrease the length of the temp array(if it is even possible). Here is my program.:

我正在尝试编写一个程序,该程序将生成一个随机的十个整数数组(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));
}

}

}

采纳答案by Warlord

A nice way to do this is to utilize a Set. That's a structure, that contains only unique values.

一个很好的方法是使用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);

Outputs:

输出:

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

To convert the set to an array you can use set.toArray().

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

回答by Klemens Morbe

You could use a Setto store your unique random numbers. Set API

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

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

Later convert to a list:

稍后转换为列表:

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

回答by Avi

Use Setinstead. Put all the array values in a set and then convert back to array.

使用Set来代替。将所有数组值放在一个集合中,然后转换回数组。

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

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

Set will eliminate all you duplicates and you don't need to do anything for it. Just put the numbers there.

Set 将消除您所有的重复项,您无需为它做任何事情。把数字放在那里就行了。

回答by ruhungry

Try use this piece of code. Set does not allow you to put 2 same objects.

尝试使用这段代码。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);

    }
}

回答by fge

Using a Setis nice, however you'll have a problem: its .toArray()will return an Integer[], not an int[](and you cannot have a Set<int>).

使用 aSet很好,但是你会遇到一个问题:它.toArray()会返回 an Integer[],而不是 an int[](并且你不能有 a Set<int>)。

Here is a solution which still uses a set, but differently:

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

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);
}