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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查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([])没有实现深度等于方法:如果它们是同一个实例,它们是相等的。

最简单的解决方案是:用String[]取代List<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>,因为equals(Object)的API说:

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

另一答案

使用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
另一答案

我只是循环并调用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"));

以上是关于检查Java中的一组字符串中的包含的主要内容,如果未能解决你的问题,请参考以下文章

如何替换 Java 字符串中的一组标记?

需要示例代码片段帮助

使用 Java Regex,如何检查字符串是不是包含集合中的任何单词?

Python 中的反转字符串:reversed()切片等

将字符串重新分配给数组中的一组值列表

确定一个值是不是在 Java 中的一组值中的最快方法是啥?