使用Java列表中的列表

50 java arrays list

我正在尝试将CS​​V文件读入列表(字符串)列表中,传递它以从数据库中获取一些数据,构建新数据列表列表,然后传递列表列表以便它可以是写入新的CSV文件.我看了一遍,似乎无法找到如何做到这一点的例子.

我宁愿不使用简单的数组,因为文件的大小会有所不同,我不知道如何使用数组的维度.我没有处理文件的问题.我只是不确定如何处理列表列表.

我发现的大多数示例都将创建多维数组或在循环内执行从文件中读取数据的操作.我知道我可以这样做,但我想编写面向对象的代码.如果您可以提供一些示例代码或指向我的参考,那将是很好的.

tst*_*ter 131

ArrayList<ArrayList<String>> listOLists = new ArrayList<ArrayList<String>>();
ArrayList<String> singleList = new ArrayList<String>();
singleList.add("hello");
singleList.add("world");
listOLists.add(singleList);

ArrayList<String> anotherList = new ArrayList<String>();
anotherList.add("this is another list");
listOLists.add(anotherList);
Run Code Online (Sandbox Code Playgroud)


小智 15

如果您真的想知道在Java中完美地处理CSV文件,那么尝试自己实现CSV读取器/写入器并不好.检查下面.

http://opencsv.sourceforge.net/

当您的CSV文档包含双引号或换行符时,您将面临困难.

首先要学习面向对象的方法,看看其他实现(通过Java)将对你有所帮助.而且我认为管理List中的一行并不好.CSV不允许您具有不同的列大小.

  • +1表示OpenCSV.但是,**尝试*自己实现CSV读取器/写入器是很好的,特别是对于java新手 - 你会学到很多东西. (19认同)

Bre*_*ode 11

这是一个示例,它将CSV字符串列表读入列表列表,然后遍历列表列表并将CSV字符串打印回控制台.

import java.util.ArrayList;
import java.util.List;

public class ListExample
{
    public static void main(final String[] args)
    {
        //sample CSV strings...pretend they came from a file
        String[] csvStrings = new String[] {
                "abc,def,ghi,jkl,mno",
                "pqr,stu,vwx,yz",
                "123,345,678,90"
        };

        List<List<String>> csvList = new ArrayList<List<String>>();

        //pretend you're looping through lines in a file here
        for(String line : csvStrings)
        {
            String[] linePieces = line.split(",");
            List<String> csvPieces = new ArrayList<String>(linePieces.length);
            for(String piece : linePieces)
            {
                csvPieces.add(piece);
            }
            csvList.add(csvPieces);
        }

        //write the CSV back out to the console
        for(List<String> csv : csvList)
        {
            //dumb logic to place the commas correctly
            if(!csv.isEmpty())
            {
                System.out.print(csv.get(0));
                for(int i=1; i < csv.size(); i++)
                {
                    System.out.print("," + csv.get(i));
                }
            }
            System.out.print("\n");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得很简单.只有几点需要注意:

  1. 我建议在创建列表对象时在左侧使用"List"而不是"ArrayList".传递"List"界面会更好,因为如果以后你需要改变使用像Vector这样的东西(例如你现在需要同步列表),你只需要用"new"语句来改变这一行.无论您使用哪种列表实现,例如Vector或ArrayList,您仍然只是传递List<String>.

  2. 在ArrayList构造函数中,您可以将列表保留为空,它将默认为特定大小,然后根据需要动态增长.但是如果你知道你的列表有多大,你有时可以节省一些性能.例如,如果您知道文件中总会有500行,那么您可以这样做:

List<List<String>> csvList = new ArrayList<List<String>>(500);

这样你就不会浪费处理时间等待你的列表增长动态增长.这就是我将"linePieces.length"传递给构造函数的原因.通常不是什么大问题,但有时也很有帮助.

希望有所帮助!

  • 你的例子虽然相当详细,但也颇具误导性.逐行读取CSV文件并以逗号分割行而不考虑周围的引号是一件麻烦事. (2认同)
  • 我同意你和其他所有关于CSV的事情并不像仅仅分享逗号一样简单.我的印象是问题的关键在于如何使用泛型和列表列表,而不是解析CSV.我喜欢OpenCSV作为一个软件包,所以我绝对同意你和其他人的意见,并为实际的线路解析推荐类似的东西.感谢您的反馈! (2认同)

Vin*_*nie 5

@tster提供的示例显示了如何创建列表列表.我将提供一个迭代这样一个列表的例子.

Iterator<List<String>> iter = listOlist.iterator();
while(iter.hasNext()){
    Iterator<String> siter = iter.next().iterator();
    while(siter.hasNext()){
         String s = siter.next();
         System.out.println(s);
     }
}
Run Code Online (Sandbox Code Playgroud)