Java - 附加到文件的ArrayList元素

时间:2015-12-07 22:57:31

标签: java loops arraylist

在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));
            }
         }

实现这一目标的最佳方法是什么?谢谢。

3 个答案:

答案 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));