如何从控制台接受用户数据

时间:2015-11-08 18:16:57

标签: java console-application bufferedreader

我的控制台java应用程序生成一个包含一些随机数的3x3矩阵。我想要做的是从集合中删除一些随机数,然后允许用户输入这些数字

enter image description here

到目前为止,我已经尝试了以下内容,但它无效

sidebox <- boxplot(Decreased$Group.1, xlim=c(0,6), ylim=c(0,10), at=1)

sidebox <- boxplot(Unchanged$Group.1, add=TRUE, at=3)

sidebox <- boxplot(Increased$Group.1, add=TRUE, at=5)

修改

我想要发生的是显示的矩阵中缺少一些数字。然后用户将光标放在缺失的位置,然后输入数字

4 个答案:

答案 0 :(得分:3)

在您的代码中,您让用户为显示的每个矩阵数选择多个数字,因此在打印一个数字之前需要多个输入。你想要这样的东西吗?

                /* Printing the Magic matrix */
        System.out.println("The Magic Matrix of size " + n + "x" + n + " is:");
        Random rand = new Random();
        for (i = 0; i < 2; i++) { //lets a user choose 2 numbers to be replaced
            System.out.println("Please input a number: ");
            int randomNum1 = rand.nextInt((n - 1) - 0 + 1) + 0;
            int randomNum2 = rand.nextInt((n - 1) - 0 + 1) + 0;
            BufferedReader dr = new BufferedReader(new InputStreamReader(System.in));
            A[randomNum1][randomNum2] = Integer.parseInt(dr.readLine());
        }

        for (i = 0; i < n; i++) {
            System.out.println("\n");
            for (j = 0; j < n; j++)
                System.out.print(A[i][j] + "\t");
        }
        System.out.println();

    }
}

}

编辑:可能会发生使用此代码将相同的数字替换两次。

答案 1 :(得分:3)

通过代码,除了打印和“渲染”矩阵的方式外,一切似乎都很好。因为循环内的随机值使用5轮循环来遍历表中的每个值,所以随机值的变化是矩阵大小的5倍。这与缓冲区读取的值在输入后保持原位这一事实相结合,使得数组的绘制变得混乱,将输入的值作为单独的线留在您的精细绘制循环中。

            // render 
    drawMatrix(); //draw orginal values
    changeValues(); // change the random values
    drawMatrix(); // draw again to show the new values

}
            public void drawMatrix(){
        /* Printing the Magic matrix */
            System.out.println("The Magic Matrix of size " + n + "x" + n + " is:");
            for (i = 0; i < n; i++) {
                for (j = 0; j < n; j++) {
                // print array current value
                System.out.print(A[i][j] + "\t");
            }
            System.out.println();
            }
        }

        public void changeValues(){
        //remove random element from array (5 times here, 0 to 4)
             Random rand = new Random();   
             for (i = 0; i < 4 ; i++)
             {
                int randomNum1 = rand.nextInt((n-1) - 0 + 1) + 0;
                int randomNum2 = rand.nextInt((n-1) - 0 + 1) + 0;
                BufferedReader dr = new BufferedReader(new InputStreamReader(System.in));
                A[randomNum1][randomNum2] = Integer.parseInt(dr.readLine());
             }
        }

使用这样的东西,你只会改变一次值并在之后绘制新的数组。还绘制了原始数组以进行比较。

  • 请注意,如果使用像我这样的方法,则必须将所需的值传递给函数并使用返回值设置变量或增加它们对整个类范围的可见性,后一种解决方案两个人中的工作更加混乱而且工作量更少。

解决问题的另一种方法是在绘图之前对用户要求的随机矩阵空间进行计算。但是,这还需要您在绘制之前询问用户的值,否则它会将缓冲的阅读器输入留在矩阵中间。

由于输入在命令提示符中的工作方式,似乎是最好的解决方案,永远不要在绘制内容时同时请求值,而是使用某种形式的渲染循环来请求用户输入并执行绘图单独(仍然在渲染中)。例如,在游戏中你可以有一个绘制地图的循环,然后获取用户输入,然后再次相应地将地图绘制到输入。

答案 2 :(得分:3)

答案 3 :(得分:-2)

Scanner in = new Scanner(System.in);

int i = in.nextInt();
String s = in.next();

现在,您可以根据int i和String s的输入操作输出。