包含在 List 或 Set 中未找到部分字符串

Contains not finding partial string in List or Set

我目前有一个包含三个字符串("car""two dollar""foo")的集合。然后我对传递的 HashMap<String, Double>.

执行以下操作
if (getSet().contains(currentHashMapItem.getKey()) == true) {
    System.out.println(currentHashMapItem.getKey());
}

第一个键是 "car",按预期匹配并显示。但是,第二个键是"dollar",但不显示。现在我对 contains 如何工作的理解是,如果它正在比较的字符串存在于 returned in getSet() 的 Set 中,但没有骰子,它将 return 为真。甚至尝试了 ArrayList<String> 也没有运气。有人 运行 以前参与过这个吗?我是否试图切得太尖锐并被迫使用正则表达式或迭代器循环?

问题是您的 Set 不包含 "dollar",而是 "two dollar"。因此它包含一个包含键但不直接包含键的字符串。作为 Set.contains() 方法 uses .equals(),除非密钥相同,否则这将失败。

您可以遍历密钥集并查看是否有 String.contains() 您的密钥。

作为附加选项,您可以使用自己的 contains() 方法(覆盖或重载当前方法)创建一个新的 Set class,该方法使用 String.contains() 的比较方法,而不是 .equals()。这可以通过三种方式完成:

实现Set接口
-方便并且可以简单地使用 boolean contains(String) 选项重载 boolean contains(Object) 方法(也可以查看使用 AbstractSet class)

Composition
-允许使用不同类型的 Set(例如 HashSetTreeSet 等),而不是更通用的接口

继承
- 类似于组合,但不太优雅和合适的选项
- 仅当您有其他原因需要 child class

时才这样做

如果键等于参数

,则集合为真

contains on String 如果字符串包含参数则为真

关键是"two dollar"。这与 "dollar" 不匹配,因此找不到密钥。要执行您想要的操作,您必须检索集合中的每个键,并使用 keyString.contains("dollar"); 查找部分匹配项。

contains 方法将使用 String class 的 equals 方法来查找完全匹配。因此,"dollar".equals("two dollar"); 将 return 为假。

您要做的是遍历 Set 并改用 String.contains

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

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

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