Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较数组中的元素是否存在重复项_Java_Arrays - Fatal编程技术网

Java 比较数组中的元素是否存在重复项

Java 比较数组中的元素是否存在重复项,java,arrays,Java,Arrays,我试图用Java生成一个5位数的int数组,但在从哪里开始时遇到了问题。数组中的任何数字都不能重复。我可以很好地生成随机数,但就是不知道如何相互比较数字并替换任何重复的数字。您可以使用java.util.Set而不是数组,因为它保证只有唯一的元素 试试这个: int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Random random = new Random(); int[] generateId() { int[] clone = d

我试图用Java生成一个5位数的
int
数组,但在从哪里开始时遇到了问题。数组中的任何数字都不能重复。我可以很好地生成随机数,但就是不知道如何相互比较数字并替换任何重复的数字。

您可以使用java.util.Set而不是数组,因为它保证只有唯一的元素

试试这个:

int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Random random = new Random();

int[] generateId() {
    int[] clone = digits.clone();
    int[] id = new int[5];

    for (int i = 0; i < 5; i++) {
        int candidate;

        do {
            candidate = random.nextInt(10);
        } while (clone[candidate] == -1);

        id[i] = clone[candidate];
        clone[candidate] = -1;
    }

    return id;
}
int[]位={0,1,2,3,4,5,6,7,8,9};
随机=新随机();
int[]generateId(){
int[]clone=digits.clone();
int[]id=新的int[5];
对于(int i=0;i<5;i++){
int候选人;
做{
候选者=随机。nextInt(10);
}while(克隆[候选]=-1);
id[i]=克隆[候选];
克隆[候选]=-1;
}
返回id;
}

您可以通过将数组转换为树集(这也将对它们进行排序)来消除重复项:


如果我理解正确的话,你想要一个随机的5位数字,没有重复的数字

如果是这样,一种方法是将数字0-9的列表洗牌,然后选择前5个元素

编辑

Integer[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Random random = new Random();

public Integer[] generateId() {
    List<Integer> id = Arrays.asList(digits);
    Collections.shuffle(id, random);
    return id.subList(0, 5).toArray(new Integer[0]);
}
Integer[]位={0,1,2,3,4,5,6,7,8,9};
随机=新随机();
公共整数[]generateId(){
列表id=Arrays.asList(数字);
集合。洗牌(id,随机);
返回id.subList(0,5).toArray(新整数[0]);
}

这将以O(位数)的形式生成数组,没有内部循环,也没有洗牌作为替代,只需对数组排序并迭代即可

    List<int> myList = new List<int>() { 1, 1, 2, 3, 4, 5, 5, 7 , 1, 7};
    myList.Sort();
    for (int i = myList.Count - 1; i > 0; i--)
    {
        if (myList[i] == myList[i - 1])
            myList.RemoveAt(i);
    }
List myList=newlist(){1,1,2,3,4,5,5,7,1,7};
myList.Sort();
对于(int i=myList.Count-1;i>0;i--)
{
if(myList[i]==myList[i-1])
myList.RemoveAt(i);
}

但当然,最好不要从一开始就得到任何副本。

首先,我要感谢你们所有人的帮助,我真的很感激

我得到了这个程序,以我想要的方式工作,但似乎应该有一个更简单的方法,虽然。这就是我所做的。再多评论就太棒了

do
    {
        for (int i = 0; i < 5; i++) 
        {
            iNumber = generator.nextInt(9) + 1;
            numbers[i] = iNumber;
        }
    }
    while(numbers[0] == numbers[1] || numbers[0] == numbers[2] || numbers[0] == numbers[3] || numbers[0] == numbers[4] || numbers[1] == numbers[2] || numbers[1] == numbers[3] || numbers[1] == numbers[4] || numbers[2] == numbers[3] || numbers[2] == numbers[4] || numbers[3] == numbers[4]);
do
{
对于(int i=0;i<5;i++)
{
iNumber=generator.nextInt(9)+1;
数字[i]=个数;
}
}
而(数字[0]==数字[1]| |数字[0]==数字[2]| |数字[0]==数字[3]| |数字[0]==数字[4]| |数字[1]==数字[3]| |数字[1]==数字[4]| |数字[2]==数字[3]| | |数字[2]==数字[4]|数字[4];
/**
*findDuplicate方法返回映射,其中键是唯一的no,值作为
*重复
* 
*@param a
*:对象数组
*@返回地图
*/
公共地图找到副本(T[]a){
Map Map=newhashmap();
Set unique=newhashset(Arrays.asList(a));
整数计数=0;
for(T整数:唯一){
对于(T整数1:a){
如果(整数==整数1){
++计数;
}
}
map.put(整数,计数);
计数=0;
}
返回图;
}

你所说的“5位整数数组”是什么意思?你看,只要生成随机数并将它们放入一个集合中,而它的大小小于或等于5。然后调用toArray方法将它们导出到aray。当然,数组将包含整数,而不是ints@sandman:我不知道这是否是个好主意,因为Set不能保证返回元素的顺序@约翰:这篇文章中至少提出了两种更干净的解决方案?@sventek:我不知道这些数字必须按顺序排列?在这种情况下,我建议使用SortedSet。它确实使插入件更昂贵,但我仍然相信这是一个相当好的解决方案。
    List<int> myList = new List<int>() { 1, 1, 2, 3, 4, 5, 5, 7 , 1, 7};
    myList.Sort();
    for (int i = myList.Count - 1; i > 0; i--)
    {
        if (myList[i] == myList[i - 1])
            myList.RemoveAt(i);
    }
do
    {
        for (int i = 0; i < 5; i++) 
        {
            iNumber = generator.nextInt(9) + 1;
            numbers[i] = iNumber;
        }
    }
    while(numbers[0] == numbers[1] || numbers[0] == numbers[2] || numbers[0] == numbers[3] || numbers[0] == numbers[4] || numbers[1] == numbers[2] || numbers[1] == numbers[3] || numbers[1] == numbers[4] || numbers[2] == numbers[3] || numbers[2] == numbers[4] || numbers[3] == numbers[4]);
/**
 * findDuplicate method return map where key is unique no and value as the
 * repitation
 * 
 * @param a
 *            : arrays of Objects
 * @return map
 */
public Map findDuplicate(T[] a) {
    Map<T, Integer> map = new HashMap<T, Integer>();
    Set<T> unique = new HashSet<T>(Arrays.asList(a));
    int count = 0;
    for (T integer : unique) {
        for (T integer1 : a) {
            if (integer == integer1) {
                ++count;
            }
        }
        map.put(integer, count);
        count = 0;
    }

    return map;
}