如何找到其中包含空元素的整数数组的最大元素的索引?

时间:2021-03-09 21:25:59

标签: java sorting arraylist indexing

我有一个 ArrayList 说:

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

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

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

您可以使用 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);

答案 2 :(得分: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;
}

答案 3 :(得分:1)

抱歉,我误读了这个问题。如果找不到最大值,我建议创建一个方法并返回 -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;
}
    

答案 4 :(得分:1)

试试下面的代码

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;
}
相关问题