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

时间:2019-09-04 13:35:03

标签: java contains

我正在尝试检查两个列表是否包含相同的值,但我不知道为什么这个特定值中的一个触发我的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(),所以这里出了什么问题

enter image description here

如果我查看各个字符:

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

columnsName [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 个答案:

答案 0 :(得分:3)

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

来自Java文档:

  

布尔包含(对象o)

     

如果此列表包含指定的元素,则返回true。更多   形式上,当且仅当此列表包含至少一个时,才返回true   元素e使得(o == null?e == null:o.equals(e))。

文档链接

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#contains-java.lang.Object-

答案 1 :(得分:0)

显然Polls不是字符串。因此,应该选择htmlstring.replace(/((<[^>]*>)\s*){1,}/g, '$1')

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 "); } } ,因为此方法可用于任何种类的List实现。

对于ArrayList,例如ListSet<String>会更快。

答案 2 :(得分:0)

我们忽略的是,即使为类定义了equals()方法,仍然需要考虑hashCode()方法(即使您打算比较String也不行)? )。

为什么?

contains取决于equals,并且equals与hashCode一起使用来判断我们是否在参考范围内谈论同一对象。

contains()合同为基础恢复equals-hashCode的工作 More documentation