2013-03-10 104 views
1

我對Java中的ArrayLists沒有太多的知識。我需要針對以下問題的解決方案:如何製作2D矩陣的列的數組[]。所述inputfile中是:將二維矩陣轉換爲字符串列(java)

VGV VV GVVV
EFV VF EVEV
VVV VV VVVV
AAV VA GVAD
VDV VD EVVV
AVV VV VVAV

和用於字符串數組liner所需的格式(見下文):

{「VEVAVA」,「GFVADV」,「VVVVVV」,「VVVFVVVAVDVV」,「GEVGEV」,「VVVVVV」,「VEVAVA」,「VVVDVV」}

我的代碼是:

ArrayList<String[]> mat = new ArrayList<String[]>(); 


Scanner scan = new Scanner(new File("internal2")); 
String[] liner = new String[m]; 
while (scan.hasNextLine()) { 

    Scanner colReader2 = new Scanner(scan.nextLine()); 
    while(colReader2.hasNext()) 
    { 
     for(int i = 0; i<m; i++) { 
      liner[i] = colReader2.next(); 
//System.out.println(liner[i]); 
      mat.add(liner); 
      } 

    } 
//  scan.nextLine(); 
} 

這樣做的目的是我想在liner搜索這些字符串。現在該程序似乎只給liner像這樣: {「A」,「V」,「V」,「VV」,「V」,「V」,「A」,「V」} 這是最後一個輸入文件的行。我希望你能幫助我。

編輯

我的代碼繼續:

Pattern pattern = Pattern.compile("[A-G]+"); 
Pattern pattern2 = Pattern.compile("[V]+"); 

String[][] matrix4 = mat.toArray(new String[n][m]); 

for (int i = 0; i < m; i++) { 

    StringBuffer sf = new StringBuffer(); 
    for (int j = 0; j < n; j++) { 
     sf.append(matrix4[j][i]); 

    } 

    Matcher matcher = pattern.matcher(sf.toString()); 
    Matcher matcher2 = pattern2.matcher(sf.toString()); 

    if (matcher.find()) { 
     System.out.println("R"); 
    } else if (matcher2.matches()) { 
     System.out.println("Q"); 
    } 

} 

所以對於liner含有至少1個occurence的A-G一個R具有要被打印的columnstring。而對於僅包含V的列串,它必須打印Q。輸出然後應該是:

R 
R 
Q 
R 
R 
Q 
R 
R 

但這不是我得到的。你們中有人知道我做錯了什麼嗎?

解決:

我不得不用Arrays.fill(liner, "");

+0

什麼* *你怎麼辦? – 2013-03-10 22:05:07

+0

我得到的是:R R R R R R – user1189952 2013-03-10 23:02:09

回答

0

Scanner.next()得到null出去了襯墊的僅掃描字符,直到下一個空格。如果你想掃描整行使用Scanner.nextLine(),這應該給你"V G V VV G V V V"。要刪除字符之間的空格,請使用String.replaceAll("\s", "")

更新:對不起,我誤解了你的問題。

爲了讓您所需的輸出,改變liner[i] = colReader2.next()liner[i] += colReader2.next()

這應該附加一個字符數組項而不是替換它。

更新#2:我測試了你的代碼片段並發現了一些問題。

  • liner[i]沒有被初始化爲空字符串導致輸出nullVEVAVA等等...我沒有檢查那個,對不起。
  • 你不需要使用兩個掃描儀,一個就足夠了。
  • mat.add(liner)只增加了引用您的陣列,因此,如果您更改了陣列,這些變化也將是可見的ArrayList中一般
  • ,倒不如先分析輸入文件和然後創建數組,因爲你不需要知道尺寸
  • 假設你想要一個ArrayList中的一列字符串(我假設它沒有鋸齒)輸入,這應該這樣做(至少,至少它給我所需的輸出):

    ArrayList<String[]> input = new ArrayList<String[]>(); 
    
    Scanner sc = new Scanner(new File("input")); 
    
    // read the input 
    while (sc.hasNextLine()) { 
        input.add(sc.nextLine().split("\\s")); 
    } 
    
    sc.close(); 
    
    // this only works if your input isn't jagged! 
    String[][] mat = new String[input.get(0).length][]; 
    
    // transform your matrix from [line][column] to [column][line] 
    for (int i = 0; i < input.size(); i++) { 
        for (int j = 0; j < input.get(i).length; j++) { 
         if (mat[j] == null) { 
          mat[j] = new String[input.size()]; 
         } 
         if (mat[j][i] == null) { 
          mat[j][i] = ""; 
         } 
         mat[j][i] += input.get(i)[j]; 
        } 
    } 
    
    Pattern pattern = Pattern.compile("[A-G]+"); 
    Pattern pattern2 = Pattern.compile("[V]+"); 
    
    for (int i = 0; i < mat.length; i++) { 
        StringBuilder sb = new StringBuilder(); 
        for (int j = 0; j < mat[i].length; j++) { 
         sb.append(mat[i][j]); 
        } 
    
        Matcher matcher = pattern.matcher(sb.toString()); 
        Matcher matcher2 = pattern2.matcher(sb.toString()); 
    
        if (matcher.find()) { 
         System.out.println("R"); 
        } else if (matcher2.matches()) { 
         System.out.println("Q"); 
        } 
    } 
    

如果這仍然沒有幫助,我很抱歉,但我的時間和你一樣珍貴,我相信你可以通過做一些體面的研究來解決很多問題。但是,如果你得到確實是卡住了,就回過頭再問一個問題,我們會很樂意幫助你;)

+0

謝謝你的回答。我編輯了我的問題,請檢查並進一步幫助我。 – user1189952 2013-03-10 22:00:24

+0

你的'班輪'看起來像什麼?也請張貼您的實際輸出,而不僅僅是期望的。並且(對於你的下一個問題)在你的工作完成之前不要改變你的問題,而是打開一個新的問題,如果你再次陷入困境。 – Griddo 2013-03-11 06:57:41

+0

內膽打印:nullVEVAVA nullVFVADV nullVVVVVV nullVVVFVVVAVDVV nullVEVGEV nullVVVVVV nullVEVAVA nullVVVDVV – user1189952 2013-03-11 12:12:51

0

在數組列表中使用一個StringBuilder並追加到它。我猜在開始接受值之前,矩陣的大小是已知的?不知道你是從期待

List<StringBuilder[]> mat = new ArrayList<StringBuilder[]>();//better to declare as list, array list is 1 implementation 


Scanner scan = new Scanner(new File("internal2")); 
int col = 0;  
while (scan.hasNextLine()) { 
    col = 0; 
    Scanner colReader2 = new Scanner(scan.nextLine()); 
    while(colReader2.hasNext()) 
    { 

     if(mat.size() < (col + 1)){ 
      mat.add(new StringBuilder()); 
     } 
     //mat.get(col).substring(mat.get(col).length() - 1); 
     mat.get(col).append(colReader2.next()) 
     } 

} 
//  scan.nextLine(); 

}