检查Java中的一组字符串中的包含

时间:2010-11-26 11:00:51

标签: java string set

我有一组字符串[]。我想检查这个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(...))。

还有其他方法可以达到我的目的吗?

7 个答案:

答案 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"));