Koleksiyondan maksimum değer nasıl elde edilir (örneğin ArrayList)?


134

Tamsayı değerlerini saklayan bir ArrayList vardır. Bu listedeki maksimum değeri bulmam gerekiyor. Örneğin, arrayList depolanan değerlerinin: olduğunu 10, 20, 30, 40, 50ve maksimum değerin olacağını varsayalım 50.

Maksimum değeri bulmanın etkili yolu nedir?

@Düzenle: Çok emin olmadığım bir çözüm buldum

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

Integer i = Collections.max(arrayList)

ve bu en yüksek değeri döndürür.

Her bir değeri karşılaştırmanın başka bir yolu, örneğin selection sort or binary sort algorithm  


2
Değeri bulmaya çalıştınız mı? Nerede sıkışıp kaldın? Kendi çözümünüz belki çok verimsiz mi?
Anthony Pegram

1
Çok fazla yaptığınız bir şeyse, Java onu montaj için derler, bu yüzden aptalca bir şey yapmazsanız, kodunuz sadece basit bir yineleyici ile oldukça verimli olacaktır.
Bill K

@AnthonyPegram: Yani hangi sıralama algoritması veya java'da herhangi bir yöntem var mı? BTW, gotomanners'ın cevabını kontrol edin.
user1010399


Yanıtlar:


292

Collections APIİstediğinizi kolayca elde etmek için kullanabilirsiniz - verimli bir şekilde okuyun - Koleksiyonlar için yeterli Javadoc.max

Collections.max(arrayList);

Öğelerinin doğal sıralamasına göre, verilen koleksiyonun maksimum öğesini döndürür. Koleksiyondaki tüm öğeler, Karşılaştırılabilir arabirimi uygulamalıdır.


8
Neden kabul edilen cevap bu? O var değil en verimli çözüm. En iyi durum, O (n log (n)) ve hepsini kontrol ederek maksimumu seçmek sadece O (n)
Brendan Long

Evet, listeyi yinelemek, O(n log(n))ancak "Etkili bir yol yoksa" hepsini kontrol etmekten başka daha iyi bir çözüm olarak ne öneriyorsunuz?
gotomanners

Saf bir şekilde yineleme, ilk öğeyi sıralamaktan ve almaktan veya maks. Hem sort + take first hem de max bir lambda kullandı.
majTheHero

31

Bu soru neredeyse bir yaşında, ancak nesneler için özel bir karşılaştırıcı yaparsanız, bir dizi nesne listesi için Collections.max'ı kullanabileceğinizi buldum.

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());

Takvim türleri için özel bir karşılaştırıcıya ihtiyacınız var mı?
tatmanblue

Kodunuz listedeki en küçük değeri döndürür, eğer (a.getPopulation ()> b.getPopulation ()) -1 döndürürse; Yukarıdakiler, eğer (a.getPopulation () <b.getPopulation ()) -1 döndürürse değiştirilmelidir; // önce en yüksek değer
Chandrakanth Gowda

Bu bir lambda kullanılarak da yapılabilir: maxElement = Collections.max (koleksiyon, (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;
}

Benim anlayışıma göre, bu temelde Collections.max () 'ın yaptığı şeydir, ancak listeler genel olduğundan bir karşılaştırıcı kullanırlar.


Bu benim durumum için her şeyden daha hızlı.
majTheHero

14

Basitçe kullanabiliriz Collections.max()ve Collections.min()yöntemi.

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 sınıfı, Comparable'ı uygular, böylece Integer listesinin max veya min değerini kolayca alabiliriz.

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

Bir sınıf Comparable'ı uygulamıyorsa ve max ve min değeri bulmamız gerekiyorsa, o zaman kendi Karşılaştırıcımızı yazmalıyız.

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'de, koleksiyonlar lambda kullanılarak geliştirilmiştir. Dolayısıyla, max ve min'i bulmak aşağıdaki gibi gerçekleştirilebilir Comparator.comparing:

Kod:

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);

Çıktı:

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

5

Sıralanmamış bir listede maksimum değeri bulmanın özellikle etkili bir yolu yoktur - hepsini kontrol etmeniz ve en yüksek değeri döndürmeniz yeterlidir.


peki ya bu Tamsayı i = Collections.max(arrayList). çok emin olmasam da benim durumumdaki en yüksek değeri döndürür. ne diyosun?
user1010399

@ user1010399 - Bu tam olarak söylediğimi yapıyor - Her değeri kontrol ediyor ve en yüksek olanı döndürüyor.
Brendan Long

tamam, tamam. Teşekkürler. Bu koleksiyon yöntemi ve sıralama algoritması arasında biraz kafam karışmıştı.
user1010399

4

Akışları kullanarak bir listedeki maksimum değeri bulmanın üç yolu daha:

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());

Tüm bu yöntemler, tıpkı Collections.maxkoleksiyonun tamamında yinelendiği gibi , koleksiyonun boyutuyla orantılı zamana ihtiyaç duyarlar.


3

Java 8

Tam sayılar karşılaştırılabilir olduğundan, aşağıdaki tek satırları kullanabiliriz:

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

Nota başka nokta kullanacağımız olamaz Funtion.identity()yerine i->iolarak mapToIntbeklentiden ToIntFunctiontamamen farklı arayüz ve ilişkili değildir Function. Dahası, bu arayüzün yalnızca bir yöntemi vardır applyAsIntve hiçbir identity()yöntemi yoktur .


1

İşte fucntion

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();
    }
}



0
model =list.stream().max(Comparator.comparing(Model::yourSortList)).get();

-3

dizinizin boyutuna bağlı olarak, çok iş parçacıklı bir çözüm de işleri hızlandırabilir


Bu, soruya verilen gerçek bir cevaptan çok bir yoruma benziyor.
Pac0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.