2012-10-15 65 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 
      // ..... 
     } 
    } 
相關問題