“contains()”方法如何在 List<string> 上真正起作用?

我正在尝试检查两个列表是否包含相同的值,但我无法弄清楚为什么这个特定值会触发我的 FileException


private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions, ArrayList<String> columnsName) throws FileException {

    for (ColumnDefinition cd : columnsDefinitions) {

        if(!columnsName.contains(cd.getFieldNameInFile())) {

            throw new FileException("Parameter "+cd.getFieldNameInFile() +" missing ");

        }

    }

}

正如我们在调试器中看到的,我的值存在于列表中,它可能与编码有关吗?它适用于其他值,但不适用于此特定值。


我知道 contains() 的工作方式与 equals() 类似,所以这里出了什么问题

http://img4.mukewang.com/64af95fc0001ad9505530449.jpg

如果我看一下各个角色:

cd.getFieldNameInFile() : [90, 66, 75, 80, 70, 45, 66, 85, 75, 82, 83]

列名[0] : [-1, -2, 90, 0, 66, 0, 75, 0, 80, 0, 70, 0, 45, 0, 66, 0, 85, 0, 75, 0, 82, 0, 83, 0]

如何解决这个差异,原因是什么?


德玛西亚99
浏览 139回答 3
3回答

哆啦的时光机

它检查每个元素,如果它是equal()您要测试的元素。这意味着,如果两个元素通过equals()方法测试,则该contains()方法将为它们返回 true,如果该equals()方法返回 false,则该contains()方法也将返回 false。来自 Java 文档:布尔值包含(对象o)如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 且满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

一只萌萌小番薯

显然getFieldNameInFile不是一个字符串。所以人们应该采取toString,private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions,&nbsp; &nbsp; &nbsp; &nbsp; List<String> columnsName) throws FileException {&nbsp; &nbsp; for (ColumnDefinition cd : columnsDefinitions) {&nbsp; &nbsp; &nbsp; &nbsp; if(!columnsName.contains(cd.getFieldNameInFile().toString()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new FileException("Parameter "+cd.getFieldNameInFile() +" missing ");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}使用流:private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions,&nbsp; &nbsp; &nbsp; &nbsp; Set<String> columnsName) throws FileException {&nbsp; &nbsp; if (columnsDefinitions.streams&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(ColumnDefinition::getFieldNameInFile)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(Object::toString)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .anyMatch(nm -> !columnsName.contains(nm)) {&nbsp; &nbsp; &nbsp; &nbsp; throw new FileException("Parameter " + cd.getFieldNameInFile() + " missing ");&nbsp; &nbsp; }}此外ArrayList,它太具体了,请使用接口,List因为此方法可以适用于任何类型的 List 实现。例如,对于a 来说,Set<String>速度会快得多。containsHashSet<>

慕侠2389804

我们忽略的是,即使为equals()类定义了方法,该hashCode()方法仍然是需要关心的(即使在这里您假设比较字符串可能不是?)。为什么 ?contains取决于equals和等于可以hashCode判断我们是否在引用方面谈论同一个对象。根据合同 恢复contains()工作更多文件equals-hashCode
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java