方法包含不起作用
Method contains doesn't work
我正在尝试检查一个 csv 文件的一行是否存在于另一个 csv 文件中。我的代码如下:
public void readIncassiOLG(String filename,List<String []> itemsToCheck){
CSVReader reader = new CSVReader(new FileReader(filename),CSV_SEPARATOR);
List<String []> body = reader.readAll();
for(String[] item : itemsToCheck){
if(body.contains(item)){
System.out.println("Item present");
}
else{
System.out.println("Item not present");
}
}
}
要检查的项目 (itemsToCheck) 是从第一个文件中筛选出的行,我检查了两个文件中都有一些行,但是下面的方法总是打印我 "Item not present".
对此有什么建议吗?
List 的 contains 方法 returns 如果此列表包含至少一个元素 e 则为真 (o==null ? e==null : o.equals(e))
.
在您的例子中,它将比较 2 个字符串数组。
但是,array1.equals(array2)
与 array1 == array2
相同。
这意味着它将检查它是否是同一个数组。
要比较数组的内容,您需要这样的东西:
Arrays.equals(array1, array2)
因此,列表的 contains 方法不适合您使用(即比较数组内容),而是 java.util.Arrays 或类似方法的 equals 方法。
您需要确保字符串 trimmed 并且使用类似于 equalsIgnoreCase() 的方法进行检查。基本上,实际的 'contents' 并没有在这些数组中被检查——主要是 body
。重新处理此数组,trim 字符串,创建一个新数组,然后您将能够将它与 item
进行比较 - 在单个 loop/pass.
中
对于你正在尝试做的事情,我建议你尝试 java 中的 deepEquals()。
https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#deepEquals(java.lang.Object,%20java.lang.Object)
来自 Java 文档
public boolean contains(Object o)
Returns true if this list contains the specified element. More formally, returns true if and
only if this list contains at least one element e such that (o==null ?
e==null : o.equals(e)).
为了简单起见(即使它看起来不是很优雅),您应该按如下方式更改代码:
public void readIncassiOLG(String filename, List<String []> itemsToCheck) {
CSVReader reader = new CSVReader(new FileReader(filename), CSV_SEPARATOR);
List<String []> body = reader.readAll();
for (String[] item : itemsToCheck) {
for (String[] bodyItem : body) {
if ( Arrays.equals(bodyItem, item) ) {
System.out.println("Item present");
} else{
System.out.println("Item not present");
}
}
}
}
但是,如果您只想打印项目是否存在(因此不执行其他操作),我建议您 运行 此代码:
public void readIncassiOLG(String filename, List<String []> itemsToCheck) {
String[] answers = {"", "not "};
CSVReader reader = new CSVReader(new FileReader(filename), CSV_SEPARATOR);
List<String []> body = reader.readAll();
for (String[] item : itemsToCheck) {
for (String[] bodyItem : body) {
int present = Arrays.equals(bodyItem, item) ? 0 : 1;
System.out.println(String.format("Item %spresent", answers[present]));
}
}
}
Buon套曲!
我正在尝试检查一个 csv 文件的一行是否存在于另一个 csv 文件中。我的代码如下:
public void readIncassiOLG(String filename,List<String []> itemsToCheck){
CSVReader reader = new CSVReader(new FileReader(filename),CSV_SEPARATOR);
List<String []> body = reader.readAll();
for(String[] item : itemsToCheck){
if(body.contains(item)){
System.out.println("Item present");
}
else{
System.out.println("Item not present");
}
}
}
要检查的项目 (itemsToCheck) 是从第一个文件中筛选出的行,我检查了两个文件中都有一些行,但是下面的方法总是打印我 "Item not present".
对此有什么建议吗?
List 的 contains 方法 returns 如果此列表包含至少一个元素 e 则为真 (o==null ? e==null : o.equals(e))
.
在您的例子中,它将比较 2 个字符串数组。
但是,array1.equals(array2)
与 array1 == array2
相同。
这意味着它将检查它是否是同一个数组。 要比较数组的内容,您需要这样的东西:
Arrays.equals(array1, array2)
因此,列表的 contains 方法不适合您使用(即比较数组内容),而是 java.util.Arrays 或类似方法的 equals 方法。
您需要确保字符串 trimmed 并且使用类似于 equalsIgnoreCase() 的方法进行检查。基本上,实际的 'contents' 并没有在这些数组中被检查——主要是 body
。重新处理此数组,trim 字符串,创建一个新数组,然后您将能够将它与 item
进行比较 - 在单个 loop/pass.
对于你正在尝试做的事情,我建议你尝试 java 中的 deepEquals()。
https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#deepEquals(java.lang.Object,%20java.lang.Object)
来自 Java 文档
public boolean contains(Object o) Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
为了简单起见(即使它看起来不是很优雅),您应该按如下方式更改代码:
public void readIncassiOLG(String filename, List<String []> itemsToCheck) {
CSVReader reader = new CSVReader(new FileReader(filename), CSV_SEPARATOR);
List<String []> body = reader.readAll();
for (String[] item : itemsToCheck) {
for (String[] bodyItem : body) {
if ( Arrays.equals(bodyItem, item) ) {
System.out.println("Item present");
} else{
System.out.println("Item not present");
}
}
}
}
但是,如果您只想打印项目是否存在(因此不执行其他操作),我建议您 运行 此代码:
public void readIncassiOLG(String filename, List<String []> itemsToCheck) {
String[] answers = {"", "not "};
CSVReader reader = new CSVReader(new FileReader(filename), CSV_SEPARATOR);
List<String []> body = reader.readAll();
for (String[] item : itemsToCheck) {
for (String[] bodyItem : body) {
int present = Arrays.equals(bodyItem, item) ? 0 : 1;
System.out.println(String.format("Item %spresent", answers[present]));
}
}
}
Buon套曲!