在列表或集合中,contains()方法无法找到部分字符串。

6

我目前有一个包含三个字符串 ("car", "two dollar", "foo") 的 Set。然后我对传递的 HashMap<String, Double> 执行以下操作。

if (getSet().contains(currentHashMapItem.getKey()) == true) {
    System.out.println(currentHashMapItem.getKey());
}

第一个关键词是"car",与预期相符并显示。然而,第二个关键词是"dollar",但未显示。我对contains的理解是如果它比较的字符串存在于getSet()返回的集合中,它将返回true,但是没有成功。甚至尝试使用ArrayList<String>也没有好结果。有人以前遇到过这种情况吗?我是否试图走捷径,不得不使用正则表达式或迭代器循环?

3
contains() 方法使用 equals() 方法进行比较。因此,“dollar”显然不等于“two dollar”。这是预期的结果。请参阅 javadoc - JB Nizet
@JBNizet 糟糕,我知道我一直忽略了一个简单的东西。谢谢JB。 - canadiancreed
2
你可能也想看一下这个帖子。https://dev59.com/fGw15IYBdhLWcg3wYawx - theguywhodreams
顺便提一句,==true是多余的,在大多数情况下会有犯错的风险,例如while(variable = true),这里我们应该使用比较运算符==而不是赋值运算符=, 否则会导致无限循环。 - Pshemo
5个回答

2
问题在于您的Set中不包含“dollar”,而是包含“two dollar”。因此,它包含一个包含该键但不直接包含该键的字符串。由于Set.contains()方法使用.equals(),除非键完全相同,否则将失败。
您可以遍历键集并查看是否有任何String.contains()您的键。
作为额外选项,您可以创建一个新的Set类,其中包含自己的contains()方法(覆盖或重载当前方法),该方法使用String.contains()比较方法而不是.equals()。这可以通过三种方式完成: 实现Set接口
-方便,可以简单地重载boolean contains(Object)方法,并提供boolean contains(String)选项(还可以查看使用AbstractSet类)

组合
-允许使用不同类型的Set(如HashSetTreeSet等),而不是更一般的接口

继承
-类似于组合,但不够优雅和适当
-只有在你有其他原因想要一个子类时才这样做。


组合比从 Set 扩展更好的选择。 - Chetan Kinger
如果您正在实现Set,那没问题。我的评论是针对从具体的Set实现进行扩展,因为您的答案说您可以创建一个Set的子类 - Chetan Kinger
@CKing 啊,我本以为这会抛出一个错误,因为boolean contains(Object)已经在Set中有了实现。但是我想它可以通过采用String参数来进行重载。 - River
1
@CKing,我已经在我的答案中添加了所有三个选项,并提供了每个选项的优缺点信息。不过,我认为接口实现看起来最容易。感谢您的建议。 - River
1
选择了这个答案,因为我觉得它是最完整和描述性最强的。 - canadiancreed
显示剩余2条评论

1
关键字是“two dollar”。这与“dollar”不匹配,因此未找到关键字。要实现您想要的功能,您需要检索集合中的每个关键字,并使用keyString.contains("dollar");来查找部分匹配项。

1

contains方法将使用String类的equals方法来查找完全匹配。因此,"dollar".equals("two dollar");将返回false。

你想要做的是遍历Set并使用String.contains代替:

Set<String> set = getSet();
for(String s : set) {
  if(currentHashMapItem.getKey().contains(s)) {
     System.out.println(s);
  }
}

1

contains如果集合(在您的情况下-一个Set)包含传递给它的对象,则返回true。您的集合不包含字符串"dollar" - 它包含一个更长的字符串"two dollars"。如果您想测试一个集合是否包含给定的子字符串,您需要自己实现它:

public static boolean containsSubString (Collection<String> col, String str) {
    for (String s: col) {
        if (s.contains(str)) {
            return true;
        }
    }
    return false;
}

-1

如果键等于参数,则 Set 中的 contains 为 true

如果字符串包含参数,则 String 中的 contains 为 true


2
getSet() 似乎返回的是一个 Set 而不是一个 Map - Chetan Kinger
@CKing 谢谢,不知道为什么错过了那个,很明显它是一个 Set :D - Viktor Mellgren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接