在Java中,我正在从CSV文件中读取数据,例如:
a,b,c,d
hello,hi,hey,
bye,ciao,adios,
z,y,x,w
我想要的是创建一个字符串的数组列表,如:
["a hello bye z", "b hi ciao y", "c hey adios x", "d w"]
该文件非常非结构化,因此每行不具有相同数量的元素。我觉得arrayList是最好的选择。到目前为止,我的伪代码是:
ArrayList<String> list = new ArrayList<String>();
for(each line){
for(int i = 0; i < numberOfElementsInEachLine; i++){
list.add(i, list.get(i) + getLineElement(i));
}
}
实现这一目标的最佳方法是什么?谢谢。
答案 0 :(得分:0)
方法add on List不会替换特定索引处的元素,而是添加一个新元素。 Javadoc for List interface
我建议使用StringBuilder实例和方法追加
答案 1 :(得分:0)
也许你应该改变:
list.add(i, list.get(i) + getLineElement(i));
为:
list.get(i) = "" + list.get(i) + getLineElement(i);
因为arraylist的add()方法会在列表中添加一个新元素。
答案 2 :(得分:0)
基本上,您希望文件的每一列都是一个数组列表。您需要执行以下操作:
List<String>
列表中是否包含List<String>
位置,如果是,则检索List<String>
并将块[ith]添加到其中并将其添加回主列表(在第i个位置替换旧的List<String>
)main
列表在第i个位置不包含List<String>
,则创建一个新的List<String>
,向其添加chunk [i],然后将其添加到主列表中。 将以上内容应用于您的输入
将a,b,c,d
的{{1}}循环添加到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>
并分别用1,2,3和4更新它们,但是,5呢?好的List<List<String>>
在5中不包含List<List<String>>
,因为其他行只有4个块,所以创建一个新的List<String>
并向其添加5,然后将其添加到List<String>
。
以下是实际执行上述操作的示例代码。我假设您想要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>>
从其元素创建一个单字符串,然后用双引号将其后缀。看下面,我使用Java 8的迭代器迭代List<String>
并创建StringBuilder obj。
List<String>
上面会给你
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));