Java Haritasındaki max Value ile ilişkili Anahtar Bulma


137

Bir haritadaki maksimum değerle ilişkili anahtarı almanın en kolay yolu nedir?

Maksimum değere karşılık gelen anahtar istediğiniz zaman Collections.max (someMap) max Anahtar dönecektir inanıyorum.

Yanıtlar:


136

Temel olarak, hem "şu anda bilinen maksimum" hem de onunla ilişkili anahtarı hatırlayarak haritanın giriş kümesi üzerinde yineleme yapmanız gerekir. (Veya elbette her ikisini de içeren giriş.)

Örneğin:

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

40
+1: Aynı maksimum değere sahip birden fazla anahtarınız olabilir. Bu döngü size ilk bulduğu şeyi verecektir.
Peter Lawrey

21
> 0'dan> = 0'a değiştirmek size en son bulduğunu verecektir
Aaron J Lang

1
Java 8 akış kullanımı artık bunu basitleştirmeye yardımcı olur mu? ör .: map.forEach ((k, v) -> ...
zkarthik

3
@zkarthik: maxÖzel bir karşılaştırıcıyla kullanmak muhtemelen daha basit olacaktır.
Jon Skeet

112

Tamlık için, işte bir yapmanın yolu

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

veya

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

veya

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

3
(entry1, entry2) -> entry1.getValue() - entry2.getValue()karşılaştırıcı için daha kompakttır.
JustABit

5
Maksimum değerle eşleşen tüm anahtarları istiyorsam ne yapmalıyım?
Mouna

4
Kompakt ama anlaşılması zor.
Lluis Martinez

1
Ayrıca Integer sınıfı tarafından sağlanan karşılaştırma yöntemini de kullanabilirsinizcountMap.entrySet().stream().max((entry1, entry2) -> Integer.compare(entry1.getValue(), entry2.getValue())).get().getKey();
Rui Filipe Pedro

3
Veya Map.Entry.comparingByValue()bunun yerine kullanabilirsiniz
Alexey Grigorev

55

Bu kod, tüm anahtarları maksimum değere sahip olarak yazdıracaktır

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
            }
        }

    }
}

47

Java-8 kullanan basit bir astar

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


3
En zarif ve minimalize edilmiş çözüm. Teşekkürler
Daniel Hári

@Samir, Lütfen Java sürümünü kontrol edin. Sleiman Jneid, Java 8
Vaibs

@Vaibs Java 8 kullanıyordum. Artık önemli değil, Hilikus'un yanıtı benim için çalıştı.
Samir

Benim için böyle çalışıyor: String max_key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
Timur Nurlygayanov

8

Uygun tanımlayarak doğrudan (açık bir ekstra döngü olmadan) nasıl yapılacağı aşağıda açıklanmıştır 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

Harita boşsa maks. Değeri olmayabileceğinden, İsteğe Bağlı döndüren bir yanıt: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);


4

Tüm tuşları maksimum değerle elde etmek için Java 8 yolu.

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

Ayrıca parallelStream()bunun yerine kullanarak paralelleştirebilirsiniz .stream()


4

Maksimum değeri ile anahtar almak için bu méthod kullanarak iki yöntem var:

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

Bir örnek olarak, giriş yöntemini kullanarak maksimum değerle giriş yapın:

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

Java 8'i kullanarak maksimum değeri içeren bir nesne elde edebiliriz:

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

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

Java 8 sürümü basit ama etkilidir! Güzel iş
Catbuilts

3

1. Akışı Kullanma

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. Collections.max () yöntemini Lambda İfadesi ile kullanma

    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. Akışı Yöntem Referansıyla Kullanma

    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. Collections.max () öğesini kullanma

    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. Basit Yinelemeyi Kullanma

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

Baldung.com üzerinden aldı baeldung.com/java-find-map-max
Sir Montes

2

Anlaması basit. Aşağıda kodunda, maxKey, max değerini tutan anahtardır.

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

1

Bu çözüm iyi mi?

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

Haritadaki Çoğunluk Elemanı / maks öğesi:

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

     } 
}

1

verilen harita

HashMap abc = yeni HashMap <> ();

tüm harita girişlerini maksimum değere sahip olsun.

minimum veya maksimum değer kümeleri için ilgili harita girişlerini almak için filtrede aşağıdaki yöntemlerden herhangi birini kullanabilirsiniz

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

sadece filtre haritasının anahtarlarını almak istiyorsan

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

filtrelenmiş haritanın değerlerini almak istiyorsanız

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

tüm bu anahtarları bir listeye almak istiyorsanız:

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

bu tür tüm değerleri bir listeye almak istiyorsanız:

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

0

Projem için Jon ve Fathah'ın çözümünün biraz değiştirilmiş bir versiyonunu kullandım. Aynı değere sahip birden fazla giriş olması durumunda, bulduğu son girişi döndürür:

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
Yalnızca kod yanıtları bu forumda genellikle kaşlarını çatmaktadır. Lütfen kodunuzun açıklamasını eklemek için cevabınızı düzenleyin. OP'nin problemini nasıl çözer?
mypetlion

-2

böyle yapabilirsin

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