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.
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;
}
}
max
dengan komparator khusus mungkin akan lebih sederhana.Untuk kelengkapannya, berikut adalah a java-8 cara melakukannya
countMap.entrySet().stream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();
atau
atau
sumber
(entry1, entry2) -> entry1.getValue() - entry2.getValue()
lebih kompak untuk pembanding.countMap.entrySet().stream().max((entry1, entry2) -> Integer.compare(entry1.getValue(), entry2.getValue())).get().getKey();
Map.Entry.comparingByValue()
bukannyaKode 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 } } } }
sumber
Satu liner sederhana menggunakan Java-8
sumber
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();
sumber
Jawaban yang mengembalikan Opsional karena peta mungkin tidak memiliki nilai maksimal jika kosong:
map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);
sumber
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()
sumber
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:
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);
sumber
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(); }
sumber
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); } }
sumber
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
jika hanya ingin mendapatkan kunci untuk peta filter
jika Anda ingin mendapatkan nilai untuk peta yang difilter
jika Anda ingin mendapatkan semua kunci seperti itu dalam daftar:
jika Anda ingin mendapatkan semua nilai seperti itu dalam daftar:
sumber
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);
sumber
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); } }
sumber
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; }
sumber
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");
sumber
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");
sumber