コレクション(たとえば、ArrayList)から最大値を取得する方法?


134

整数値を格納するArrayListがあります。このリストで最大値を見つける必要があります。たとえば、arrayListに格納されている値が:で10, 20, 30, 40, 50あり、最大値がであるとします50

最大値を見つけるための効率的な方法は何ですか?

@編集:よくわからない1つの解決策を見つけました

ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/

Integer i = Collections.max(arrayList)

これは最高値を返します。

それぞれの値を比較する別の方法、例えば selection sort or binary sort algorithm  


2
価値を見つけようとしましたか?どこで行き詰まりましたか?あなた自身のソリューションはおそらくあまりにも非効率的ですか?
Anthony Pegram

1
それが何かを行う場合、多くの場合、Javaはそれをアセンブリにコンパイルするため、愚かなことをしない限り、コードは単純なイテレータで非常に効率的になります。
Bill K、

@AnthonyPegram:私はどのソートアルゴリズムを意味しますか、それともJavaにメソッドがありますか?ところで、gotomannersの答えを確認してください。
user1010399


回答:


292

を使用して、Collections API簡単に目的を達成できます- 効率的に読み取ります-Collections.maxに十分な Javadoc

Collections.max(arrayList);

要素の自然順序付けに従って、指定されたコレクションの最大要素を返します。コレクション内のすべての要素は、Comparableインターフェイスを実装する必要があります。


8
なぜこれが受け入れられた答えなのですか?これは最も効率的なソリューションではありません。最良のケースはO(n log(n))であり、すべてをチェックして最大値を選択するのはO(n)のみです
ブレンダンロング

はい、リストを反復処理O(n log(n))することはできますが、「特に効率的な方法がない」場合は、すべてをチェックする以外に、より良い解決策は何でしょうか。
gotomanners

単純な反復は、ソートして最初の要素を取得するか、maxを使用するよりも高速です(チェック済み、コンパレータはマップからスコアをフェッチしていました)。sort + take firstとmaxの両方がラムダを使用しました。
majTheHero

31

この質問はほぼ1年前のものですが、オブジェクトのカスタムコンパレータを作成すると、オブジェクトの配列リストにCollections.maxを使用できることがわかりました。

import java.util.Comparator;

public class compPopulation implements Comparator<Country> {
    public int compare(Country a, Country b) {
        if (a.getPopulation() > b.getPopulation())
            return -1; // highest value first
        if (a.getPopulation() == b.Population())
            return 0;
        return 1;
    }
}
ArrayList<Country> X = new ArrayList<Country>();
// create some country objects and put in the list
Country ZZ = Collections.max(X, new compPopulation());

カレンダータイプのカスタムコンパレータが必要ですか?
tatmanblue 2017

(a.getPopulation()> b.getPopulation())が-1を返す場合、コードはリストの最小値を返します。上記は、(a.getPopulation()<b.getPopulation())が-1を返す場合に変更する必要があります。//最初に最も高い値
Chandrakanth Gowda 2018年

これは、ラムダを使用して行うこともできます。maxElement = Collections.max(collection、(el1、el2)-> el1-el2);
majTheHero

22
public int getMax(ArrayList list){
    int max = Integer.MIN_VALUE;
    for(int i=0; i<list.size(); i++){
        if(list.get(i) > max){
            max = list.get(i);
        }
    }
    return max;
}

私の理解では、これは基本的にCollections.max()が行うことですが、リストは汎用的なため、コンパレータを使用しています。


私の場合、これは何よりも高速です。
majTheHero

14

Collections.max()Collections.min()メソッドを使うだけです。

public class MaxList {
    public static void main(String[] args) {
        List l = new ArrayList();
        l.add(1);
        l.add(2);
        l.add(3);
        l.add(4);
        l.add(5);
        System.out.println(Collections.max(l)); // 5
        System.out.println(Collections.min(l)); // 1
    }
}

8

IntegerクラスはComparableを実装しているため、Integerリストの最大値または最小値を簡単に取得できます。

public int maxOfNumList() {
    List<Integer> numList = new ArrayList<>();
    numList.add(1);
    numList.add(10);
    return Collections.max(numList);
}

クラスがComparableを実装せず、最大値と最小値を見つける必要がある場合は、独自のコンパレータを作成する必要があります。

