在Java中,如何确定一个数组是否包含特定的值?

2701

我有一个包含以下值的String[]

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

给定字符串 s,是否有一种好的方法来测试 VALUES 是否包含 s


6
可以使用 for 循环来解决,代码如下:"for (String s : VALUES) if (s.equals("MYVALUE")) return true;"。 - Zack
3
@camickr--我遇到了一个几乎相同的情况,链接是这个:https://dev59.com/A3VC5IYBdhLWcg3wpi98#223929。它一直得到投票,但只是从sun的文档中复制粘贴而来。我猜分数是基于你提供了多少帮助,而不是你付出了多少努力——大多数情况下是你多快发布答案!也许我们已经偶然发现了John Skeet的秘密!好的回答,+1给你。 - Bill K
3
如果你正在使用Apache Commons,那么org.apache.commons.lang.ArrayUtils.contains()可以为你完成这个任务。 - Mr. Boy
50
因为像我这样的人会在谷歌上搜索问题,点击 SO 的结果,看到你的答案,测试它,发现它有效,就会点赞该答案然后离开。 - Aequitas
2
我真的很想在java.util.Arrays中找到一个简单的indexOfcontains,它们都包含直接的循环。是的,你可以在1分钟内编写它们;但我仍然去了StackOverflow,期望在JDK的某个地方找到它们。 - tucuxi
显示剩余2条评论
32个回答

5

请使用以下-

    String[] values = {"AB","BC","CD","AE"};
    String s = "A";
    boolean contains = Arrays.stream(values).anyMatch(v -> v.contains(s));

我得到了“无法解析方法'contains(java.lang.String)'”的错误信息。 - undefined

5
  1. For arrays of limited length use the following (as given by camickr). This is slow for repeated checks, especially for longer arrays (linear search).

     Arrays.asList(...).contains(...)
    
  2. For fast performance if you repeatedly check against a larger set of elements

    • An array is the wrong structure. Use a TreeSet and add each element to it. It sorts elements and has a fast exist() method (binary search).

    • If the elements implement Comparable & you want the TreeSet sorted accordingly:

      ElementClass.compareTo() method must be compatable with ElementClass.equals(): see Triads not showing up to fight? (Java Set missing an item)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
      
    • Otherwise, use your own Comparator:

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
    • The payoff: check existence of some element:

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);
      

4
为什么要使用TreeSet呢?HashSet更快(O(1))且不需要排序。但是TreeSet可以实现有序性。 - Sean Owen

4

请检查此内容

String[] VALUES = new String[]{"AB", "BC", "CD", "AE"};
String s;

for (int i = 0; i < VALUES.length; i++) {
    if (VALUES[i].equals(s)) {
        // do your stuff
    } else {
        //do your stuff
    }
}

1
这个不起作用 - 它将为每个不匹配的项进入else(因此,如果您正在该数组中查找“AB”,它将会去那里3次,因为3个值不是“AB”)。 - Bernhard Barker

4

试试这个:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}

3

Arrays.asList() -> 然后调用contains()方法总是可行的,但搜索算法更好,因为您无需创建轻量级列表包装器以围绕数组,这正是Arrays.asList()所做的。

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

2

使用 Array.BinarySearch(array,obj) 查找数组中是否存在给定的对象。

示例:

if (Array.BinarySearch(str, i) > -1)` → true --exists

false --不存在


5
Array.BinarySearchArray.FindIndex 是 .NET 方法,不存在于 Java 中。 - ataylor
@ataylor 在Java中有Arrays.binarySearch。但是你说得对,没有Arrays.findIndex。 - mente
1
请注意:在调用此函数之前,必须对数组进行排序。如果未排序,则结果是未定义的。 - Dorian Gray

2
尝试使用Java 8的predicate测试方法。以下是一个完整的示例:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Test {
    public static final List<String> VALUES =
            Arrays.asList("AA", "AB", "BC", "CD", "AE");

    public static void main(String args[]) {
        Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
        for (String i : VALUES) {
            System.out.println(containsLetterA.test(i));
        }
    }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


1
创建一个布尔值,初始设置为false。运行循环以检查数组中的每个值并与您正在检查的值进行比较。如果您获得了匹配项,则将布尔值设置为true并停止循环。然后断言布尔值为true。

1

由于我正在使用基本类型byte和byte[]处理低级Java,到目前为止,我发现最好的工具是来自bytes-javahttps://github.com/patrickfav/bytes-java,看起来是一份不错的工作。


0

Arrays.stream(VALUES).anyMatch(value -> StringUtils.equalsIgnoreCase("s", value));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接