检查数组是否有唯一数字并循环返回

时间:2011-11-29 00:49:38

标签: java arrays validation loops

我目前正在尝试编写一个程序,要求用户输入一个三位数字,然后根据计算机生成的随机3位数字进行检查。用户输入的数字必须有三个唯一的数字,因为计算机编号也有三个唯一的数字。 到目前为止,我已经设法将用户的三位数字放入一个阵列中,每个阵列位置都有一位数,但我无法正确验证它。它能够识别两个相同的数字,因此它需要向用户询问具有3个不同数字的新数字(即循环回到开始),直到用户遵守为止。 System.out.println只是为了检查它是否正在挑选两位数。到目前为止,这是我的代码。这是一种方法,而不是整个程序。

public static int[] getUserNumberDebugMode(String compNum){
    final int RANDOM_NUMBER_SIZE = 3;
    int[]userNumber = new int [RANDOM_NUMBER_SIZE];

    String userGuessAsString;

    userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number.");
    int number = Integer.parseInt(userGuessAsString);

    // put three digit number individually into array
    for(int loop = (userNumber.length - 1); loop>=0; loop--){
        userNumber[loop]= number%10;
        number = number/10;
    } // end userNumber array populating

    for (int outerloop = 0; outerloop < userNumber.length; outerloop++){
        for (int innerloop = outerloop - 1; innerloop > -1; innerloop --){
            while (userNumber[outerloop] == userNumber [innerloop]){
            System.out.println("user compare: " + outerloop + " with: " + innerloop);
            } // end while loop
        }// end inner loop
    } // end outer loop

    return userNumber;
} // end getUserNumberDebugMode

4 个答案:

答案 0 :(得分:2)

通过计算一个唯一的数字来解决问题,检查是否有任何数字匹配,然后将整个事物放入do / while循环中,同时进行唯一数字检查&gt; 0.我确定不是最优雅的解决方案,但它确实有效。

do{
        uniqueCheck = 0;
        userGuessAsString = JOptionPane.showInputDialog(compNum + "\n Please enter a number.");
    int number = Integer.parseInt(userGuessAsString);

    // put three digit number individually into array
    for(int loop = (userNumber.length - 1); loop>=0; loop--){
        userNumber[loop]= number%10;
        number = number/10;
    } // end userNumber array populating

    for (int loop = 0; loop < userNumber.length; loop++){
        for(int innerLoop  = 0; innerLoop < userNumber.length; innerLoop++) {
            if(loop != innerLoop) {
                if (userNumber[loop] == userNumber[innerLoop] ){
                    JOptionPane.showMessageDialog(null, "Please enter three unique digits!", "ERROR", JOptionPane.ERROR_MESSAGE);
                    uniqueCheck ++;
                } //  end inner IF loop
            } // end outer IF loop
        } // end inner for loop
    } // end outer for loop

    } while (uniqueCheck > 0);

答案 1 :(得分:1)

我没有通过该程序,因为它看起来有点复杂,你想要实现的目标。要确保用户输入包含3个唯一数字的数字,请尝试以下算法:

  1. 拆分用户输入的字符串中的字符。
  2. 将每个字符转换为整数并将其放入Set中。
  3. 将其添加到Set中时,请确保set.add()返回true。
  4. 如果没有,则数字不是唯一的,您可以抛出错误并再次从用户处获取数据。
  5. 请继续与计算机生成的数字进行比较。
  6. 更简单,而不是循环。

答案 2 :(得分:0)

好吧,你可能不希望那个最里面的“while”循环,因为只要你得到一个匹配的值,它就会永远运行。

但是,关于您的outerloop和innerloop值,第一次检查userNumber时,outerloop将为0innerloop将为-1。可能不是你想要的。为了使循环逻辑正确,只需逐步执行每行代码,确定每个步骤的每个变量(或在调试器中执行此操作)。这应该可以帮助你纠正你的逻辑。

答案 3 :(得分:0)

作为家庭作业的帮助,我会建议你以错误的方式看待这个问题。请记住,当O(n)解决方案可用时,方法中的错误可能导致三重嵌套循环和O(n ^ 2)或更糟。

听起来你不是在寻找一个3位数字,你正在寻找3位数 - 这些是非常不同的东西 - 如果顺序无关紧要,那么这个事实对你有用。如果您只是在寻找X数字并在第一个之后验证每个数字,并且它没有被看到超过N次(这里N = 0),那么您选择了错误的东西来制作数组。 / p>

您应该能够在没有嵌套循环的情况下执行此操作。如果你小心我相信你应该只用一个循环(假设数组初始化为理想的东西或者你可以检查是否初始化了单元格)。如果你只是更聪明一点,你可以为下一个问题正确地解决这个问题,包括10个唯一的数字,或者数字不超过3次,或者扩展到包括字母。

换句话说,你是否正在对此进行冒泡排序?要确定之前是否已经看到位置Y的值,您是否在位置0到Y-1之间进行迭代?你是否通过0到Y来重复在Y + 1的位置?