我有一个CSV文件:
10;name1;id1
20;name2;id2
10;name3;id3
Row的行我将数据推送到一个名为forward的方法:
forward(nr,name,id);
如果“nr”是重复的,我如何检查整个csv?如上例所示:10。
我的代码现在:
while ((line = reader.readLine()) != null) {
scanner = new Scanner(line);
scanner.useDelimiter(";");
while (scanner.hasNext()) {
String data = scanner.next();
if (index == 0)
nr = Integer.parseInt(data);
else if (index == 1)
name = data;
else if (index == 2)
id = data;
else
System.out.println("invalid data::" + data);
index++;
}
index = 0;
forward(nr, name, id);
}
如果找到副本,我只想在屏幕上打印。
答案 0 :(得分:2)
使用Map<Long, String>
。每次转发输出之前,您都可以检查地图是否包含密钥(数字)。
Map<Long, String> entryMap = new HashMap<Long, String>();
[...]
if (!entryMap.containsKey(nr)) {
entryMap.put(nr, name);
forward(nr, name, id);
} else
System.out.println("Entry with number " + nr + " already added to .csv file");
如果只有数字是相关的,并且您不需要设置任何例外(例如entry with name and number is already in the file
),您可能想要选择其他数据结构,例如List
。
正如我在上面的评论中所读到的,如果您的意图是替换,您可以进行以下操作:
创建一个保存参数的类:
public class CsvEntry {
private int number;
private String name, id;
public CsvEntry(number, name, id) {
this.number = number;
this.name = name;
this.id = id;
}
// getters & setters
}
然后将Map
更改为:
Map<Long, CsvEntry> entryMap = new TreeMap<Long, CsvEntry>();
// TreeMap so the entries are sorted.
[...]
entryMap.put(nr, new CsvEntry(nr, name, id));
// after populating the map, e.g., after the outer loop
forward(entryMap);
然后在前进中,您只需循环输出地图。
答案 1 :(得分:2)
您可以使用 java.util.Set 来检查重复。
示例代码:
java.util.Set<Integer> nrSet = new java.util.HashSet<Integer>();
while ((line = reader.readLine()) != null) {
scanner = new Scanner(line);
scanner.useDelimiter(";");
while (scanner.hasNext()) {
String data = scanner.next();
if (index == 0)
nr = Integer.parseInt(data);
else if (index == 1)
name = data;
else if (index == 2)
id = data;
else
System.out.println("invalid data::" + data);
index++;
}
index = 0;
if (nrSet.contains(nr)) { // check duplication
System.out.println("Duplicate nr:" + nr);
} else {
forward(nr, name, id);
nrSet.add(nr);// add as forwarded
}
}
java.util.Set nrSet = new java.util.HashSet(); 已经转发 nr 设置。
if(nrSet.contains(nr))检查重复
nrSet.add(nr); 刚刚转发 nr
答案 2 :(得分:1)
如果您想要一个只需要对当前代码进行少量修改的快速解决方案,那么您可以在此代码之前声明ArrayList<Integer> nrs
,并在测试if (index == 0)
内检查if (nrs.contains(nr))
然后您可以显示您的消息和break;
,else nrs.add(nr);
您的代码将是这样的:
ArrayList<Integer> nrs = new ArrayList<>();
while ((line = reader.readLine()) != null) {
scanner = new Scanner(line);
scanner.useDelimiter(";");
while (scanner.hasNext()) {
String data = scanner.next();
if (index == 0){
nr = Integer.parseInt(data);
if(nrs.contains(nr)) {
System.err.println("Duplicate record : "+nr);
break;
} else nrs.add(nr);
}
else if (index == 1)
name = data;
else if (index == 2)
id = data;
else
System.out.println("invalid data::" + data);
index++;
}
index = 0;
forward(nr, name, id);
}