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

How do I determine whether an array contains a particular value in Java?

提问人:Mike Sickler 提问时间:7/15/2009 最后编辑:Peter MortensenMike Sickler 更新时间:10/30/2023 访问量:2663987

问:

我有一个这样的值:String[]

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

鉴于,有没有一种好的方法来测试是否包含?String sVALUESs

数组 java-8

评论

6赞 Zack 7/15/2009
绕开了很长的路要走,但你可以使用 for 循环:“for (String s : VALUES) if (s.equals(”MYVALUE“)) return true;
3赞 Bill K 4/29/2013
@camickr--我的情况与这个几乎相同:stackoverflow.com/a/223929/12943 它只是不断获得投票,但只是从 sun 的文档中复制/粘贴。我想分数取决于你提供了多少帮助,而不是你付出了多少努力——主要是你发布它的速度!也许我们偶然发现了约翰·斯基特的秘密!很好的答案,+1给你。
3赞 Mr. Boy 11/13/2013
如果您使用的是 Apache Commons,那么 org.apache.commons.lang.ArrayUtils.contains() 会为您执行此操作。
50赞 Aequitas 7/20/2015
@camickr因为像我这样的人,在谷歌上搜索一个问题,点击 SO 结果,查看你的答案,测试它,它有效,对答案投赞成票,然后离开。
2赞 tucuxi 5/1/2020
我真的很想念一个简单的 和 in - 它们都包含简单的循环。是的,您可以在 1 分钟内写出这些内容;但我仍然去了 StackOverflow,希望在 JDK 的某个地方找到它们。indexOfcontainsjava.util.Arrays

答:

3369赞 camickr 7/15/2009 #1
Arrays.asList(yourArray).contains(yourValue)

警告:这不适用于基元数组(请参阅注释)。


开始,您现在可以使用 Streams。

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

要检查数组 , or 是否包含值,请使用 或 或。intdoublelongIntStreamDoubleStreamLongStream

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

评论

112赞 Thomas Owens 7/15/2009
我有点好奇它与 Arrays 类中的搜索函数与遍历数组并使用 equals() 函数或 == 作为基元的性能。
196赞 Joey 7/15/2009
你不会损失太多,因为 asList() 返回一个 ArrayList,它的核心是一个数组。构造函数将只更改引用,因此无需做太多工作。并且 contains()/indexOf() 将迭代并使用 equals()。不过,对于基元,最好自己编写代码。对于字符串或其他类,差异不会很明显。
19赞 Nyerguds 11/13/2010
奇怪的是,NetBeans 声称“int[] holidays”的“Arrays.asList(holidays)”返回“list<int[]>”,而不是“list<int>”。它只包含一个元素。这意味着 Contains 不起作用,因为它只有一个元素;int 数组。
66赞 CromTheDestroyer 6/15/2011
Nyerguds:事实上,这不适用于原语。在 java 中,基元类型不能是泛型的。asList 声明为 <T> List<T> asList(T...)。当你将 int[] 传递到其中时,编译器会推断 T=int[],因为它无法推断 T=int,因为基元不能是泛型的。
31赞 TWiStErRob 10/17/2012
@Joey只是一个旁注,它是一个 ,但不是你所期望的,返回的真正类是: 定义为: 。ArrayListjava.util.ArrayListjava.util.Arrays.ArrayList<E>public class java.util.Arrays {private static class ArrayList<E> ... {}}
29赞 Thomas Owens 7/15/2009 #2

可以使用 Arrays 类对值执行二进制搜索。如果数组未排序,则必须使用同一类中的排序函数对数组进行排序,然后对其进行搜索。

评论

0赞 Thomas Owens 7/15/2009
您可以使用同一类中的排序函数来实现此目的...我应该把它添加到我的答案中。
1赞 Joey 7/15/2009
那么,我认为可能会比 asList().contains() 方法花费更多。除非您需要经常进行检查(但公平地说,如果它只是一个可以排序的值的静态列表)。
0赞 Thomas Owens 7/15/2009
真。关于哪个最有效,有很多变量。不过,有选择是件好事。
0赞 O.O.Balance 1/14/2018
在此处执行此操作的一些代码: stackoverflow.com/a/48242328/9131078
0赞 arunwithasmile 2/14/2018
出于搜索目的对整个数组进行排序是昂贵的。我们可以对班轮搜索本身使用相同的 CPU 时间。我更喜欢对已经预先按排序顺序构建的集合进行二叉搜索。
76赞 Uri 7/15/2009 #3

