方法包含不起作用

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套曲!