如何从System.in中分割输入

时间:2012-10-15 03:06:55

标签: java

好吧所以我正在研究从System.in获取输入的内容;第一行是表示矩阵大小的int(n)。接下来的n行是矩阵本身,如下所示:

10
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 0 0 1 0 0 1 1 0
0 1 0 0 0 0 0 1 0 0
0 0 0 0 0 1 1 0 0 0
1 1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 

问题是单个输入中可能有多个矩阵,所以下一行将有另一个int和下面的相应矩阵,直到它遇到一个单一的0。然后我必须传递每个矩阵的大小在顶部作为BufferedReader到一个方法,将数字添加到2D数组。

我只是不确定如何拆分输入并将其发送到方法。是否使用skip()创建一个新的BufferedReader并在每次工作时指定一个大小?我似乎遇到的最大问题是读取大小,但随后大小被排除,因为它已被阅读。

干杯

编辑:使用Bhesh Gurung的方法工作,非常感谢。这就是我最终的结果。我认为一些if语句是多余的但是有效。

BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
ArrayList<GraphAdjMatrix> mat = new ArrayList<GraphAdjMatrix>();
try
    {
        String line = buffer.readLine().trim();
        String[] tokens = line.split("\\s+");
        boolean[][] adj;

        int n = Integer.parseInt(tokens[0]);

        while (n != 0) {
            if (tokens.length == 1 && n > 0) {

                adj = new boolean[n][n];

                for (int i = 0; i < n; i++) {
                    line = buffer.readLine().trim();
                    tokens = line.split("\\s+");
                    if (tokens.length != n)
                    {
                        throw new Error("bad format: adjacency matrix");
                    }

                    for (int j = 0; j < n; j++)
                    {
                        int entry = Integer.parseInt(tokens[j]);
                        adj[i][j] = entry != 0;
                    }
                }
                mat.add(new GraphAdjMatrix(adj, n));
            }
            line = buffer.readLine().trim();
            tokens = line.split("\\s+");
            n = Integer.parseInt(tokens[0]);
        }
    }
    catch (IOException x) { throw new Error("bad input stream"); }          

4 个答案:

答案 0 :(得分:1)

使用BufferedReader.readLine方法逐行阅读输入。

对于每一行,使用String.split方法将其拆分,该方法返回一个字符串数组。如果数组的大小为1且唯一元素为非零,则初始化具有该数字大小的二维数组。并使用其余行填充该数组,并将该数组发送到该方法。当您找到另一个非零单个整数时再次启动相同的过程,或者当它为0时再次退出。

您可以使用Integer.parseInt方法解析字符串中的整数。

答案 1 :(得分:0)

基于你的帖子,看起来大小绝对是随意的。即首先你要输入2 x 3矩阵然后输入3 x 1矩阵。

在这种情况下,您需要阅读尺寸。您的输入可以采用这种格式

Enter the number of Matrices : 3

First Matrix
Rows :
Columns :
Elements : 

Second Matrix 
Rows : 
Columns :
Elements :

.
.

所以你读的时间和时间!! 如果你在谷歌和codechef中采取谜题。您将遇到类似的情况,您将输入测试用例的数量作为输入。

答案 2 :(得分:0)

我相信你只需要使用while循环来处理传入数组的大小。

你甚至可以获得数组的大小并使用while循环条件中的整数。

        Scanner sc = new Scanner(System.in);
    int x;
    while((x = sc.nextInt()) != 0){
        for (int i = 0; i < x; i++){
            System.out.println("do this " + x + " times");
        }
    }

希望这有帮助。

编辑: 这可能不够清楚..在你的while循环中,然后你可以根据你的x变量填充一个二维数组(使用嵌套的for循环)。

由于输入的数量始终是已知的,因此这应该是管理数组创建输入的最简单方法。

答案 3 :(得分:0)

您是否尝试通过用户做出正确的条目来实现这样的目标?

    Scanner sc= new Scanner(System.in);
    int[][] matrix = new int[1][1];
    int size = 0;

    String inputString = null;
    while(!"0".equals((inputString = sc.nextLine()))){
        String[] elements = inputString.split(" ");
        if(elements.length == 1){
            //this is size entry
            size = Integer.parseInt(elements[0]);
            matrix = new int[size][size];
        }else{
            for(int i=0; i< size; i++){
                inputString = sc.nextLine();
                elements = inputString.split(" ");
                for(int j=0; j<elements.length; j++){
                    matrix[i][j] = Integer.parseInt(elements[j]);
                }
            }
            //pass your size and matrix to other class/method
            // .....
        }
    }