サンディープTiwariさん:
誰もがJavaの機能的なスタイル(ラムダ)でこれを変換することができます:
public int findSecondMin(int arr[]) {
int min = Integer.MAX_VALUE, secondMin = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (min > arr[i]) {
secondMin = min;
min = arr[i];
} else if (secondMin > arr[i]) {
secondMin = arr[i];
}
}
return secondMin;
}
私はこれ以上のフィルタを適用してみましたが、それは動作しません。
マルテハートウィッグ:
使用してIntStream
、あなたは簡単にそれをソートし、最初の要素をスキップすることができます。
public int findSecondMin(int[] arr)
{
return IntStream.of(arr).sorted().skip(1).findFirst().orElse(Integer.MAX_VALUE);
}
しかし、もちろん、あなたはストリームを使用する必要はありません。java.util.Arrays
素敵なソート方法があり、その後、あなただけの第二の要素を取ることができます。
public int findSecondMin(int[] arr)
{
Arrays.sort(arr);
return arr.length < 2 ? Integer.MAX_VALUE : arr[1];
}
全体の配列をソートを回避するために、我々はあなたのアプローチを取り、ストリーム上のカスタム化にそれを適応させることができます。
public int findSecondMin(int[] arr)
{
return IntStream.of(arr).boxed().reduce(
new int[] {Integer.MAX_VALUE, Integer.MAX_VALUE},
(mins, i) -> {
return new int[] {Math.min(i, mins[0]), Math.min(Math.max(i, mins[0]), mins[1])};
}, (mins1, mins2) -> {
int[] lesser = mins1[0] < mins2[0] ? mins1 : mins2;
int[] larger = mins1[0] < mins2[0] ? mins2 : mins1;
return new int[] {lesser[0], Math.min(lesser[1], larger[0])};
}
)[1];
}
forループベースの実装と比較すると、それが読みにくくなるかもしれませんが、並行して作業することができます。