如果数组未排序,则必须遍历所有内容,并调用每个数组的 equals。

如果数组是排序的,你可以做一个二叉搜索,在 Arrays 类中有一个。

一般来说,如果你要进行大量的成员资格检查,你可能希望将所有内容存储在一个集合中,而不是一个数组中。

评论

1赞 Thomas Owens 7/15/2009
此外,就像我在回答中所说的那样,如果您使用 Arrays 类,则可以对数组进行排序,然后对新排序的数组执行二进制搜索。
1赞 Uri 7/15/2009
@Thomas:我同意。或者你可以将所有内容添加到一个 TreeSet 中;同样的复杂性。如果它不改变,我会使用数组(也许可以节省一点内存局部性,因为引用是连续的,而字符串不是)。如果这会随着时间的推移而改变,我会使用该集合。
449赞 Tom Hawtin - tackline 7/15/2009 #4

Java SE 9 简明更新

引用数组是错误的。对于这种情况,我们追求的是一套。从 Java SE 9 开始,我们有 .Set.of

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

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

VALUES.contains(s)

O(1)。

正确的类型不可变O(1)简洁。美丽。*

原始答案详细信息

只是为了从一开始就清除代码。我们(已更正):

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

这是一个可变的静态,FindBugs 会告诉你它非常顽皮。不要修改静态,也不允许其他代码这样做。该字段至少应为私有字段:

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

