我有一组字符串[]。我想检查这个Set是否包含另一个String []。
Set<String[]> s = new HashSet<String[]>();
s.add(new String[] {"lucy", "simon"});
System.out.println(s.contains(new String[] {"lucy", "simon"}));
然而,打印为false。我猜这是因为只有引用被比较而不是实际的字符串。看来,我唯一的选择就是创建一个类,比如Phrase,并实现hashCode()
和equals()
(使用Arrays.hashCode(...)
)。
还有其他方法可以达到我的目的吗?
答案 0 :(得分:13)
你的猜测是正确的:数组([])没有实现深度等于方法:如果它们是同一个实例,它们是相等的。
最简单的解决方案是:将String[]
替换为List<String>
另一种方式(但我不推荐)是实现自己的Set,它不是基于Object.equals
而是基于java.util.Arrays.equals(Object[]a, Object[]b)
答案 1 :(得分:11)
将String[]
转换为List<String>
,它应该可以很好地运作。
Set<List<String>> s = new HashSet<List<String>>();
s.add(Arrays.asList("lucy", "simon"));
System.out.println(s.contains(Arrays.asList("lucy", "simon")));
答案 2 :(得分:3)
String []的元素是否可以使用不同的顺序,并且仍然认为整个数组与另一个包含相同元素的另一个数组相等?如果是的话,你最好不要实现容器类并重写equals和hashcode。
如果没有,如果将内部元素存储为Lists而不是数组是可接受的替代方案,那么您可以这样做:
package com.stackoverflow;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class StringContainment {
public static void main(final String[] args) {
final Set<String[]> s = new HashSet<String[]>();
final Set<List<String>> s2 = new HashSet<List<String>>();
s.add(new String[] {"lucy", "simon"});
s2.add(Arrays.asList(new String[] { "lucy", "simon" }));
System.out.println(s.contains(new String[] {"lucy", "simon"})); // false
System.out.println(s2.contains(Arrays.asList(new String[] {"lucy", "simon"}))); // true
}
}
第一次检查将返回false,第二次检查将返回true。 如果你可以使用列表,可能会更容易。
如果你不能,你仍然可以使用它,只要你不需要经常进行这种比较(在性能方面绝对不是一个好主意)。
答案 3 :(得分:1)
使用Set<Set<String>>
或Set<List<String>>
代替Set<String[]>
<强>代码:强>
List<String> s1=Arrays.asList("1","2"),s2=Arrays.asList("1","2");
System.out.println(s1.equals(s2) + " "+s1.hashCode()+ " "+s2.hashCode());
<强>输出:强>
true 2530 2530
答案 4 :(得分:1)
听起来你已经回答了你的问题。一种选择就像你已经说过的那样。另一种方法是使用 Set&gt; ,因为 equals(Object)的API表示:
将指定对象与此集合进行比较以确保相等。
答案 5 :(得分:0)
我只是循环并调用Arrays.equals:
类似的东西:
boolean contains(Set<String[]> s, String[] item) {
for(String[] toCompare: s) {
if(Arrays.equals(toCompare, item)) {
return true;
}
}
return false;
}
不确定它是否是最快的,但应该很好地完成工作
答案 6 :(得分:0)
通过Java8流介绍,您可以通过以下方式执行此操作:
Boolean res = s.stream()
.anyMatch(elm -> elm.equals("lucy") || elm.equals("simon"));