下面是一个示例,它将 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");
}
}
}
我认为很简单。请注意以下几点:
我建议在创建列表对象时使用左侧的“List”而不是“ArrayList”。最好传递接口“List”,因为如果以后您需要更改为使用Vector之类的东西(例如,您现在需要同步列表),则只需要使用“new”语句更改行。无论您使用哪种列表实现,例如Vector或ArrayList,您仍然总是只是传递。List<String>
在 ArrayList 构造函数中,可以将列表留空,它将默认为一定大小,然后根据需要动态增长。但是,如果您知道列表可能有多大,则有时可以节省一些性能。例如,如果您知道文件中总是有500行,那么您可以执行以下操作:
List<List<String>> csvList = new ArrayList<List<String>>(500);
这样,您就永远不会浪费处理时间等待列表动态增长。这就是我将“linePieces.length”传递给构造函数的原因。通常没什么大不了的,但有时很有帮助。
希望有所帮助!