(请注意,您实际上可以删除该位。new String[];

引用数组仍然很糟糕,我们想要一个集合:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(偏执狂的人,比如我自己,如果把它包起来,可能会感到更自在——它甚至可以被公开。Collections.unmodifiableSet

(*为了更深入地介绍品牌,可以预见的是,集合 API 仍然缺少不可变的集合类型,并且语法仍然太冗长了,不符合我的口味。

评论

201赞 Drew Noakes 4/25/2011
除了首先创建集合是 O(N) :)
69赞 Xr. 10/13/2011
如果它是静态的,它可能会被使用很多次。因此,与大量线性搜索的成本相比,初始化集合所花费的时间很有可能非常小。
3赞 Basil Bourque 8/29/2014
@TomHawtin-tackline 为什么说“我们特别想要一套”?在这种情况下,Set (HashSet) 的优点是什么?为什么“引用数组”不好(“引用数组”是指由调用生成的数组支持的 ArrayList)?Arrays.asList
7赞 Tom Hawtin - tackline 9/10/2014
@nmr A 将是 .对 s 进行缩放,使存储桶中元素的平均数大致恒定。至少对于高达 2^30 的数组。例如,big-O 分析可能会忽略硬件缓存的影响。还假设哈希函数有效工作。TreeSetO(log n)HashSet
5赞 Minn 8/19/2019
这并不能回答有关数组的问题。你只是说“不要使用数组”,这不是一个解决方案。此外,你只是说“X不好”,但没有解释为什么这对答案总是不利的。
21赞 Tom Hawtin - tackline 7/15/2009 #5

ObStupidAnswer(但我认为这里有一个教训):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

评论

2赞 James P. 6/3/2011
异常抛出显然很重,但如果它有效,这将是一种测试值的新方法。缺点是必须事先定义枚举。
54赞 camickr 7/15/2009 #6

值得一提的是,我进行了一项测试,比较了 3 条速度建议。我生成了随机整数,将它们转换为字符串并将它们添加到数组中。然后,我搜索了可能的最高数字/字符串,这将是 .asList().contains()

使用 10K 数组大小时,结果是:

Sort & Search   : 15
Binary Search   : 0
asList.contains : 0

使用 100K 阵列时,结果是:

Sort & Search   : 156
Binary Search   : 0
asList.contains : 32

因此,如果数组是按排序顺序创建的,则二进制搜索是最快的,否则将是要走的路。如果您有很多搜索,那么可能值得对数组进行排序,以便您可以使用二进制搜索。这完全取决于您的应用。asList().contains

我认为这些是大多数人所期望的结果。以下是测试代码:

import java.util.*;

public class Test {
    public static void main(String args[]) {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();

        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt(size);

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
        System.out.println("Sort & Search : "
                + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
        System.out.println("Search        : "
                + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains("" + (size - 1)));
        System.out.println("Contains      : "
                + (System.currentTimeMillis() - start));
    }
}

评论

6赞 Erik 5/30/2013
我不明白这段代码。对数组“strings”进行排序,并在对 binarySearch 的两次调用中使用相同的(排序)数组。除了 HotSpot 运行时优化之外,这怎么能显示任何东西?与 asList.contains 调用相同。从排序的数组创建一个列表,然后包含具有最高值的列表。当然,这需要时间。这个测试的意义是什么?更不用说是一个写得不正确的微基准
0赞 Erik 5/30/2013
此外,由于二叉搜索只能应用于排序集,因此排序和搜索是使用二叉搜索的唯一可能方法。
1赞 Vala 10/24/2013
由于许多其他原因,排序可能已经完成,例如,它可以在 init 上排序并且永远不会更改。单独测试搜索时间是有用的。然而,这的缺点在于,它不是一个不那么出色的微基准测试示例。众所周知,微基准测试在 Java 中很难正确完成,例如,在运行实际测试之前,应该包括执行足够多的测试代码以获得热点优化,更不用说使用计时器多次运行实际测试代码了。示例陷阱
9赞 Steve Kuo 1/11/2014
此测试存在缺陷,因为它在同一个 JVM 实例中运行所有 3 个测试。后面的测试可以从早期的测试中获益,这些测试预热了缓存、JIT 等
6赞 dragn 9/11/2014
这个测试实际上是完全无关的。排序和搜索是线性的(n*log(n))复杂度,二进制搜索是对数的,而ArrayUtils.contains显然是线性的。比较这些解决方案是没有用的,因为它们处于完全不同的复杂程度等级中。
14赞 not 6/11/2010 #7

实际上,如果你使用 HashSet<String>正如 Tom Hawtin 所建议的那样,你不需要担心排序,而且你的速度与在预分类数组上进行二进制搜索的速度相同,甚至可能更快。

显然,这完全取决于您的代码是如何设置的,但从我的角度来看,顺序是:

未排序的数组上:

  1. 哈希集
  2. asList(列表)
  3. 排序和二进制

在排序数组上:

  1. 哈希集
  2. 二元的
  3. asList(列表)

因此,无论哪种方式,HashSet 都是为了胜利。

评论

3赞 Skylar Saveland 7/4/2014
HashSet 成员资格应为 O(1),排序集合上的二进制搜索应为 O(log n)。
42赞 Mark Rhodes 1/20/2011 #8

除了使用快速数组初始化语法之外,您还可以使用 Arrays.asList 方法以类似的方式将其直接初始化为 List,例如:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

然后你可以做(如上所述):

STRINGS.contains("the string you want to find");
242赞 Intracer 5/31/2011 #9

您可以从 Apache Commons Lang 使用ArrayUtils.contains

public static boolean contains(Object[] array, Object objectToFind)

请注意,如果传递的数组是 ,则此方法返回。falsenull

还有一些方法可用于各种基元数组。

例:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

评论

4赞 Jason 12/8/2012
@max4ever我同意,但这仍然比“自己滚动”更好,并且比原始 java 方式更容易阅读。
2赞 slamborne 1/31/2014
包: org.apache.commons.lang.ArrayUtils
46赞 GuiSim 4/23/2014
@max4ever 有时你已经包含了这个库(出于其他原因),这是一个完全有效的答案。我一直在寻找这个,我已经依赖 Apache Commons Lang。 谢谢你的回答。
1赞 Buffalo 3/9/2015
或者你可以复制该方法(如果有的话,也可以复制depedencies)。
12赞 Kenyakorn Ketsombut 8/12/2016
@max4ever Proguard 对大多数 Android 应用程序进行了最小化,仅将您需要的类和函数放入您的应用程序中。这使得它等于滚动你自己的,或者复制apache的东西的源代码。谁不使用这种最小化,就不需要抱怨 700kb 或 78kb :)
11赞 jhodges 9/19/2012 #10

如果你有谷歌集合库,Tom的答案可以通过使用ImmutableSet(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)来简化很多

这确实消除了所建议的初始化中的许多混乱

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");
167赞 icza 9/28/2012 #11

只需手动实现即可:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

起色:

该条件在方法中是恒定的。在方法调用期间,它始终计算为相同的布尔值。因此,如果输入很大,则仅评估一次此条件会更有效,我们可以根据结果在循环中使用简化/更快的条件。改进的方法:v != nullarrayforcontains()

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

评论

9赞 icza 10/10/2012
@Phoexo 这个解决方案显然更快,因为接受的答案将数组包装成一个列表,并在该列表中调用 contains() 方法,而我的解决方案基本上执行 contains() 只会做的事情。
10赞 icza 1/15/2013
@AlastorMoody e==v 执行引用相等性检查,速度非常快。如果数组中有相同的对象(引用相同),则会更快地找到它。如果它不是同一个实例,它仍然可能与 equals() 方法声明的相同,如果引用不同,则检查这一点。
25赞 phreakhead 4/3/2013
为什么这个函数不是 Java 的一部分?难怪人们说 Java 很臃肿......看看上面的所有答案,当你只需要一个 for 循环时,它们会使用一堆库。这些天的孩子们!
4赞 Steve Kuo 1/11/2014
@phreakhead 它是 Java 的一部分,请参阅Collection.contains(Object)
12赞 Axel 2/11/2014
@icza 如果你看一下源代码,结果发现这并不一定比使用 .创建 JDK 的开销非常小,并且使用比上面所示的循环 (JDK 7) 更智能的循环(实际上它使用两个不同的循环)。ArraysArrayListArrays.asList(...).contains(...)ArrayListArrayList.contains()
5赞 Glen Best 5/20/2013 #12
  1. 对于有限长度的数组,请使用以下命令(由 camickr 给出)。这对于重复检查来说很慢,尤其是对于较长的数组(线性搜索)。

     Arrays.asList(...).contains(...)
    
  2. 在针对较大的元素集进行反复检查时,可获得快速性能

    • 数组是错误的结构。使用 TreeSet 并向其添加每个元素。它对元素进行排序并具有快速方法(二进制搜索)。exist()

    • 如果元素实现了 Comparable &,您希望对 TreeSet 进行相应的排序:

      ElementClass.compareTo()方法必须兼容:见三合会不打架?(Java Set 缺少一个项目)ElementClass.equals()

      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));
      
    • 否则,请使用您自己的比较器

      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);
      
    • 回报:检查某个元素的存在:

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

