2015-12-07 2 views
0

В Java, я читаю данные из CSV файла, такие как:Java - добавление к ArrayList элементов из файла

a,b,c,d 
hello,hi,hey, 
bye,ciao,adios, 
z,y,x,w 

То, что я хочу, чтобы создать ArrayList цепочек, таких как:

["a hello bye z", "b hi ciao y", "c hey adios x", "d w"] 

Файл очень неструктурирован, поэтому каждая строка не имеет одинакового количества элементов. Я чувствую ArrayList будет лучшим option.My псевдокод до сих пор есть:

ArrayList<String> list = new ArrayList<String>();  

     for(each line){ 

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

       list.add(i, list.get(i) + getLineElement(i)); 
      } 
     } 

Что является лучшим способом для достижения этой цели? Спасибо.

+1

'list.add (I, list.get (I) + getLineElement (I));' Как вы думаете, эта линия должна делать? – redFIVE

ответ

0

Метод add on List не заменяет элемент по определенному индексу, а добавляет новый. Javadoc for List interface

Я предлагаю использовать StringBuilder экземпляр и метод добавления

0

Может быть, вы должны изменить:

list.add(i, list.get(i) + getLineElement(i)); 

к:

list.get(i) = "" + list.get(i) + getLineElement(i); 

Поскольку метод Add() из ArrayList добавит новый элемент в список.

+0

Могу ли я использовать list.get (i) в первой итерации обоих циклов? Разве это не возвращает NULL? – pseudorandom

+0

Если в i-й позиции списка ничего нет, вы получите ** IndexOutOfBoundException ** для выполнения list.get (i), см. Здесь документы https://docs.oracle.com/javase/7/docs/api/ Java/Util/ArrayList.html # прибудет (INT) – Raf

0

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

  • Создать список списка массива, который пуст изначально
  • Открыть файл в режиме чтения
  • Читать построчно до не нулевой
  • Для каждой строки, разделить его запятой (я предполагаю, что запятая является Seperator)
  • Loop через куски разделенных запятой
  • Если пустое значение найдено, то пропустите его
  • Проверьте, если список List<String> содержит в месте ITH List<String>, если да, то получить, что List<String> и добавить куски [Ith] к нему и добавить его к основному списку (в положении -й замене старого List<String>) список
  • If main не содержат List<String> в i-й позиции, затем создайте новый List<String>, добавьте chunk [i], а затем добавьте его в основной список.

Применяя выше к введенному

Перебор a,b,c,d для List<String> добавляют к List<List<String>> структуре каждый из которых содержит a,b,c and d соответственно.

Цитирование по второй линии hello, hi and hey Первые три списка извлекаются из List<List<String>> и обновляются и сохраняются снова.

Предположим, что ваша третья строка содержит 1,2,3,4,5 (еще одна над двумя строками).Петля найдет 4 List<String> от List<List<String>> и обновит их с 1,2,3 и 4 соответственно, но, а что примерно 5? Ну List<List<String>> не содержит List<String> в 5, потому что другие линии были только 4 куска, поэтому создайте новый List<String> и добавьте 5 к нему, а затем добавьте его в List<List<String>>.

Вот пример кода, который фактически выполняет то, что я описал выше. Я предполагаю, что вы хотели что-то в строке ArrayList.

//list that stores list of strings 
     List<List<String>> list = new ArrayList<List<String>>(); 
     try { 
      //open file in read mode, change the file location 
      BufferedReader br = new BufferedReader(new FileReader("C:\\test_java\\content.txt")); 
      String line = ""; 
      //read each line as long as line != null which indicates end of file 
      while((line=br.readLine()) != null) { 
       //split the line into chunks using comma as seperator 
       String[] chunks = line.split(","); 
       //loop through chunks of vlaues 
       for(int i = 0; i < chunks.length; i++) { 
        //if chunks[i] is not empty 
        if(chunks[i].trim().length() > 0) { 
         //there is a List<String> in list.get(i) so get the List<String> update it and put it back 
         if(list.size() > i) { 
          List<String> temp = list.get(i); 
          temp.add(chunks[i]); 
          list.remove(i); 
          list.add(i, temp); 
         } else { 
          //there was no list in list.get(i) so create a new List<String> and add it there 
          List<String> temp = new ArrayList<String>(); 
          temp.add(chunks[i]); 
          list.add(temp); 
         } 
        } 
       } 
      } 
      //close read stream 
      br.close(); 
     } catch(Exception e){ 
      e.printStackTrace(System.out); 
     } 

     //print the list 
     for(List<String> l: list) { 
      System.out.println(l); 
     } 

Вывод входного файла вы указали в вопросе

[[a, hello, bye, z], [b, hi, ciao, y], [c, hey, adios, x], [d, w]] 

Если вы хотите, чтобы получить точный результат, как показано в этом вопросе, то вы можете перебирать List<List<String>> и принимать каждый List<String> создать опалить string из его элементов pre и postfixing его с двойной цитатой. См. Ниже, я использовал итератор Java 8 для итерации через List<String> и создания объекта StringBuilder obj.

String[] s = new String[list.size()]; 
int i = 0; 
for(List<String> l: list) { 
    StringBuilder b = new StringBuilder("\""); 
    //java 8 loop through list and for each element add it to StrinbBuilder obj 
    l.stream().forEach(e -> b.append(e + " ")); 
    b.append("\""); 
    s[i++] = b.toString(); 
} 
System.out.println(Arrays.toString(s)); 

Выше даст вам

["a hello bye z ", "b hi ciao y ", "c hey adios x ", "d w "] 
Смежные вопросы