我有一个 ArrayList
说:
List<Integer> intlist= Arrays.asList(11,34,500,null,81, null);
我想得到最大值的索引。但我有空元素。怎么样?
答案 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;
}