包含在 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
(例如 HashSet
、TreeSet
等),而不是更通用的接口
继承
- 类似于组合,但不太优雅和合适的选项
- 仅当您有其他原因需要 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;
}
我目前有一个包含三个字符串("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
(例如 HashSet
、TreeSet
等),而不是更通用的接口
继承
- 类似于组合,但不太优雅和合适的选项
- 仅当您有其他原因需要 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;
}