评论

4赞 Sean Owen 12/30/2013
为什么要打扰? 速度更快 (O(1)),并且不需要订购。TreeSetHashSet
2赞 Avenger 5/30/2013 #13

用于在数组中查找给定对象。Array.BinarySearch(array,obj)

例:

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

false --不存在

评论

5赞 ataylor 6/28/2013
Array.BinarySearch并且是 .NET 方法,在 Java 中不存在。Array.FindIndex
0赞 mente 8/28/2013
@ataylor java 中有 Arrays.binarySearch。但你是对的,没有 Arrays.findIndex
1赞 Dorian Gray 12/20/2019
应该注意的是:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
4赞 Mr.G 12/7/2013 #14

试试这个:

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");
}
40赞 assylias 3/13/2014 #15

使用 Java 8,您可以创建一个流并检查流中是否有任何条目匹配:"s"

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

或者作为通用方法:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

评论

4赞 skiwi 4/8/2014
还值得注意原始专业化。
0赞 mkobit 12/16/2014
另外,JavaDoc 声明它 ,因此在找到匹配项后可能不需要继续处理。anyMatch"...May not evaluate the predicate on all elements if not necessary for determining the result."
6赞 Ryan 4/8/2014 #16

使用简单的循环是最有效的方法。

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Programcreek 提供

评论

