2016-04-19 2 views
1

После некоторого усилия (я новичок) мне удалось создать метод, который читает текстовый файл и помещает его в многомерный массив. Однако размер массива жестко закодирован, и он не имеет отношения к пустым строкам очень хорошо, поэтому у меня есть следующие вопросы:Как сделать размер массива зависимым от размера текстового файла?

1) Как определить, что мой массив равен размеру текстового файла?

2) Есть ли простой способ обработки пустой строки? В идеале я хотел бы просто удалить любые пробелы из текстового файла, чтобы массив не содержал нулевых значений, но я открыт для предложений по наилучшему способу его обработки.

Вот то, что я до сих пор:

public void TextFileReader(){ 

     String[][] textFileData = new String[5][2]; 

     InputStreamReader InputSR = null; 
     BufferedReader BufferedRdr = null; 
     String thisLine = null; 

     InputSR = new InputStreamReader(getResources().openRawResource(R.raw.text_file)); 
     BufferedRdr = new BufferedReader(InputSR); 

     try { 
      // open input stream text_file for reading purpose. 
      int i = 0; 
      while ((thisLine = BufferedRdr.readLine()) != null) { 
       String[] parts = thisLine.split(" "); 
       textFileData[i][0] = parts[0]; 
       textFileData[i][1] = parts[1]; 
       Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0])); 
       Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1])); 
       i = i +1; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 
+0

Почему бы не использовать что-то вроде динамического [ArrayList] (https://docs.oracle.com/javase/7/docs/api/java/ util/ArrayList.html), где вам не нужно беспокоиться о знании размера заранее? Если вы * имеете *, чтобы использовать массив, я предлагаю подсчитать количество строк, сначала итерации по файлу. – robotlos

+0

Нет Мне не нужно использовать массив, но я не думал, что ArrayList может быть многомерным arraylist? Наверное, я мог бы просто использовать два ArrayLists? – Airfix

+0

вы можете иметь массив массивов ArrayList. – robotlos

ответ

1

Как я уже сказал в своем комментарии, используя ArrayList в этой ситуации делает вещи намного проще, так как вам не придется беспокоиться о том, зная размер, прежде чем руки. Вы можете реализовать его следующим образом:

ArrayList<String[]> arrayList = new ArrayList<>(); 
try { 
    // open input stream text_file for reading purpose. 
    while ((thisLine = BufferedRdr.readLine()) != null) { 
     if (!thisLine.isEmpty()) { 
      String[] parts = thisLine.split(" "); 
      arrayList.add(parts); 
     } 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Обратите внимание, что я добавил следующее условие:

if (!thisLine.isEmpty()) { 

это делает его таким образом, что пустые строки пропускаются и не добавляются в ArrayList.


Вы можете просмотреть содержимое вашей ArrayList итерируя через него так же, как вы бы массив:

for (String[] row : arrayList) { 
    System.out.println(Arrays.toString(row)); 
} 

Или вот так:

for (int i = 0; i < arrayList.size(); i++) { 
    System.out.println(Arrays.toString(arrayList.get(i))); 
} 

Я сделал фиктивный файл со следующими данными:

line one 

line two 

line three 

Обратите внимание на пустые строки между каждой строкой. Печать содержимого ArrayList привело:

[line, one] 
[line, two] 
[line, three] 

Если вы действительно хотите использовать двойной массив, можно перебрать файл первого и подсчитать, сколько непустых строк у вас есть так же, как вы делаете это уже (с добавлением if (!thisLine.isEmpty()) {), а затем измерьте массив таким образом.


EDIT
Использование ArrayList, если вы хотите, чтобы получить строку 2, столбец 2, вы могли бы сделать это как так (имейте в виду массивы начинаются с индекса 0):

String[] row = arrayList.get(1); 

Выберете нужный вам номер

String value = row[1]; 

Будет захвачен столбец строки, которую вы хотите.

Печать value с System.out.println(value); выходами в:

два

Или вы могли бы просто сделать это в одной строке:

String value = arrayList.get(1)[1]; 

Или еще лучше, вы может создать метод, чтобы вы могли его вызвать в любое время:

public static String getValue(ArrayList<String[]> arrayList, int row, int column) { 
    return arrayList.get(row)[column]; 
} 

Что вы можете назвать так:

String value = getValue(arrayList, 1, 1); 
+0

Итак, если бы я хотел ссылаться на слово (два) на строка 2 во втором столбце могла бы я сделать это в ArrayList? Я полагаю, вместо того, чтобы анализировать данные в 2 столбца, как я делал раньше, и ссылаясь на индексный индекс массива, я мог просто проанализировать строку ArrayList на 2 столбца в то время – Airfix

+0

@Airfix, см. мое правое правое выше, объясняя, как это сделать. – robotlos

+1

спасибо за действительно подробный ответ. Именно это я и ищу, и деталь помогла мне стать новичком. arrayList намного эффективнее, чем Сначала я подумал. Большое спасибо за помощь. – Airfix

1

Есть ли конкретная причина, почему вы должны использовать массив? Массивы обычно являются плохой практикой по этой точной причине: у них есть статический размер, который необходимо изменить вручную, чтобы избежать перетока. На практике почти никто не использует массивы, если это не требуется.

Лучшим подходом является просмотр других контейнеров, которые изменяют их размер динамически, например, Arraylist. Вы должны иметь возможность создавать Arraylist of Arraylists, который имеет тот же эффект, но не предлагает ограничения массива.

Когда кодирование обычно пытается не изобретать колесо, просто используйте собственные библиотеки и их функции, чтобы делать то, что вы хотите, чтобы они делали.

Что касается пустой строки, я бы предположил, что когда пустая строка происходит, строка заполняется как пустая, так что в этом случае вам просто нужно проверить, пуста ли строка, а затем заполнить контейнер в зависимости от того, какой вы считаете нужным в этом случае, или, как предлагает плакат ниже, не заполнять контейнер вообще.

+0

ArrayList поддерживается массивом –

+0

Никакой особой причины в использовании массива, а не у arraylist, кроме меня, недостаточно умен, чтобы понять, что может сделать для меня аррайалист. Я пошел по пути массива, потому что думал, что мне нужен многомерный массив. Я думаю, я мог бы просто сделать 2 arraylists (по одному для каждого измерения моего массива. Я не совсем уверен, что вы имеете в виду под маркетом arraylists? Можете ли вы немного уточнить? – Airfix

2

Для проблемы с размером массива я рекомендую использовать ArrayList, потому что он динамически распределен, поэтому вам не нужно определять размер, иначе вам нужно будет рассчитать, сколько строк и сколько слов в файле. Для пустой строки просто скакать на нем:

while ((thisLine = BufferedRdr.readLine()) != null) { 
    if(!thisLine.trim().equals("")){ 
      String[] parts = thisLine.split(" "); 
      textFileData[i][0] = parts[0]; 
      textFileData[i][1] = parts[1]; 
      Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0])); 
      Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1])); 
      i = i +1; 
    } 
} 
Смежные вопросы