2012-10-15 35 views
0

好的,我正在从事System.in输入的工作;第一行是一个代表矩阵大小的int(n)。下一个n行是基体本身像这样:如何分割来自System.in的输入

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传递给一个将数字添加到二维数组的方法。

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

干杯

编辑:得到它的工作使用Bhesh古隆的方法,由于一吨。这是我结束了。我认为一些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"); }   
+1

请提供您在尝试解决此问题时实施的示例代码。 –

回答

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中使用拼图。您将会遇到类似的情况,您将输入测试用例的数量。

+0

对不起,我应该提到在阅读输入之前我不知道矩阵的数量或它们的大小。 – zzaw

+0

在这种情况下,你必须阅读它!或者,如果您不想修复大小,则可以通过读取ODD字符或字符串来识别矩阵的末端,如“结束”。所以,当你的系统读取“结束”。它假定矩阵已经结束,你可以开始阅读另一个矩阵。以同样的方式,阅读“完成”了解,所有矩阵输入都结束了! – madhairsilence

1

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

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

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

+0

我会给这个去,谢谢。 – zzaw

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变量的2d数组(使用嵌套for循环)。

因为输入的数量总是已知的,所以这应该是管理数组创建输入的最简单方法。

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 
      // ..... 
     } 
    } 
相关问题