【问题标题】:Iterating through array - java遍历数组 - java
【发布时间】:2013-01-23 21:21:05
【问题描述】:

我想知道是否最好有一个方法并将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;
}

提前感谢您的帮助!

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    至少从 Java 1.5.0 (Java 5) 开始,代码可以稍微清理一下。 Arrays 和任何实现 Iterator(例如 Collections)的东西都可以这样循环:

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

    虽然为此转换为流可能有点矫枉过正。

    【讨论】:

    • java-8 版本不正确,Arrays.asList(array) 将产生一个具有单个元素的 List,这不是本意的数组。列表也没有 anyMatch 方法。查看 Arrays.stream 或 IntStream.of
    • 感谢@Aominè - 已修复。
    【解决方案2】:

    你绝对应该把这个逻辑封装到一个方法中。

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

    另外,如果你将逻辑放在一个方法中并且它发生了变化,你只需要在一个地方修改你的代码。

    您是否要使用 3rd 方库是一个完全不同的决定。

    【讨论】:

      【解决方案3】:

      如果你使用一个数组(并且纯粹是一个数组),“包含”的查找是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;  
      }  
      

      【讨论】:

      • 与原帖中的功能有何不同?此外,作为个人要求,大括号对于学习语言的人来说是一件好事。
      • @JustinKSU +1 建议 总是 在 if 语句和 for 循环中使用大括号。是的,上面的代码和 OPs 代码是一样的。
      • @JustinKSU 只是复制/粘贴了 OP 的帖子(这就是为什么没有大括号的原因)。添加了与不需要更改相同的功能,它可以回答 OP 的两部分问题。
      【解决方案4】:

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

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

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

      ArrayUtils.contains(intArray, valueToFind);
      

      ArrayUtils API

      【讨论】:

        【解决方案5】:

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

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

        只是你有从Array 创建一个新的Stream 的开销,但这提供了使用其他Stream API 的机会。在您的情况下,您可能不想为单行操作创建新方法,除非您希望将其用作实用程序。 希望这会有所帮助!

        【讨论】:

        • 不要使用 Stream.of,因为在这种特定情况下它不会做你认为它会做的事情,而是使用 IntStream.of 或 Arrays.stream。
        • Arrays.stream(a).anyMatch(i -&gt; i == check); @Aominè 你能举例说明我们如何使用IntStream.of 吗?
        • IntStream.of(array).anyMatch(i-> i ==check);或 Arrays.stream(array).anyMatch(i-> i ==check);
        • IntStream.of 接受int 而不是array,还有其他获取 IntStream 的方式吗?
        • 你为什么不直接运行我建议的代码,看看哪个有效。
        猜你喜欢
        • 1970-01-01
        • 2013-03-14
        • 2017-07-11
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        相关资源
        最近更新 更多