在浮点数组和整数数组中查找max元素索引的java通用方法
这基本上是为了避免冗余代码。我有两个不同的数组,一个是Float
类型,另一个是Integer
类型。我需要在两个数组中找到最大元素的索引,这很容易,因为我可以编写两种不同的方法,一种用于比较浮点,另一种用于比较整数
我试图改进的是只编写一个通用方法,它可以接受数组中的任何一个作为参数,并可以返回最大索引。到目前为止,我尝试过但没有成功的是:
private static int findMaxIndex(Object [] arr){
int maxIndex =(int) IntStream.range(0,arr.length)
.boxed()
.max(Comparator.comparingInt(i -> arr[i])) // getting compiler error here
.map(max->arr[max])
.orElse(-1);
return maxIndex;
}
我希望这样调用此方法:
Float [] a = {0.3f, 0.5f, 0.9f, 0.7f, 0.1f};
Integer []b = {3000, 250, 100, 2000, 2000, 10246};
int maxIndexFloatArray = findMaxIndex(a);
int maxIndexIntegerArray = findMaxIndex(b);
我很确定有更简单的方法可以做到这一点,但我现在对java代码有点生疏了。希望这能正确地解释这个问题
# 1 楼答案
你可以用老式的方式:
然后像这样称呼它:
# 2 楼答案
lambda与
reduce
比较Comparable
s对于多个最大值,返回第一个最大值的索引
如果需要最后一个最大值的索引,请将
<
更改为<=
arr
可以为空,但不能包含null
值# 3 楼答案
这一个应该做到:
您可以直接告诉编译器,您的泛型参数
T
应该是同一类型的Number
和Comparable
# 4 楼答案
这可以找到基于数字的最大值索引、所有数值类型的接口、包装类和原子包装
也可以制作findMax。如果没有数字方面,只需比较就足够了,比如字符串[]
# 5 楼答案
抓住继承层次结构“从上”,我建议
Comparable<X>
作为findMaxIndex
的输入类型。它是最通用的对象类型,您可以区分其中的“max元素”:为简单起见:希望/假设
arr
既不为null也不包含null元素!;)(否则:NPE!)。。。要像这样使用它:
印刷品: