В принципе, вы хотите, чтобы каждый столбец файла представлял собой список массивов. Вам нужно сделать следующее:
- Создать список списка массива, который пуст изначально
- Открыть файл в режиме чтения
- Читать построчно до не нулевой
- Для каждой строки, разделить его запятой (я предполагаю, что запятая является 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 "]
'list.add (I, list.get (I) + getLineElement (I));' Как вы думаете, эта линия должна делать? – redFIVE