【问题标题】:How to find array index of largest value?如何找到最大值的数组索引?
【发布时间】:2014-05-19 15:43:10
【问题描述】:

上面的标题总结了我的问题,为了澄清一个例子是:

array[0] = 1
array[1] = 3
array[2] = 7  // largest
array[3] = 5

所以我想要的结果是 2,因为它包含最大的元素 7。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 这实际上是一件微不足道的事情。有很多搜索算法,你有没有尝试过?
  • 有比排序更简单(更快)的事情......
  • 我投反对票 - 我希望看到您做出一些努力。这不是一项艰巨的挑战。

标签: java arrays


【解决方案1】:

会这样做(因为我不知道任何预定义的函数来获取最高元素的索引,只有元素本身,当然你可以使用list.indexOf(element) 获取索引,但是需要转换数组列出和 2 次迭代):

maxIndex = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i] > array[maxIndex]) {
        maxIndex = i;
    }
}

【讨论】:

    【解决方案2】:

    另一种功能实现

    int array[] = new int[]{1,3,7,5};        
    
    int maxIndex =IntStream.range(0,array.length)
                  .boxed()
                  .max(Comparator.comparingInt(i -> array[i]))
                  .map(max->array[max])
                  .orElse(-1);
    

    【讨论】:

      【解决方案3】:

      请在下面找到相同的代码

      Integer array[] = new Integer[4];
      array[0] = 1;
      array[1] = 3;
      array[2] = 7;
      array[3] = 5;
      
      List < Integer > numberList = Arrays.asList(array);
      
      int index_maxNumber = numberList.indexOf(Collections.max(numberList));
      
      System.out.println(index_maxNumber);
      

      【讨论】:

        【解决方案4】:

        两行代码将有效地做到这一点

        //find the maximum value using stream API of the java 8
        
        Integer max =Arrays.stream(numbers) .max(Integer::compare).get();
        // find the index of that value
        int index  = Arrays.asList(numbers).indexOf(max);
        

        【讨论】:

        • 迄今为止最优雅的解决方案,但由于 Java 流实现,效率不高。 C# 用数组实现的 IEnumerable 接口做得更好。
        【解决方案5】:

        使用 Java 8 流:

            List<Integer> list = Arrays.asList(1, 3, 7, 5);
            IntStream.range(0, list.size())
                    .reduce((i, j) -> list.get(i) > list.get(j) ? i : j)
                    .getAsInt();
        

        【讨论】:

          【解决方案6】:
          public int getIndexOfLargest( int[] array )
          {
            if ( array == null || array.length == 0 ) return -1; // null or empty
          
            int largest = 0;
            for ( int i = 1; i < array.length; i++ )
            {
                if ( array[i] > array[largest] ) largest = i;
            }
            return largest; // position of the first largest found
          }
          

          【讨论】:

          • 你不需要存储largest
          • @Duncan,是的,但是当你这样做时它会更“可读”;)
          • 同意不同意 :-) 我认为 indexOfLargest 作为一个单一的、不言自明的变量就足够了。
          • 我不会这么想的。为免生疑问,这就是我的建议(复制到 IDE 以很好地格式化!):int indexOfLargest = 0; for ( int i = 0; i &lt; array.length; i++ ) { if ( array[i] &gt; array[indexOfLargest] ) { indexOfLargest = i; }}。与ifLoop's answer基本相同。
          • @Duncan 我会以1 开始循环,而不是0
          【解决方案7】:

          一种方法是:

           Integer[] array = new Integer[4];
              array[0] = 1;
              array[1] = 3;
              array[2] = 7;
              array[3] = 5;
          
              List<Integer> iList = Arrays.asList(array);
              System.out.println(iList.indexOf(Collections.max(iList)));
              System.out.println(iList.indexOf(Collections.min(iList)));
          

          【讨论】:

          • 这个找不到索引。
          • 如果数组已经是Integers,这是一个很好的解决方案。可悲的是,在许多情况下它不是,也没有一种愉快的方式在两者之间移动(没有外部库)。
          • 如果这些值是可重复的。
          • 如果值是可重复的,将考虑第一次出现的具有重复值的索引。
          【解决方案8】:
          int maxAt = 0;
          
          for (int i = 0; i < array.length; i++) {
              maxAt = array[i] > array[maxAt] ? i : maxAt;
          }
          

          【讨论】:

          • @Duncan 感谢您的提示,已修复此问题
          • @ifLoop,它不是固定的。循环的第一次迭代将崩溃并出现异常(-1 超出范围)...编辑:我看到您现在已经更正了。
          • @Duncan,对不起,我把你和作者搞混了——我的错。
          • 如果你用1 开始你的循环,这可能是最简洁的:) 你也不能区分空数组和一个元素数组。
          • 鲍里斯建议,从一个开始是有意义的。
          【解决方案9】:
          public int getIndexOfMax(int array[]) {
              if (array.length == 0) {
                  return -1; // array contains no elements
              }
              int max = array[0];
              int pos = 0;
          
              for(int i=1; i<array.length; i++) {
                  if (max < array[i]) {
                      pos = i;
                      max = array[i];
                  }
              }
              return pos;
          }
          

          【讨论】:

            猜你喜欢
            • 2018-04-25
            • 2016-08-21
            • 1970-01-01
            • 2019-08-21
            • 1970-01-01
            • 2018-05-05
            • 2022-01-12
            • 1970-01-01
            • 2018-10-22
            相关资源
            最近更新 更多