【问题标题】:how to find the index of the maximum element of an integer array with null elements in it?如何找到其中包含空元素的整数数组的最大元素的索引?
【发布时间】:2021-06-07 19:41:43
【问题描述】:

我有一个ArrayList 说:

List<Integer> intlist= Arrays.asList(11,34,500,null,81, null);

我想得到最大值的索引。但是我里面有空元素。怎么样?

【问题讨论】:

    标签: java sorting arraylist indexing


    【解决方案1】:

    您可以检查null 元素以在循环中忽略它们:

    public static void main(String[] args) {
        System.out.println(getIndexOfMax(Arrays.asList(11,34,500,null,81, null))); //2
        System.out.println(getIndexOfMax(Arrays.asList(null,null,null,200))); //3
        System.out.println(getIndexOfMax(Arrays.asList(null,null,null))); //-1
    }
    private static int getIndexOfMax(List<Integer> list) {
        int indexOfMax = -1;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < list.size(); i++) {
            Integer num = list.get(i);
            if(num != null && num > max) {
                indexOfMax = i;
                max = num;
            }
        }
        return indexOfMax;
    }
    

    【讨论】:

    • 谢谢,但是如何获取最大元素的原始索引?
    • 我误读了这个问题,基本上你需要做的是遍历列表项,在每次迭代中检查num 是否不是null 并且大于max(设置为第一个index 开头),将最后一个更新为i
    • 输入列表为(null, null, null, 200)时失败
    • @sank 我更新了处理这个案子的答案
    【解决方案2】:

    对不起,我误读了这个问题。如果没有找到最大值,我建议创建一个方法并返回 -1。

    
    List<Integer> intlist= Arrays.asList(11,34,500,null,81, null);
    int index = getIndexForMax(intlist);
    if (index >= 0) {
         System.out.println(intlist.get(index));
    }
    

    打印

    500
    

    方法。

    public static int getIndexForMax(List<Integer> list) {
       int indx = -1; // default index
       int max = Integer.MIN_VALUE; // smallest possible value
       for (int i = 0; i < list.size(); i++) {
          if (list.get(i) != null) {
            int cv = list.get(i); 
              if (cv > max) {
                max = cv;  // save max
                indx = i; // and its index
              }
          }
       }
       return indx;
    }
        
    

    【讨论】:

    • 谢谢,但是如何获取最大元素的原始索引?
    【解决方案3】:

    您可以使用Stream 过滤掉空值,并找到最大值。如果找到最大值,您可以使用indexOf 方法在您的列表中查找该项目的索引。

    代码

    List<Integer> intlist = Arrays.asList(11, 34, 500, null, 81, null);
    
    int maxindex = intlist.stream()
                .filter(Objects::nonNull)
                .max(Integer::compare)
                .map(intlist::indexOf)
                .orElse(-1);
    
    System.out.println(maxindex);
    

    结果

    2
    

    没有找到最大 + 使用索引的替代方法

    也可以避免使用indexOf,直接使用reduce方法获取最大索引,比较所有元素,保留最大的那个。在这里,我们创建一个流来生成所有可能的索引,并使用它们来检查值是否不为空。在这个检查之后,我们减少流以只保留最大值的索引

    int maxindex = IntStream.range(0, intlist.size())
                .filter(i -> intlist.get(i) != null)
                .reduce((i, j) -> intlist.get(i) > intlist.get(j) ? i : j)
                .orElse(-1);
    
    System.out.println(maxindex);
    

    【讨论】:

      【解决方案4】:

      您可以使用Stream API 查找可以传递给List#indexOf 以获取其索引的最大值。确保将Objects::nonNull 传递给Stream#filter 以丢弃null 元素。

      import java.util.Arrays;
      import java.util.List;
      import java.util.Objects;
      
      public class Main {
          public static void main(String[] args) {
              List<Integer> intList = Arrays.asList(11, 34, 500, null, 81, null);
              int idxMax = intList.indexOf(intList.stream()
                                                  .filter(Objects::nonNull)
                                                  .max(Integer::compare)
                                                  .orElse(-1) // You can put here any value just to avoid NoSuchElementException 
                                                              // in case intList is empty. For empty intList, intlist.indexOf(that_value)
                                                              // will return -1 because that_value doesn't exist in the empty intList
                                          );
              System.out.println(idxMax);
          }
      }
      

      输出:

      2
      

      或者,

      List<Integer> intList = Arrays.asList(11, 34, 500, null, 81, null);
      int idxMax = intList.indexOf(intList.stream()
                                          .filter(Objects::nonNull)
                                          .reduce(Integer::max)
                                          .orElse(-1)
                                  );
      System.out.println(idxMax);
      

      【讨论】:

        【解决方案5】:

        试试下面的代码

        public static Integer max(List<Integer> intList) {
            if (intList == null || intList.isEmpty()) {
                throw new IllegalArgumentException("Number list must not empty !");
            }
            Integer max = intList.get(0);
            for (int i = 1; i < intList.size(); i++) {
                if (max != null && intList.get(i) != null && max < intList.get(i)) {
                    max = intList.get(i);
                }
            }
            return max;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-20
          • 2018-10-17
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          • 2011-06-25
          • 2021-11-07
          相关资源
          最近更新 更多