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

问题描述 投票:9回答:7

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

有没有其他方法可以实现我想要的?

java string set
7个回答
13
投票

你的猜测是正确的:arrays([])没有实现深度等于方法:如果它们是同一个实例,它们是相等的。

最简单的解决方案是:用String[]取代List<String>

另一种方式(但我不推荐它)是实现你自己的Set,它不是基于Object.equals而是基于java.util.Arrays.equals(Object[]a, Object[]b)


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

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。如果你可以使用列表,可能会更容易。

如果你不能,你仍然可以使用它,只要你不需要经常进行这种比较(在性能方面绝对不是一个好主意)。


1
投票

听起来你已经回答了你的问题。一种选择就像你已经说过的那样。另一个是使用Set>,因为equals(Object)的API说:

将指定对象与此集合进行比较以获得相等性。


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

0
投票

我只是循环并调用Arrays.equals:

这样的事情:

boolean contains(Set<String[]> s, String[] item) {
  for(String[] toCompare: s) {
    if(Arrays.equals(toCompare, item)) {
        return true;
    }
  }
  return false;
}

不确定它是否是最快但它应该很好地完成工作


0
投票

使用Java8流介绍,您可以通过以下方式执行此操作:

Boolean res = s.stream()
  .anyMatch(elm -> elm.equals("lucy") || elm.equals("simon"));
© www.soinside.com 2019 - 2024. All rights reserved.