为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2023-07-13 14:12:47
我正在尝试检查两个列表是否包含相同的值,但我无法弄清楚为什么这个特定值会触发我的 FileExceptionprivate 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() 类似,所以这里出了什么问题如果我看一下各个角色: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]如何解决这个差异,原因是什么?
查看完整描述

3 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

它检查每个元素,如果它是equal()您要测试的元素。这意味着,如果两个元素通过equals()方法测试,则该contains()方法将为它们返回 true,如果该equals()方法返回 false,则该contains()方法也将返回 false。

来自 Java 文档:

布尔值包含(对象o)

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 且满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

查看完整回答
反对 回复 2023-07-13
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

显然getFieldNameInFile不是一个字符串。所以人们应该采取toString,


private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions,

        List<String> columnsName) throws FileException {

    for (ColumnDefinition cd : columnsDefinitions) {

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

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

        }

    }

}

使用流:


private static void checkFileHeaders(List<ColumnDefinition> columnsDefinitions,

        Set<String> columnsName) throws FileException {

    if (columnsDefinitions.streams

            .map(ColumnDefinition::getFieldNameInFile)

            .map(Object::toString)

            .anyMatch(nm -> !columnsName.contains(nm)) {

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

    }

}

此外ArrayList,它太具体了,请使用接口,List因为此方法可以适用于任何类型的 List 实现。


例如,对于a 来说,Set<String>速度会快得多。containsHashSet<>


查看完整回答
反对 回复 2023-07-13
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我们忽略的是,即使为equals()类定义了方法,该hashCode()方法仍然是需要关心的(即使在这里您假设比较字符串可能不是?)。

为什么 ?

contains取决于equals和等于可以hashCode判断我们是否在引用方面谈论同一个对象。

根据合同 恢复contains()工作更多文件equals-hashCode


查看完整回答
反对 回复 2023-07-13
  • 3 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信