2013-03-10 3 views
1

У меня нет знаний о ArrayLists в java. Мне нужно решение для следующей проблемы: как сделать массив [] столбцов 2D-матрицы. Входной_файл является:Преобразование 2D-матрицы в stringarray столбцов (java)

VGV В.В. GVVV
ЭТС В.Ф. EVEV
VVV В.В. VVVV
ААВ В.А. GVAD
VDV В.Д. EVVV
АВВ В.В. VVAV

и желаемый формат для StringArray 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"); 
    } 

} 

Так что для columnstring в liner, содержащей по меньшей мере 1 вхождение A-GR должен быть напечатан. И для столбца columnstring, содержащего только V, он должен печатать Q. Выходные данные должны быть:

R 
R 
Q 
R 
R 
Q 
R 
R 

Но это не то, что я получаю. Кто-нибудь из вас знает, что я делаю неправильно?

Решено:

я должен был получить null сек выхода из гильзы с помощью Arrays.fill(liner, "");

+0

Что * сделать * вы получите? –

+0

Что я понимаю: R R R R R R – user1189952

ответ

0

Scanner.next() только просканирует символов до следующего пробела. Если вы хотите отсканировать всю строку, используйте 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

+0

Как выглядит ваш «подкладка»? Пожалуйста, также опубликуйте свой фактический результат, а не только желаемый. И (для вашего следующего вопроса) не изменяйте свой вопрос, пока ваша работа не будет выполнена, а скорее откроет новую, если вы снова застрянете. – Griddo

+0

лайнер печатает: nullVEVAVA nullVFVADV nullVVVVVV nullVVVFVVVAVDVV nullVEVGEV nullVVVVVV nullVEVAVA nullVVVDVV – user1189952

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(); 

}

Смежные вопросы