Java の List 要素の置き換え(List の set メソッド実行)でも要件がない限り、
List のインデックスを求める要件などないであろう。
Integer List の最大値のインデックス
IntStream の reduce で求める
Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce( (a, b) -> list.get(a) >= list.get(b) ? a : b ); // res.get();
同じ値の最大値がある場合、
>= で判定しているので、最初に検出するインデックスが適用される。
> で判定した場合、最後に検出するインデックスが適用される。
同様に最小値のインデックスは、
Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce( (a, b) -> list.get(a) <= list.get(b) ? a : b ); // res.get();
同じ値の最小値がある場合、
<= で判定しているので、最初に検出するインデックスが適用される。
< で判定した場合、最後に検出するインデックスが適用される。
Comparable での書き方、⇒BigDecimalの例
最大値のインデックス
// List<BigDecimal> list Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce( (a, b) -> list.get(a).compareTo(list.get(b)) >= 0 ? a : b ); // res.get();
compareTo( ) >= で、最初に検出するインデックス
compareTo( ) > で、最後に検出するインデックス
最小値のインデックス
Optional<Integer> res = IntStream.range(0, list.size()).boxed().reduce( (a, b) -> list.get(a).compareTo(list.get(b)) <= 0 ? a : b ); // res.get();
同じ値の最小値がある場合、
<= で判定しているので、最初に検出するインデックスが適用される。
< で判定した場合、最後に検出するインデックスが適用される。
Collections.max() ⇒ List.indexOf で求める方法
int maxIndex = list.indexOf(Collections.max(list));
indexOf なので、最初に検出するインデックスが適用される。
最後に検出するインデックスを求める場合は、lastIndexOf を使う
int lastmaxIndex = list.lastIndexOf(Collections.max(list));
任意クラスオブジェクトなど、Listの要素の最大最小の比較が、
そのままComparableを実装で求めるものでない場合、
Stream の reduce で求める方法に慣れていた方が良いみたいだ。