【Java】リスト内の最大要素と最小要素の位置(インデックス)を見つける方法
リストや配列を扱う際、「最大値・最小値そのもの」だけでなく、それらがどの位置(インデックス)に存在するかを知りたいケースはよくあります。本記事では、Javaの Collections.max() / Collections.min() と線形探索(リニアサーチ)を組み合わせて、最大・最小要素の位置を特定するプログラムを解説します。
サンプルコード
import java.util.*;
import java.util.Arrays;
import java.util.Collections;
public class Demo {
// 線形探索:指定した値 t のインデックスを返す(見つからなければ -1)
public static int index_val(int my_arr[], int t) {
if (my_arr == null) {
return -1;
}
int len = my_arr.length;
int i = 0;
while (i < len) {
if (my_arr[i] == t) {
return i;
} else {
i = i + 1;
}
}
return -1;
}
public static void main(String[] args) {
Integer[] my_arr = { 34, 67, 89, 99, 45, 77 };
int[] my_int_arr = { 34, 67, 89, 99, 45, 77 };
// 最小値・最大値を取得
int min_val = Collections.min(Arrays.asList(my_arr));
int max_val = Collections.max(Arrays.asList(my_arr));
System.out.println("配列の最小値 : " + min_val);
System.out.println("配列の最大値 : " + max_val);
System.out.println("最小値の位置 : " + index_val(my_int_arr, min_val));
System.out.println("最大値の位置 : " + index_val(my_int_arr, max_val));
}
}
実行結果
配列の最小値 : 34 配列の最大値 : 99 最小値の位置 : 0 最大値の位置 : 3
プログラムの解説
このプログラムは、大きく分けて次の2つの処理で構成されています。
1. 最小値・最大値の取得
Demo クラスの main メソッドでは、まず整数の配列を定義します。Arrays.asList() でオブジェクト型の配列をリストに変換し、Collections.min() と Collections.max() に渡すことで、それぞれ最小値と最大値を簡単に取得できます。
2. 線形探索による位置の特定
index_val() メソッドは、引数として受け取った配列を先頭から順番に走査し、指定された値と一致する要素のインデックスを返す線形探索を実装しています。このメソッドに対象の配列と最小値・最大値を渡すことで、それぞれの値が配列内のどこに位置するかを特定できます。該当する要素が存在しない場合や、配列が null の場合には -1 を返すようになっている点もポイントです。
補足:計算量について
線形探索の計算量は O(n) であり、要素数に比例して処理時間が増加します。小規模なデータでは十分実用的ですが、大量のデータを扱う場合は、事前にソートしておいて二分探索(O(log n))を利用するなどの最適化も検討するとよいでしょう。
-
MongoDBで最大値と最小値を取得する方法【$max・$min演算子の使い方】
MongoDBでコレクション内の最大値・最小値を取得したい場合は、アグリゲーションフレームワーク(aggregate)と $max・$min 演算子を組み合わせるのが基本です。この記事では、実際にコレクションを作成しながら、最大値と最小値を取得する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まずは動作確認用として、数値フィールドを持つドキュメントをいくつか挿入したコレクション(maxAndMinDemo)を作成します。 > db.maxAndMinDemo.insertOne({"Value":98}); { &nbs
-
【C++】連結リスト内で指定した数Kで割り切れる最大要素と最小要素を求める方法
連結リストとは 連結リスト(リンクリスト)は、要素同士がポインタで連結された線形データ構造です。各要素(ノード)は「データ部分」と「次の要素を指すリンク(ポインタ)」を持ち、メモリ上の連続していない場所に配置されることもあります。 本記事では、データ部分と次ノードへのリンクを持つ片方向連結リストと、整数Kが与えられます。目的は、連結リスト内の要素のうち「Kで割り切れる」要素の最大値と最小値を見つけることです。線形連結リストは一方向にしか走査できないため、ヘッド(先頭)ノードから順に各ノードを訪問し、そのデータ部分がKで割り切れるかどうかを判定します。現在のノードの値が、それまでに見つかった最