0

よし、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 

問題は、単一の入力に複数の行列が存在する可能性があるため、次の行には、単一の 0 の行に到達するまで、別の int と対応する行列が下にあることです。次に、各行列を上部のサイズと共に渡す必要があります。数値を 2D 配列に追加するメソッドへの BufferedReader として。

入力を分割してメソッドに送信する方法が少しわかりません。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

4 に答える 4

1

BufferedReader.readLineメソッドを使用して、入力を 1 行ずつ読み取ります。

行ごとにString.split、文字列の配列を返すメソッドを使用して分割します。配列のサイズが 1 で、唯一の要素が非ゼロの場合、その数値のサイズで 2 次元配列を初期化します。そして、その配列に残りの行を入力し、配列をメソッドに送信します。別のゼロ以外の単一の整数を見つけた場合は同じプロセスを再度開始するか、0 の場合は終了します。

メソッドを利用してInteger.parseInt、文字列から整数を解析できます。

于 2012-10-15T03:14:27.173 に答える
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
            // .....
        }
    }
于 2012-10-15T03:23:23.910 に答える
0

あなたの投稿に基づいて、サイズは完全に任意のようです。つまり、最初に 2 x 3 行列を入力し、次に 3 x 1 行列を入力します。

この場合、寸法を読み取る必要があります。入力は次の形式で行うことができます

Enter the number of Matrices : 3

First Matrix
Rows :
Columns :
Elements : 

Second Matrix 
Rows : 
Columns :
Elements :

.
.

だからあなたはいつでも読んでください!! google と codechef でパズルを解いたら。同様の状況で、テスト ケースの数を入力としてフィードします。

于 2012-10-15T03:13:08.737 に答える
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変数に基づいて2次元配列を取得してから入力できます(ネストされたforループを使用)。

入力の数は常にわかっているため、配列作成への入力を管理するには、これが最も簡単な方法です。

于 2012-10-15T03:17:45.743 に答える