[Java]配列(array)の最小値のインデックスを取得するには?

Java

どうも、ちょげ(@chogetarou)です。

配列(array)の最小値のインデックスを取得する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

配列(array)の最小値のインデックスする方法は、3つあります。

forループ

1つ目は、forループを使う方法です。

まず、最小値のインデックスを格納する変数を用意します。

次に、配列の要素数でforループします。

ループ変数のインデックスの要素と用意した変数のインデックスの要素を比較します。

そして、小さい要素の方のインデックスを変数に格納します。

//最小値のインデックスを格納する変数
int minIndex = 0;

//array=任意の配列
for (int i = 0; i < array.length; i++) {
    minIndex = array[i] < array[minIndex] ? i : minIndex;
}

上記のforループは、用意した変数に配列(array)の最小値のインデックスを格納します。

使用例

public class Main {
    public static void main(String[] args) throws Exception {
        int[] numbers = { 3, 5, 0, 13, 9, 2 };
        
        int minIndex = 0;
        for (int i = 0; i < numbers.length; i++) {
            minIndex = numbers[i] < numbers[minIndex] ? i : minIndex;
        }
        
        System.out.println(minIndex);
    }
}
出力:
2

IntStream

2つ目は、IntStreamを使う方法です。

まず、 IntStreamをインポートします。

import java.util.stream.IntStream;

次に、IntStreamからrange()を呼び出します。

range()の第1引数に0、第2引数に配列の要素数を指定します。

range()からfilter()を呼び出します。

filter()の引数に、引数のインデックスの要素と配列の最小値の比較式を返すラムダ式を指定します。

そして、filter()からfindFirst()を指定します。

//array=配列
int min = Arrays.stream(array).min().getAsInt(); //配列の最小値を取得
int minIndex = IntStream.range(0, array.length)
    .filter(i -> min == array[i])
    .findFirst();

上記のfindFirst()は、配列(array)の最小値のインデックスを返します。

もし、配列の最小値が見つからない場合にデフォルト値を返したい場合は、orElse()を使います。

具体的には、findFirst()からorElse()を呼び出し、引数にデフォルト値を指定します。

//array=配列
int min = Arrays.stream(array).min().getAsInt();
int minIndex = IntStream.range(0, array.length)
    .filter(i -> min == array[i])
    .findFirst()
    .orElse(value); //value=デフォルト値

使用例

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) throws Exception {
        int[] numbers = { 3, 5, 0, 13, 9, 2 };
        
        int min = Arrays.stream(numbers).min().getAsInt();
        int minIndex = IntStream.range(0, numbers.length)
            .filter(i -> min == numbers[i])
            .findFirst()
            .orElse(-1);
        
        System.out.println(minIndex);
    }
}
出力:
2

リスト(ArrayList)

3つ目は、リストを使う方法です。

リスト(ArrayList)を使う方法は、基本の型(int, string, …)の配列とオブジェクト(Integer, String, …)の配列で異なります。

基本の型の配列

基本の型の配列の場合は、stream()を使います。

まず、 必要なものをインポートします。

import java.util.Arrays;

次に、Arraysからstream()を呼び出し、引数に配列を指定します。

stream()からboxed()、boxed()からtoList()を呼び出します。

そして、toList()からindexOf()を呼び出し、引数に最小値を指定します。

//array=配列
int min = Arrays.stream(array).min().getAsInt(); //配列の最小値を取得

//配列の最小値のインデックスを取得
int minIndex = Arrays.stream(array).boxed().toList().indexOf(min);

上記のindexOf()は、配列(array)の最小値のインデックスを返します。

使用例

import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws Exception {
        int[] numbers = { 3, 5, 0, 13, 9, 2 };
        
        int min = Arrays.stream(numbers).min().getAsInt();
        int minIndex = Arrays.stream(numbers).boxed().toList().indexOf(min);
        
        System.out.println(minIndex);
    }
}
出力:
2

オブジェクトの配列

オブジェクトの配列の場合は、asList()を使います。

まず、asList()を呼び出し、asList()の引数に配列を指定します。

そして、asList()の結果からindexOf()を呼び出します。

indexOf()の引数に配列の最小値を指定します。

List<T> list = Arrays.asList(array);
int minIndex = list.indexOf(Collections.min(list));

上記のindexOf()は、配列(array)の最小値のインデックスを返します。

使用例

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Integer[] numbers = { 3, 5, 0, 13, 9, 2 };
        
        List<Integer> list = Arrays.asList(numbers);
        int minIndex = list.indexOf(Collections.min(list));
        
        System.out.println(minIndex);
    }
}
出力:
2
スポンサーリンク

まとめ

配列(array)の最小値のインデックスを取得する方法は、次の3つです。

  • forループを使う方法
  • IntStreamを使う方法
    int min = Arrays.stream(array).min().getAsInt();
    int minIndex = IntStream.range(0, array.length).filter(i -> min == array[i]).findFirst();
  • リストを使う方法
    • 基本型の配列
      int min = Arrays.stream(array).min().getAsInt();
      int minIndex = Arrays.stream(array).boxed().toList().indexOf(min);
    • オブジェクトの配列
      List<T> list = Arrays.asList(array);
      int minIndex = list.indexOf(Collections.min(list));

コメント

タイトルとURLをコピーしました