List<MyObject> objList = new ArrayList<MyObject>();
objList.add(object1);
objList.add(object2);
objList.add(object3);
MyObject maxObject = Collections.max(objList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        if (o1.getValue() == o2.getValue()) {
            return 0;
        } else if (o1.getValue() > o2.getValue()) {
            return -1;
        } else if (o1.getValue() < o2.getValue()) {
            return 1;
        }
        return 0;
    }
});

7

Comparator.comparing

Java 8では、ラムダを使用してコレクションが拡張されています。したがって、maxとminを見つけるには、次のように使用します。Comparator.comparingます。

コード:

List<Integer> ints = Stream.of(12, 72, 54, 83, 51).collect(Collectors.toList());
System.out.println("the list: ");
ints.forEach((i) -> {
    System.out.print(i + " ");
});
System.out.println("");
Integer minNumber = ints.stream()
        .min(Comparator.comparing(i -> i)).get();
Integer maxNumber = ints.stream()
        .max(Comparator.comparing(i -> i)).get();

System.out.println("Min number is " + minNumber);
System.out.println("Max number is " + maxNumber);

出力:

 the list: 12 72 54 83 51  
 Min number is 12 
 Max number is 83

5

並べ替えられていないリストで最大値を見つけるための特に効率的な方法はありません。すべてをチェックして、最大値を返すだけです。


この整数はどうですかi = Collections.max(arrayList)。わからない場合でも、私の場合は最高値を返します。あなたが言うこと?
user1010399

@ user1010399-これは私が言っていることを正確に実行します-すべての値をチェックし、最高の値を返します。
ブレンダンロング

わかりました。ありがとう。このコレクションメソッドと並べ替えアルゴリズムの間で少し混乱しました。
user1010399

4

ストリームを使用して、リスト内の最大値を見つける3つの方法を次に示します。

List<Integer> nums = Arrays.asList(-1, 2, 1, 7, 3);
Optional<Integer> max1 = nums.stream().reduce(Integer::max);
Optional<Integer> max2 = nums.stream().max(Comparator.naturalOrder());
OptionalInt max3 = nums.stream().mapToInt(p->p).max();
System.out.println("max1: " + max1.get() + ", max2: " 
   + max2.get() + ", max3: " + max3.getAsInt());

これらのメソッドはすべて、と同様にCollections.max、コレクション全体を反復処理するため、コレクションのサイズに比例した時間が必要です。


3

Java 8

整数は同等なので、次の1つのライナーを使用できます。

List<Integer> ints = Stream.of(22,44,11,66,33,55).collect(Collectors.toList());
Integer max = ints.stream().mapToInt(i->i).max().orElseThrow(NoSuchElementException::new); //66
Integer min = ints.stream().mapToInt(i->i).min().orElseThrow(NoSuchElementException::new); //11

ノートへのもう一つのポイントは、我々が使用することはできませんですFuntion.identity()の代わりにi->imapToIntを期待ToIntFunction完全に異なるインタフェースであり、とは関係ありませんFunction。さらに、このインターフェースにはメソッドが1つしかなく、メソッドはapplyAsIntありませんidentity()


1

これが機能です

public int getIndexOfMax(ArrayList<Integer> arr){
    int MaxVal = arr.get(0); // take first as MaxVal
    int indexOfMax = -1; //returns -1 if all elements are equal
    for (int i = 0; i < arr.size(); i++) {
        //if current is less then MaxVal
        if(arr.get(i) < MaxVal ){
            MaxVal = arr.get(i); // put it in MaxVal
            indexOfMax = i; // put index of current Max
        }
    }
    return indexOfMax;  
}

1
package in.co.largestinarraylist;

import java.util.ArrayList;
import java.util.Scanner;

public class LargestInArrayList {

    public static void main(String[] args) {

        int n;
        ArrayList<Integer> L = new ArrayList<Integer>();
        int max;
        Scanner in = new Scanner(System.in);
        System.out.println("Enter Size of Array List");
        n = in.nextInt();
        System.out.println("Enter elements in Array List");

        for (int i = 0; i < n; i++) {
            L.add(in.nextInt());
        }

        max = L.get(0);

        for (int i = 0; i < L.size(); i++) {
            if (L.get(i) > max) {
                max = L.get(i);
            }
        }

        System.out.println("Max Element: " + max);
        in.close();
    }
}




-3

アレイのサイズによっては、マルチスレッドソリューションでも処理速度が上がる場合があります


これは、質問に対する実際の回答というより、コメントのように聞こえます。
Pac0 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.