尝试在不重复数字的情况下打印数组

Trying to Print Array without Repeating Numbers

我有一个编程任务,我的任务是:

我正在使用两个 int 值(x 和 y)并创建两个不同的数组:第一个(大小为 x)将打印一个从 x 开始并递减到 1 的数组。第二个(大小为 y)将随机生成从第一个数组(大小 x)中提取值并将其存储在自己的数组中。然后我将打印出第二个数组。但是,第二个数组不能有任何重复值。例如,如果数组的大小为 10,则在其 10 个单独的索引中不能有两个相同的数字。我试图通过创建两个数组将唯一元素存储在我的第二个数组中,一个布尔值用于检查唯一元素,另一个用于存储这些唯一元素。这是我的代码:

/*
* user will enter desired size x for first array labeled arr_1
* arr_1 will contain values descending from x down to 1
* user will enter desired size y for second array labeled arr_2
* arr_2 will contain random values taken from arr_1 w/o repeating numbers
*/

import java.util.Arrays;
// import java.util.Arrays;
import java.util.Random;
// import java.util.Scanner;
public class Prog1B  
{
    public static void main(String[] args)
    {
        System.out.println("Program 1B, Christopher Moussa, masc1574");
        // Scanner scnr = new Scanner(System.in); 
        int x = 20;
        int v = x;
        int[] arr_1 = new int[x];

        for (int i = x-1; i >= 0; i--)
        {
            arr_1[i] = v;   // System.out.print(i+1 + " "); prints 20, 19, ... , 1
            v--;            // System.out.print(arr_1[i] + " "); prints 20, 19, ... , 1
        }
        // int[] b = unique(arr_1);
        System.out.println(Arrays.toString(unique(arr_1)));
    }

    public static int[] unique (int[] n)
    {
        boolean[] seen = new boolean[n.length];
        int[] unique = new int[n.length];
        Random rand = new Random(123L);
        for (int i = 0; i < n.length; i++)
        {
            int index = rand.nextInt(n.length);
            while (seen[index])
            {
                index = rand.nextInt(n.length);
            }
            unique[i] = n[index];
        }
        return unique;
    }



}

代码编译并运行,但它仍然打印出一个包含重复值的数组。我正在尝试编写程序,以便它不会打印出具有重复值的数组,只有唯一值。您对问题出在哪里有什么建议吗?我很确定它位于 "unique" 方法中,更具体地说,当布尔数组正在检查唯一值时(我在尝试调试时注意到,即使它生成的随机索引不是唯一的,它仍然跳过了 while条件并打印出来)。我是一名初级程序员(圣地亚哥州立大学计算机科学专业的新生),任何 feedback/advice 都将不胜感激。非常感谢你。

除非您特别需要这样做,否则我建议您退后一步,尝试一种完全不同的方法,例如:

Set<int> mySet = new HashSet<int>(Arrays.asList(someArray));

注意:您需要将 unique() 的 return 类型调整为 Set

其余的实现留作 reader 的练习。基本上你把数组转换成一个集合,如上面的例子。

(Credit where credit is due)

我只是想根据 https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions

引导您朝着正确的方向前进

祝你好运,我想说这里最大的教训是如何在存在更好的解决方案时摆脱效率低下的代码。祝你好运!

你甚至需要设置你的数组 seen[index] = true;

public static int[] unique (int[] n)
    {
        boolean[] seen = new boolean[n.length];
        int[] unique = new int[n.length];
        Random rand = new Random(123L);
        for (int i = 0; i < n.length; i++)
        {
            int index = rand.nextInt(n.length);
            while (seen[index])
            {
                index = rand.nextInt(n.length);
            }
            unique[i] = n[index];
            seen[index] = true;
        }
        return unique;
    }

我在您的代码中发现了问题。您永远不会更新 "seen" 布尔数组。请参阅下面的代码进行修复:

public static int[] unique (int[] n){
 boolean[] seen = new boolean[n.length];
 int[] unique = new int[n.length];
 Random rand = new Random(123L);
 for (int i = 0; i < n.length; i++)
 {
     int index = rand.nextInt(n.length);
     while (seen[index])
     {
         index = rand.nextInt(n.length);
     }
     seen[index] = true; //boolean array updated
     unique[i] = n[index];
 }
 return unique;

}

使用此修复程序,我能够获得以下输出(没有重复):

[3, 11, 17, 10, 16, 18, 15, 6, 14, 20, 7, 13, 1, 19, 9, 2, 5, 4, 12, 8]

这是使用 java8 lambdas

执行此操作的方法
    ArrayList<Integer> arrayli = new ArrayList<Integer>(Arrays.asList(arr_1));//converted array to list
    System.out.println();
    List<Integer> distinctIntegers = arrayli.stream().
    .distinct()
    .boxed()
    .collect(Collectors.toList());
 distinctIntegers.foreach(System.out::println);