Menemukan Kunci yang terkait dengan Nilai maks di Peta Jawa


148

Apa cara termudah untuk mendapatkan kunci yang terkait dengan nilai maks di peta?

Saya percaya bahwa Collections.max (someMap) akan mengembalikan Kunci maks, bila Anda menginginkan kunci yang sesuai dengan nilai maks.

Jawaban:


141

Pada dasarnya Anda perlu mengulangi set entri peta, mengingat "maksimum yang saat ini diketahui" dan kunci yang terkait dengannya. (Atau hanya entri yang berisi keduanya, tentu saja.)

Sebagai contoh:

Map.Entry<Foo, Bar> maxEntry = null;

for (Map.Entry<Foo, Bar> entry : map.entrySet())
{
    if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
    {
        maxEntry = entry;
    }
}

41
+1: Anda dapat memiliki lebih dari satu kunci dengan nilai maksimum yang sama. Loop ini akan memberi Anda yang pertama ditemukan.
Peter Lawrey

22
Mengubah> 0 menjadi> = 0 akan memberi Anda yang terakhir ditemukan
Aaron J Lang

1
Akankah penggunaan Java 8 stream membantu menyederhanakan ini lagi? mis .: map.forEach ((k, v) -> ...
zkarthik

3
@zkarthik: Menggunakan maxdengan komparator khusus mungkin akan lebih sederhana.
Jon Skeet

121

Untuk kelengkapannya, berikut adalah a cara melakukannya

countMap.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();

atau

Collections.max(countMap.entrySet(), (entry1, entry2) -> entry1.getValue() - entry2.getValue()).getKey();

atau

Collections.max(countMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getKey();

3
(entry1, entry2) -> entry1.getValue() - entry2.getValue()lebih kompak untuk pembanding.
JustABit

5
Apa yang harus saya lakukan jika saya ingin semua kunci yang cocok dengan nilai maksimal?
Mouna

4
Ringkas tapi sulit dimengerti.
Lluis Martinez

1
Anda juga dapat menggunakan metode perbandingan yang disediakan oleh kelas IntegercountMap.entrySet().stream().max((entry1, entry2) -> Integer.compare(entry1.getValue(), entry2.getValue())).get().getKey();
Rui Filipe Pedro

3
Atau Anda dapat menggunakan Map.Entry.comparingByValue()bukannya
Alexey Grigorev

57

Kode ini akan mencetak semua kunci dengan nilai maksimum

public class NewClass4 {
    public static void main(String[] args)
    {
        HashMap<Integer,Integer>map=new HashMap<Integer, Integer>();
        map.put(1, 50);
        map.put(2, 60);
        map.put(3, 30);
        map.put(4, 60);
        map.put(5, 60);
        int maxValueInMap=(Collections.max(map.values()));  // This will return max value in the Hashmap
        for (Entry<Integer, Integer> entry : map.entrySet()) {  // Itrate through hashmap
            if (entry.getValue()==maxValueInMap) {
                System.out.println(entry.getKey());     // Print the key with max value
            }
        }

    }
}

51

Satu liner sederhana menggunakan Java-8

Key key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();


3
Solusi paling elegan dan minimal. Terima kasih
Daniel Hári

@ Samir, Silakan periksa versi Java Anda. Sleiman Jneid secara eksplisit menyebutkan bahwa itu akan bekerja dengan Java 8
Vaibs

@Vaibs Saya menggunakan Java 8. Tidak masalah lagi, jawaban Hilikus berhasil untuk saya.
Samir

1
bagaimana jika ada 2 kunci seperti itu yang maks? bagaimana cara mengembalikan array nilai kunci seperti itu?
Sophie

9

Berikut ini cara melakukannya secara langsung (tanpa loop tambahan eksplisit) dengan menentukan yang sesuai Comparator:

int keyOfMaxValue = Collections.max(
                        yourMap.entrySet(), 
                        new Comparator<Entry<Double,Integer>>(){
                            @Override
                            public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
                                return o1.getValue() > o2.getValue()? 1:-1;
                            }
                        }).getKey();

6

Jawaban yang mengembalikan Opsional karena peta mungkin tidak memiliki nilai maksimal jika kosong: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);


4

Cara Java 8 untuk mendapatkan semua kunci dengan nilai maksimal.

Integer max = PROVIDED_MAP.entrySet()
            .stream()
            .max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1)
            .get()
            .getValue();

List listOfMax = PROVIDED_MAP.entrySet()
            .stream()
            .filter(entry -> entry.getValue() == max)
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

System.out.println(listOfMax);

Anda juga dapat memparalelkan dengan menggunakan parallelStream()bukannyastream()


4

Saya memiliki dua metode, menggunakan méthod ini untuk mendapatkan kunci dengan nilai maksimal:

 public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map){        
    Entry<String, Integer> maxEntry = null;
    Integer max = Collections.max(map.values());

    for(Entry<String, Integer> entry : map.entrySet()) {
        Integer value = entry.getValue();
        if(null != value && max == value) {
            maxEntry = entry;
        }
    }
    return maxEntry;
}

Sebagai contoh, dapatkan Entri dengan nilai maksimal menggunakan metode:

  Map.Entry<String, Integer> maxEntry =  getMaxEntry(map);

Menggunakan Java 8 kita bisa mendapatkan objek yang berisi nilai max:

Object maxEntry = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();      

System.out.println("maxEntry = " + maxEntry);

Versi java 8 sederhana namun efektif! Kerja bagus
Catbuilts

4

1. Menggunakan Stream

public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
    Optional<Entry<K, V>> maxEntry = map.entrySet()
        .stream()
        .max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
            .compareTo(e2.getValue())
        );

    return maxEntry.get().getKey();
}