0赞 Samuel Edwin Ward 12/21/2015
如果数组在目标值之前包含 null 引用,这将引发 null 指针异常。
1赞 TheArchon 5/3/2016
if 语句应该是 : if (targetValue.equals(s)),因为 String equals 有一个 instanceof 检查器。
0赞 trilogy 8/3/2019
改用 Objects.equals(obj1,obj2) 来确保 null 安全。
97赞 Sireesh Yarlagadda 5/8/2014 #17

检查数组是否包含值的四种不同方法

  1. 用:List

    public static boolean useList(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }
    
  2. 用:Set

    public static boolean useSet(String[] arr, String targetValue) {
        Set<String> set = new HashSet<String>(Arrays.asList(arr));
        return set.contains(targetValue);
    }
    
  3. 使用一个简单的循环:

    public static boolean useLoop(String[] arr, String targetValue) {
        for (String s: arr) {
            if (s.equals(targetValue))
                return true;
        }
        return false;
    }
    
  4. 用:Arrays.binarySearch()

    下面的代码是错误的,为了完整起见,这里列出了它。binarySearch() 只能用于排序数组。你会发现下面的结果很奇怪。这是对数组进行排序时的最佳选择。

    public static boolean binarySearch(String[] arr, String targetValue) {  
        return Arrays.binarySearch(arr, targetValue) >= 0;
    }
    

快速示例:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false

评论

5赞 Will Sherwood 3/27/2015
二进制搜索示例应返回> 0;
7赞 mbelow 5/25/2016
为什么?我认为它应该返回一个> -1,因为 0 表示它包含在数组的头部。
3赞 Yoory N. 11/30/2017
第一个变体是正确的,只需检查文档,他们说“请注意,这保证了当且仅当找到密钥时,返回值将为 >= 0”。(a >= 0)
0赞 Willians Martins 5/22/2019
为什么对 String 有效而不是 int?静态布尔值 exists(int[] ints, int k) { return Arrays.asList(ints).contains(k);
4赞 SubbaRao Boddu 6/5/2014 #18

检查这个

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赞 Bernhard Barker 1/4/2018
这是行不通的 - 它将为每个不匹配的项目输入(因此,如果您在该数组中查找“AB”,它将在那里出现 3 次,因为其中 3 个值不是“AB”)。else
14赞 Zar E Ahmer 6/25/2014 #19

开发人员经常这样做:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

上面的代码有效,但不需要将列表转换为先设置。将列表转换为集合需要额外的时间。它可以像以下几点一样简单:

Arrays.asList(arr).contains(targetValue);

for (String s : arr) {
    if (s.equals(targetValue))
        return true;
}

return false;

第一个比第二个更具可读性。

6赞 Abhishek Oza 7/23/2014 #20

使用以下命令(该方法在此代码中):contains()ArrayUtils.in()

ObjectUtils.java

public class ObjectUtils {
    /**
     * A null safe method to detect if two objects are equal.
     * @param object1
     * @param object2
     * @return true if either both objects are null, or equal, else returns false.
     */
    public static boolean equals(Object object1, Object object2) {
        return object1 == null ? object2 == null : object1.equals(object2);
    }
}

ArrayUtils.java

public class ArrayUtils {
    /**
     * Find the index of of an object is in given array,
     * starting from given inclusive index.
     * @param ts    Array to be searched in.
     * @param t     Object to be searched.
     * @param start The index from where the search must start.
     * @return Index of the given object in the array if it is there, else -1.
     */
    public static <T> int indexOf(final T[] ts, final T t, int start) {
        for (int i = start; i < ts.length; ++i)
            if (ObjectUtils.equals(ts[i], t))
                return i;
        return -1;
    }

    /**
     * Find the index of of an object is in given array, starting from 0;
     * @param ts Array to be searched in.
     * @param t  Object to be searched.
     * @return indexOf(ts, t, 0)
     */
    public static <T> int indexOf(final T[] ts, final T t) {
        return indexOf(ts, t, 0);
    }

    /**
     * Detect if the given object is in the given array.
     * @param ts Array to be searched in.
     * @param t  Object to be searched.
     * @return If indexOf(ts, t) is greater than -1.
     */
    public static <T> boolean in(final T[] ts, final T t) {
        return indexOf(ts, t) > -1;
    }
}

正如您在上面的代码中看到的,还有其他实用程序方法和 ,它们在其他地方也使用过。ObjectUtils.equals()ArrayUtils.indexOf()

10赞 Christian Giménez 12/15/2014 #21

一种可能的解决方案:

import java.util.Arrays;
import java.util.List;

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

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}
10赞 Shineed Basheer 4/28/2015 #22

