Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-附加到文件的ArrayList元素_Java_Loops_Arraylist - Fatal编程技术网

Java-附加到文件的ArrayList元素

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

在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 = 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个位置替换旧的
    列表
  • 如果
    main
    列表的第i个位置不包含
    列表
    ,则创建一个新的
    列表
    ,向其添加块[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 "]