[英]Checking containment in a Set of strings in Java
我有一组字符串[]。 我想检查这个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(...)
)。
有没有其他方法可以实现我想要的?
你的猜测是正确的:arrays([])没有实现深度等于方法:如果它们是同一个实例,它们是相等的。
最简单的解决方案是:用List<String>
替换String[]
另一种方式(但我不推荐它)是实现你自己的Set,它不是基于Object.equals
而是基于java.util.Arrays.equals(Object[]a, Object[]b)
将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")));
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。 如果你可以使用列表,可能会更容易。
如果你不能,你仍然可以使用它,只要你不需要经常进行这种比较(在性能方面绝对不是一个好主意)。
使用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
听起来你已经回答了你的问题。 一种选择就像你已经说过的那样。 另一个是使用Set> ,因为equals(Object)的API说:
将指定对象与此集合进行比较以获得相等性。
我只是循环并调用Arrays.equals:
这样的事情:
boolean contains(Set<String[]> s, String[] item) {
for(String[] toCompare: s) {
if(Arrays.equals(toCompare, item)) {
return true;
}
}
return false;
}
不确定它是否是最快但它应该很好地完成工作
使用Java8流介绍,您可以通过以下方式执行此操作:
Boolean res = s.stream()
.anyMatch(elm -> elm.equals("lucy") || elm.equals("simon"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.