Java-附加到文件的ArrayList元素
在Java中,我从CSV文件读取数据,例如:Java-附加到文件的ArrayList元素,java,loops,arraylist,Java,Loops,Arraylist,在Java中,我从CSV文件读取数据,例如: 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是最好的选择。到目前为止,我的伪代码是: ArrayList<String> list = ne
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是最好的选择。到目前为止,我的伪代码是:
ArrayList<String> list = new ArrayList<String>();
for(each line){
for(int i = 0; i < numberOfElementsInEachLine; i++){
list.add(i, list.get(i) + getLineElement(i));
}
}
ArrayList list=new ArrayList();
(每行){
对于(int i=0;i
实现这一目标的最佳方式是什么?谢谢。方法加载项列表不会替换特定索引处的元素,而是添加一个新的元素。
我建议使用StringBuilder实例和方法append也许您应该更改:
list.add(i, list.get(i) + getLineElement(i));
致:
因为arraylist的add()方法将向列表中添加新元素。基本上,您希望文件的每一列都是一个数组列表。您需要执行以下操作:
- 创建最初为空的数组列表列表
- 以读取模式打开文件
- 逐行读取,直到不为空
- 对于每一行,用逗号分隔(我假设逗号是分隔符)
- 循环使用逗号分隔的块
- 如果发现空值,则跳过它
- 检查
的列表是否在第i个位置包含列表
,如果是,则检索该列表
,并将块[ith]添加到其中,并将其添加回主列表(在第i个位置替换旧的列表
)列表
- 如果
列表的第i个位置不包含main
,则创建一个新的列表
,向其添加块[i],然后将其添加到主列表李>列表
a、b、c、d
循环List
将被添加到List
结构中,每个结构分别包含a、b、c和d
循环第二行hello,hi和hey
前三个列表将从List
结构中检索并再次更新和存储
假设您的第三行包含1,2,3,4,5
(比上述两行多一行)。循环将从List
中找到4个List
,并分别用1、2、3和4更新它们,但是,5个呢?因为其他行只有4个区块,所以列表
在5中不包含列表
,所以创建一个新的列表
,并将其添加到列表
下面是一个示例代码,它实际上实现了我上面描述的功能。我假设您想要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);
}
如果您希望获得问题中所示的精确输出,那么您可以遍历列表
,并获取每个列表
,使用双引号从其元素前后创建一个字符串。如下所示,我使用Java8的迭代器迭代List
并创建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));
list.add(i,list.get(i)+getLineElement(i))代码>你认为这行应该做什么?我甚至可以在两个循环的第一次迭代中使用list.get(I)吗?它不是返回空值吗?如果列表的第i个位置没有任何内容,那么您将获得用于执行列表的IndexOutOfBoundException。get(i),请参阅此处的文档
[[a, hello, bye, z], [b, hi, ciao, y], [c, hey, adios, x], [d, w]]
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 "]