在 Java 中使用列表列表

2022-08-31 14:50:33

我正在尝试将CSV文件读取到列表(字符串)列表中,将其传递以从数据库获取一些数据,构建新数据列表的新列表,然后传递该列表列表,以便可以将其写入新的CSV文件。我已经看了一遍,我似乎找不到一个如何做到这一点的例子

我宁愿不使用简单的数组,因为文件的大小会有所不同,我不知道该对数组的尺寸使用什么。我在处理文件时没有问题。我只是不知道如何处理列表列表。

我找到的大多数示例都将创建多维数组或在从文件中读取数据的循环内执行操作。我知道我可以做到这一点,但我想编写面向对象的代码。如果你能提供一些示例代码或给我一个参考,那就太好了。


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

答案 2

下面是一个示例,它将 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");
        }
    }
}

我认为很简单。请注意以下几点:

  1. 我建议在创建列表对象时使用左侧的“List”而不是“ArrayList”。最好传递接口“List”,因为如果以后您需要更改为使用Vector之类的东西(例如,您现在需要同步列表),则只需要使用“new”语句更改行。无论您使用哪种列表实现,例如Vector或ArrayList,您仍然总是只是传递。List<String>

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

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

这样,您就永远不会浪费处理时间等待列表动态增长。这就是我将“linePieces.length”传递给构造函数的原因。通常没什么大不了的,但有时很有帮助。

希望有所帮助!