遍历数组 - Java

34

我在想,是不是更好有一个方法,将这个Array传递给该方法,而不是每次想要检查一个数字是否在array中时都写出来。

例如:

public static boolean inArray(int[] array, int check) {

    for (int i = 0; i < array.length; i++) {
        if (array[i] == check) 
            return true;
    }

    return false;
}

提前感谢您的帮助!

5个回答

53

自Java 1.5.0(Java 5)以来,代码可以稍微简化一下。如下所示,Array和任何实现Iterator(例如Collection)的内容都可以被循环遍历:

public static boolean inArray(int[] array, int check) {
   for (int o : array){
      if (o == check) {
         return true;
      }
   }
   return false;
}

在Java 8中,您还可以这样做:

// import java.util.stream.IntStream;

public static boolean inArray(int[] array, int check) {
   return IntStream.of(array).anyMatch(val -> val == check);
}

虽然为此转换为流可能有些过度。


3
Java-8版本存在问题,Arrays.asList(array)会生成一个只含有一个元素的List<int[]>,该元素是数组本身,这并不符合预期。而且List没有anyMatch方法。请查阅Arrays.stream或IntStream.of。 - Ousmane D.
感谢 @Aominè - 已修复。 - Philip Whitehouse

12

你一定要将这个逻辑封装成一个方法。

重复相同代码没有任何好处。

而且,如果你把逻辑放在一个方法中并且它发生了改变,则只需在一个地方修改代码。

是否想使用第三方库是完全不同的决定。


8
如果您正在使用数组(纯粹是数组),则“包含”查找的时间复杂度为O(N),因为在最坏情况下,您必须遍历整个数组。现在,如果数组已排序,则可以使用二分查找,这将减少搜索时间,并增加排序的开销,时间复杂度为log(N)。
如果这是重复调用的内容,请将其放入函数中:
private boolean inArray(int[] array, int value)
{  
     for (int i = 0; i < array.length; i++)
     {
        if (array[i] == value) 
        {
            return true;
        }
     }
    return false;  
}  

2
那个函数和原帖中的函数有什么不同?另外,作为个人请求,花括号对于学习语言的人来说是一个很好的东西。 - JustinKSU
1
@JustinKSU 赞同建议在 if 语句和 for 循环中 始终 使用大括号。是的,上面的代码与 OP 的代码相同。 - jahroy
1
@JustinKSU只是复制/粘贴了原帖(这就是为什么没有大括号)。添加函数是相同的,因为不需要更改,并且回答了OP的两个问题。 - Woot4Moo

7

您可以导入org.apache.commons.lang.ArrayUtils库

这里有一个静态方法,您可以传入一个int数组和要检查的值。

contains(int[] array, int valueToFind) 检查该值是否在给定的数组中。

ArrayUtils.contains(intArray, valueToFind);

ArrayUtils API


0

使用Java 8的Stream API可以简化您的工作。

public static boolean inArray(int[] array, int check) {
    return Stream.of(array).anyMatch(i -> i == check);
}

只是你需要创建一个新的Stream来自于Array,但这样可以使用其他Stream API。在你的情况下,除非你想将其用作实用程序,否则你可能不想为一行操作创建新方法。 希望这可以帮助到你!


不要使用Stream.of,因为在这种特定情况下它不会执行您想要的操作,而应该使用IntStream.of或Arrays.stream。 - Ousmane D.
Arrays.stream(a).anyMatch(i -> i == check); 可以翻译成:使用Arrays.stream(a)将数组a转换为流并检查其中是否有任何一个元素与"check"相等。@Aominè,你能否举个例子说明如何使用 IntStream.of - Nisarg Patil
IntStream.of(array).anyMatch(i-> i ==check); 或者 Arrays.stream(array).anyMatch(i-> i ==check); - Ousmane D.
IntStream.of 接受的是 int 而非 array,是否有其他获取 IntStream 的方法? - Nisarg Patil
为什么不直接运行我建议的代码和你的代码,看看哪个有效呢? - Ousmane D.

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