我不经常使用java,现在我遇到了一些问题。 我想读一个像这样的CSV文件:
A,B,C,d
A,B,F,K
E,F,S,A
A,B,C,S
A,C,C,S
Java不知道动态数组,所以我选择了一个ArrayList。这项工作到目前为止。问题是:
我如何存储ArrayList?我认为另一个ArrayList会有所帮助。
这就是我得到的:
BufferedReader reader = new BufferedReader(
new InputStreamReader(this.getClass().getResourceAsStream(
"../data/" + filename + ".csv")));
List rows = new ArrayList();
String line;
while ((line = reader.readLine()) != null) {
rows.add(Arrays.asList(line.split(",")));
}
现在我为rows.size()
获得了一个大小为5的ArrayList。
我怎么得到row [0] [0]?
我想做什么?问题是我想找到除最后一列之外的同一行。 例如,我想找到第0行和第3行。 非常感谢你
谢谢大家!你帮助了我很多。 =)也许Java和我会成为朋友=)感谢!
答案 0 :(得分:1)
您不需要事先知道行大小,String.split()会返回一个String数组:
List<String[]> rows = new ArrayList<String[]>();
String line = null;
while((line = reader.readLine()) != null)
rows.add(line.split(",", -1));
访问特定行:
int len = rows.get(0).length;
String val = rows.get(0)[0];
另外,您是否总是在除最后一列之外的整行进行比较?您可以取下最后一个值(line.replaceFirst(",.*?$", "")
)并将这些行作为字符串进行比较(当然,必须注意空格和其他格式)。
略有不同的方式:
Set<String> rows = new HashSet<String>();
String line = null;
while((line = reader.readLine()) != null){
if(!rows.add(line.substring(0, line.lastIndexOf(','))))
System.out.println("duplicate found: " + line);
}
当然,如果您确实需要捕获匹配的行,请根据需要进行修改。
答案 1 :(得分:0)
您需要声明数组的ArrayList。假设csv文件具有已知数量的列,则此处所需的唯一动态列表是“表”的“行”,由数组char [](列)的ArrayList(行)组成。 (如果没有,那么ArrayList的ArrayList就可以了。)
它就像任何其他语言的2D表:数组数组。只是在这种情况下,其中一个数组需要是动态的。
要读取文件,您需要两个循环。一个读取每一行,就像你正在做的那样,另一个读取每个char的char。
快速说明一下:如果要声明这样的数组:
char[] row = new char[5];
然后将每行添加到ArrayList中,如下所示:
yourList.add(row);
您将有一个列表指向同一个数组的列表。您需要使用.clone()方法,如下所示:
yourList.add(row.clone());
要像表[1] [2]那样访问它,你需要使用arraylist.get(1).get(2);