Java 8 中,使用 Streams。

List<String> myList =
        Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
        .filter(s -> s.startsWith("c"))
        .map(String::toUpperCase)
        .sorted()
        .forEach(System.out::println);
3赞 TheArchon 4/30/2015 #23

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.
}
1赞 mandy1339 5/18/2018 #24

创建一个初始设置为 false 的布尔值。运行循环以检查数组中的每个值,并与要检查的值进行比较。如果得到匹配项,请将 boolean 设置为 true 并停止循环。然后断言布尔值为真。

5赞 Akhil Babu Korkandi 9/22/2018 #25

如果您不希望它区分大小写

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);
-2赞 Syed Salman Hassan 8/4/2019 #26

您可以通过两种方法进行检查

A) 通过将数组转换为字符串,然后通过方法检查所需的字符串.contains

String a = Arrays.toString(VALUES);
System.out.println(a.contains("AB"));
System.out.println(a.contains("BC"));
System.out.println(a.contains("CD"));
System.out.println(a.contains("AE"));

B) 这是一种更有效的方法

Scanner s = new Scanner(System.in);

String u = s.next();
boolean d = true;
for (int i = 0; i < VAL.length; i++) {
    if (VAL[i].equals(u) == d)
        System.out.println(VAL[i] + " " + u + VAL[i].equals(u));
}

评论

3赞 Atuos 8/23/2019
字符串转换效率低得离谱,解决方案不正确,例如 contains(“,”) 将返回 true。
2赞 Vipul Gulhane 10/2/2019 #27

尝试使用 Java 8 谓词测试方法

这是一个完整的例子。

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赞 daparic 2/26/2020 #28

当我使用原始类型 byte 和 byte[] 处理低级 Java 时,到目前为止我得到的最好的是来自 bytes-java https://github.com/patrickfav/bytes-java 这似乎是一件很好的工作

6赞 Kaplan 3/6/2021 #29


自 Java 9 以来数组可能包含重复的最短解
VALUES

List.of(VALUES).contains(s);

评论

0赞 M. Justin 5/17/2023
Arrays.asList(VALUES).contains(s)通常比 性能更高,因为它是数组的视图,不需要将所有数组值复制到一次性列表中。List.of(VALUES).contains(s)
0赞 Kaplan 5/18/2023
@M.Justin 正如您正确指出的:用接口包装原始数组。 返回一个不可变列表,该列表是原始输入数组的副本。因此,可以更改原始列表,而不会对返回的列表产生任何副作用。asList()VALUESListList.of()VALUES
5赞 user19443549 1/12/2023 #30

在下面使用 -

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

评论

0赞 Eliezer Miron 11/1/2023
我得到“无法解析方法'contains(java.lang.String)'
0赞 Jinendra 4/17/2023 #31

您可以使用 Java Streams 来确定数组是否包含特定值。下面是一个示例:

import java.util.Arrays;

public class ArrayContainsValueExample {
    public static void main(String[] args) {
        String[] fruits = {"apple", "banana", "orange", "kiwi", "grape"};

        boolean containsOrange = Arrays.stream(fruits)
                .anyMatch("orange"::equals);

        if (containsOrange) {
            System.out.println("The array contains 'orange'");
        } else {
            System.out.println("The array does not contain 'orange'");
        }
    }
}

在上面的例子中,我们有一个名为 的字符串类型的数组。我们使用该方法来创建数组元素的流。然后,我们调用该方法来检查流中是否有任何元素与值匹配。如果任何元素与该值匹配,该方法将返回 ,指示数组包含该值。如果没有元素与该值匹配,该方法将返回 ,指示数组不包含该值。fruitsArrays.stream()anyMatch()"orange"anyMatch()trueanyMatch()false

请注意,该方法会短路,这意味着一旦找到匹配项,它就会停止处理流。这使得它对大型数组很有效,因为它不需要处理所有元素。anyMatch()

0赞 Ramkumar SP 10/30/2023 #32

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