次のように、配列内の最小/最大値を決定する関数を書くのは簡単です。
/**
*
* @param chars
* @return the max value in the array of chars
*/
private static int maxValue(char[] chars) {
int max = chars[0];
for (int ktr = 0; ktr < chars.length; ktr++) {
if (chars[ktr] > max) {
max = chars[ktr];
}
}
return max;
}
しかし、これはすでにどこかで行われていませんか?
Commons Langを使う(変換する)+コレクションを使う(最小/最大)
import Java.util.Arrays;
import Java.util.Collections;
import org.Apache.commons.lang.ArrayUtils;
public class MinMaxValue {
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
List b = Arrays.asList(ArrayUtils.toObject(a));
System.out.println(Collections.min(b));
System.out.println(Collections.max(b));
}
}
Arrays.asList()
は基礎となる配列をラップしているので、メモリ集約的すぎず、配列の要素に対してコピーを実行しないでください。
単に新しいJava 8 Stream
name__s を使うことができますが、int
name__を扱う必要があります。
ユーティリティクラスの stream
NAME _ メソッド Arrays
NAME _ には、使用できる IntStream
NAME _ があります。 min
NAME _ メソッドまた、 max
NAME _ 、 sum
NAME _ 、 average
NAME _ 、...とすることもできます。
getAsInt
NAME _ メソッドは、 OptionalInt
NAME _ から値を取得するために使用されます。
import Java.util.Arrays;
public class Test {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
int min = Arrays.stream(tab).min().getAsInt();
int max = Arrays.stream(tab).max().getAsInt();
System.out.println("Min = " + min);
System.out.println("Max = " + max)
}
}
== UPDATE ==
実行時間が重要で、データを一度だけ調べたい場合は、 summaryStatistics()
メソッドを次のように使用します。
import Java.util.Arrays;
import Java.util.IntSummaryStatistics;
public class SOTest {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
IntSummaryStatistics stat = Arrays.stream(tab).summaryStatistics();
int min = stat.getMin();
int max = stat.getMax();
System.out.println("Min = " + min);
System.out.println("Max = " + max);
}
}
summaryStatistics
NAME _ メソッドは 縮小演算 であり、並列化を可能にするため、この方法では古典的なループよりも優れたパフォーマンスを得ることができます。
Google Guavaライブラリ には、Chars、Ints、Longsなどのクラスにminメソッドとmaxメソッドがあります。
だからあなたは単に使用することができます:
Chars.min(myarray)
変換は不要で、おそらく効率的に実装されています。
はい、それは Collections クラスで行われます。プリミティブchar配列を手動でCharacter []に変換する必要があることに注意してください。
短いデモ:
import Java.util.*;
public class Main {
public static Character[] convert(char[] chars) {
Character[] copy = new Character[chars.length];
for(int i = 0; i < copy.length; i++) {
copy[i] = Character.valueOf(chars[i]);
}
return copy;
}
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
Character[] b = convert(a);
System.out.println(Collections.max(Arrays.asList(b)));
}
}
import Java.util.Arrays;
public class apples {
public static void main(String[] args) {
int a[] = {2,5,3,7,8};
Arrays.sort(a);
int min =a[0];
System.out.println(min);
int max= a[a.length-1];
System.out.println(max);
}
}
私は私のすべてのアプリケーションに次のようなメソッドを持つ小さなヘルパークラスがあります。
public static double arrayMax(double[] arr) {
double max = Double.NEGATIVE_INFINITY;
for(double cur: arr)
max = Math.max(max, cur);
return max;
}
IntStream
とmax()
メソッドを使えば簡単にできます。
public static int maxValue(final int[] intArray) {
return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}
range(0, intArray.length)
- intArray
に存在するのと同数の要素を持つストリームを取得する。
map(i -> intArray[i])
- ストリームのすべての要素をintArray
の実際の要素にマッピングします。
max()
- このストリームの最大要素をOptionalInt
として取得します。
getAsInt()
- OptionalInt
のラップを解除します。 (OptionalInt
が空の場合に備えて、orElse(0)
も使用できます。)
public int getMin(int[] values){
int ret = values[0];
for(int i = 1; i < values.length; i++)
ret = Math.min(ret,values[i]);
return ret;
}
import Java.util.Random;
public class Main {
public static void main(String[] args) {
int a[] = new int [100];
Random rnd = new Random ();
for (int i = 0; i< a.length; i++) {
a[i] = rnd.nextInt(99-0)+0;
System.out.println(a[i]);
}
int max = 0;
for (int i = 0; i < a.length; i++) {
a[i] = max;
for (int j = i+1; j<a.length; j++) {
if (a[j] > max) {
max = a[j];
}
}
}
System.out.println("Max element: " + max);
}
}
reduce()
による解決策:
int[] array = {23, 3, 56, 97, 42};
// directly print out
Arrays.stream(array).reduce((x, y) -> x > y ? x : y).ifPresent(System.out::println);
// get the result as an int
int res = Arrays.stream(array).reduce((x, y) -> x > y ? x : y).getAsInt();
System.out.println(res);
>>
97
97
上記のコードで、reduce()
はOptional
形式でデータを返します。これはgetAsInt()
によってint
に変換できます。
最大値を特定の数値と比較したい場合は、reduce()
に開始値を設定できます。
int[] array = {23, 3, 56, 97, 42};
// e.g., compare with 100
int max = Arrays.stream(array).reduce(100, (x, y) -> x > y ? x : y);
System.out.println(max);
>>
100
上記のコードで、最初のパラメータとしてアイデンティティ(開始値)を持つreduce()
は、アイデンティティと同じフォーマットでデータを返します。このプロパティを使用すると、このソリューションを他の配列にも適用できます。
double[] array = {23.1, 3, 56.6, 97, 42};
double max = Arrays.stream(array).reduce(array[0], (x, y) -> x > y ? x : y);
System.out.println(max);
>>
97.0
Floatを使った例:
public static float getMaxFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[data.length - 1];
}
public static float getMinFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[0];
}
これは、プリミティブ型のmin/max
メソッドを提供するユーティリティクラスです。 Primitives.Java
これは実行の約99%で最大値を得るための解決策です(より良い結果を得るために0.01を変更してください):
public static double getMax(double[] vals){
final double[] max = {Double.NEGATIVE_INFINITY};
IntStream.of(new Random().ints((int) Math.ceil(Math.log(0.01) / Math.log(1.0 - (1.0/vals.length))),0,vals.length).toArray())
.forEach(r -> max[0] = (max[0] < vals[r])? vals[r]: max[0]);
return max[0];
}
(完全に深刻ではありません)
配列の最小値/最大値を取得する基本的な方法。ソートされていない配列が必要な場合は、コピーを作成するか、最小値または最大値を返すメソッドに渡してください。そうでない場合は、ソートされた配列の方がパフォーマンスが速い場合があるため、より良い結果が得られます。
public class MinMaxValueOfArray {
public static void main(String[] args) {
int[] A = {2, 4, 3, 5, 5};
Arrays.sort(A);
int min = A[0];
int max = A[A.length -1];
System.out.println("Min Value = " + min);
System.out.println("Max Value = " + max);
}
}
配列をArrays.sort()
でソートするメソッドに渡し、メソッドが使用している配列のみをソートし、minをarray[0]
に、maxをarray[array.length-1]
に設定。