我正在尝试检查两个列表是否包含相同的值,但我不知道为什么这个特定值中的一个触发我的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(),所以这里出了什么问题
如果我查看各个字符:
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]
如何解决这种差异以及原因是什么?
答案 0 :(得分:3)
它会检查每个元素(如果它是您要测试的元素的equal()
。)意味着,如果两个元素通过了equals()
方法测试,则contains()
方法将如果equals()
方法返回false,则对它们返回true,contains()
方法也将返回false。
布尔包含(对象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
,例如List
,Set<String>
会更快。
答案 2 :(得分:0)
我们忽略的是,即使为类定义了equals()
方法,仍然需要考虑hashCode()
方法(即使您打算比较String也不行)? )。
为什么?
contains
取决于equals
,并且equals与hashCode
一起使用来判断我们是否在参考范围内谈论同一对象。
以contains()
合同为基础恢复equals-hashCode
的工作
More documentation