2. Menggunakan Collections.max () dengan Lambda Expression

    public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
        Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
            .compareTo(e2.getValue()));
        return maxEntry.getKey();
    }

3. Menggunakan Stream dengan Referensi Metode

    public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
        Optional<Entry<K, V>> maxEntry = map.entrySet()
            .stream()
            .max(Comparator.comparing(Map.Entry::getValue));
        return maxEntry.get()
            .getKey();
    }

4. Menggunakan Collections.max ()

    public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
        Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
            public int compare(Entry<K, V> e1, Entry<K, V> e2) {
                return e1.getValue()
                    .compareTo(e2.getValue());
            }
        });
        return maxEntry.getKey();
    }

5. Menggunakan Iterasi Sederhana

public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
    Map.Entry<K, V> maxEntry = null;
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if (maxEntry == null || entry.getValue()
            .compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }
    return maxEntry.getKey();
}

Mengambil alih Baldung.com baeldung.com/java-find-map-max
Sir Montes

3

Mudah dimengerti. Pada kode di bawah ini, maxKey adalah kunci yang menyimpan nilai max.

int maxKey = 0;
int maxValue = 0;
for(int i : birds.keySet())
{
    if(birds.get(i) > maxValue)
    {
        maxKey = i;
        maxValue = birds.get(i);
    }
}

2

peta yang diberikan

HashMap abc = HashMap baru <> ();

dapatkan semua entri peta dengan nilai maksimum.

Anda dapat menggunakan salah satu metode di bawah ini di filter untuk mendapatkan entri peta masing-masing untuk set nilai minimum atau maksimum

Collections.max(abc.values())
Collections.min(abc.values())
Collections.max(abc.keys())
Collections.max(abc.keys())

abc.entrySet().stream().filter(entry -> entry.getValue() == Collections.max(abc.values()))

jika hanya ingin mendapatkan kunci untuk peta filter

abc.entrySet()
       .stream()
       .filter(entry -> entry.getValue() == Collections.max(abc.values()))
       .map(Map.Entry::getKey);

jika Anda ingin mendapatkan nilai untuk peta yang difilter

abc.entrySet()
      .stream()
      .filter(entry -> entry.getValue() == Collections.max(abc.values()))
      .map(Map.Entry::getvalue)

jika Anda ingin mendapatkan semua kunci seperti itu dalam daftar:

abc.entrySet()
  .stream()
  .filter(entry -> entry.getValue() == Collections.max(abc.values()))
  .map(Map.Entry::getKey)
  .collect(Collectors.toList())

jika Anda ingin mendapatkan semua nilai seperti itu dalam daftar:

abc.entrySet()
  .stream()
  .filter(entry -> entry.getValue() == Collections.max(abc.values()))
  .map(Map.Entry::getvalue)
  .collect(Collectors.toList())

1

Apakah solusi ini baik-baik saja?

int[] a = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7 };
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : a) {
Integer count = map.get(i);
map.put(i, count != null ? count + 1 : 0);
}
Integer max = Collections.max(map.keySet());
System.out.println(max);
System.out.println(map);

1

Elemen Mayoritas / elemen maks di peta:

public class Main {
     public static void main(String[] args) {
     int[] a = {1,3,4,3,4,3,2,3,3,3,3,3};
     List<Integer> list = Arrays.stream(a).boxed().collect(Collectors.toList());
     Map<Integer, Long> map = list.parallelStream()
             .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
     System.out.println("Map => " + map);
     //{1=1, 2=1, 3=8, 4=2}
     map.entrySet()
     .stream()
     .max(Comparator.comparing(Entry::getValue))//compare the values and get the maximum value
     .map(Entry::getKey)// get the key appearing maximum number of times
     .ifPresentOrElse(System.out::println,() -> new RuntimeException("no such thing"));

     /*
      * OUTPUT : Map => {1=1, 2=1, 3=8, 4=2} 
      * 3
      */
     // or in  this way 
     System.out.println(".............");
     Integer maxAppearedElement = map.entrySet()
             .parallelStream()
             .max(Comparator.comparing(Entry::getValue))
             .map(Entry::getKey)
             .get();
     System.out.println(maxAppearedElement);

     } 
}

0

Untuk proyek saya, saya menggunakan versi sedikit modifikasi dari solusi Jon dan Fathah. Dalam kasus beberapa entri dengan nilai yang sama, ini mengembalikan entri terakhir yang ditemukannya:

public static Entry<String, Integer> getMaxEntry(Map<String, Integer> map) {        
    Entry<String, Integer> maxEntry = null;
    Integer max = Collections.max(map.values());

    for(Entry<String, Integer> entry : map.entrySet()) {
        Integer value = entry.getValue();

        if(null != value && max == value) {
            maxEntry = entry;
        }
    }

    return maxEntry;
}

0
int maxValue = 0;
int mKey = 0;
for(Integer key: map.keySet()){
    if(map.get(key) > maxValue){
        maxValue = map.get(key);
        mKey = key;
    }
}
System.out.println("Max Value " + maxValue + " is associated with " + mKey + " key");

2
Jawaban kode-saja umumnya tidak disukai di forum ini. Harap edit jawaban Anda untuk menyertakan penjelasan tentang kode Anda. Bagaimana cara mengatasi masalah OP?
mypetlion

-2

kamu bisa melakukan seperti itu

HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
hm.put(1,10);
hm.put(2,45);
hm.put(3,100);
Iterator<Integer> it = hm.keySet().iterator();
Integer fk = it.next();
Integer max = hm.get(fk);
while(it.hasNext()) {
    Integer k = it.next();
    Integer val = hm.get(k);
    if (val > max){
         max = val;
         fk=k;
    }
}
System.out.println("Max Value "+max+" is associated with "+fk+" key");
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.