একটি জাভা মানচিত্রে সর্বোচ্চ মানের সাথে সম্পর্কিত কী সন্ধান করা


137

মানচিত্রে সর্বাধিক মানটির সাথে কী যুক্ত করার সহজ উপায় কী?

আমি বিশ্বাস করি যে আপনি যখন সর্বাধিক মানের সাথে সম্পর্কিত কীটি চান তখন কালেকশন.ম্যাক্স (কিছু মানচিত্র) সর্বোচ্চ কীটি ফিরিয়ে দেবে return

উত্তর:


136

মূলত আপনাকে "বর্তমানে সর্বাধিক পরিচিত সর্বাধিক" এবং এর সাথে সম্পর্কিত কী উভয়ই মনে রেখে মানচিত্রের প্রবেশ সেটটি নিয়ে পুনরাবৃত্তি করতে হবে। (অথবা কেবলমাত্র অবশ্যই উভয়ই এন্ট্রি রয়েছে))

উদাহরণ স্বরূপ:

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: একই সর্বাধিক মান সহ আপনার একাধিক কী থাকতে পারে। এই লুপটি আপনাকে এটির প্রথমটি দেবে।
পিটার লরে

21
> 0 থেকে> = 0 পরিবর্তন করা আপনাকে এটির শেষটিটি দেবে
অ্যারোন জ্যা ল্যাং

1
জাভা 8 স্ট্রিম ব্যবহার কি এটিকে আরও সরল করতে সহায়তা করবে? উদাহরণ: map.forEach ((কে, ভি) -> ...
জাকার্থিক

3
@ জাকার্থিক: maxএকটি কাস্টম তুলকের সাথে ব্যবহার করা সম্ভবত সহজ হবে।
জন স্কিটি

112

সম্পূর্ণতার জন্য, এখানে একটি এটা করার উপায়

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

অথবা

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

অথবা

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

3
(entry1, entry2) -> entry1.getValue() - entry2.getValue()তুলনামূলক জন্য আরও কমপ্যাক্ট।
জাস্টাবিট

5
আমি যদি সর্বাধিক মানের সাথে মেলে এমন কীগুলি চাই তবে কী করব?
মৌনা

4
কমপ্যাক্ট তবে বোঝা শক্ত।
লুলু মার্টিনেজ

1
আপনি পূর্ণসংখ্যা শ্রেণীর দ্বারা সরবরাহিত তুলনা পদ্ধতিটিও ব্যবহার করতে পারেনcountMap.entrySet().stream().max((entry1, entry2) -> Integer.compare(entry1.getValue(), entry2.getValue())).get().getKey();
রুই ফিলিপ পেদ্রো

3
অথবা আপনি এর Map.Entry.comparingByValue()পরিবর্তে ব্যবহার করতে পারেন
আলেক্সি গ্রিগোরভ

55

এই কোডটি সর্বাধিক মান সহ সমস্ত কী মুদ্রণ করবে

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

জাভা -8 ব্যবহার করে একটি সাধারণ একটি লাইনার

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


3
সর্বাধিক মার্জিত এবং ন্যূনতম সমাধান। ধন্যবাদ
ড্যানিয়েল হ্যারি

@ সমীর, দয়া করে আপনার জাভা সংস্করণটি পরীক্ষা করুন। স্লেমন জেনিদ স্পষ্টভাবে উল্লেখ করেছেন যে এটি জাভা 8
ভাইবসের

@ ভাইবস আমি জাভা ৮ ব্যবহার করছিলাম It এটি আর কোনও বিষয় নয়, হিলিকাসের উত্তর আমার পক্ষে কাজ করেছে।
সমীর

এটি আমার জন্য এটির মতো কাজ করে: String max_key = Collections.max(map.entrySet(), Map.Entry.comparingByValue()).getKey();
তৈমুর নুরলিগায়ানভ

8

এখানে কিভাবে (একটি সুনির্দিষ্ট অতিরিক্ত লুপ ছাড়া) সরাসরি করবেন উপযুক্ত সংজ্ঞা দ্বারা এর 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

একটি উত্তর যা ptionচ্ছিককে ফেরত দেয় মানচিত্রের শূন্য থাকলে এর কোনও সর্বাধিক মান নাও থাকতে পারে: map.entrySet().stream().max(Map.Entry.comparingByValue()).map(Map.Entry::getKey);


4

সর্বোচ্চ মূল্য সহ সমস্ত কী পাওয়ার জন্য জাভা 8 উপায় Java

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

এছাড়াও আপনি এর parallelStream()পরিবর্তে এটি ব্যবহার করে সমান্তরাল করতে পারেনstream()


4

আমার দুটি পদ্ধতি রয়েছে, সর্বাধিক মান সহ কীটি পেতে এই মোডথরটি ব্যবহার করে:

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

উদাহরণ হিসাবে পদ্ধতিটি ব্যবহার করে সর্বাধিক মান সহ এন্ট্রি পান:

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

জাভা 8 ব্যবহার করে আমরা সর্বোচ্চ মান সম্বলিত একটি বস্তু পেতে পারি:

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

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

জাভা 8 সংস্করণ সহজ তবে কার্যকর! দুর্দান্ত কাজ
ক্যাটবিল্টস

3

1. স্ট্রিম ব্যবহার করে

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. একটি ল্যাম্বদা এক্সপ্রেশন সহ কালেকশন.ম্যাক্স () ব্যবহার করা

    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. পদ্ধতি রেফারেন্স সহ স্ট্রিম ব্যবহার করে

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

৪. কালেকশন.ম্যাক্স ব্যবহার করে ()

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

৫. সাধারণ আইট্রেশন ব্যবহার করা

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

বালডাঙ্গা ডট
স্যার মন্টেস

2

বুঝতে সহজ। কোডের নীচে ম্যাক্সকেই মূল কীটি সর্বাধিক মান ধারণ করে।

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

1

এই সমাধান কি ঠিক আছে?

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

মানচিত্রে সর্বাধিক উপাদান / সর্বাধিক উপাদান:

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

প্রদত্ত মানচিত্র

হ্যাশম্যাপ abc = নতুন হ্যাশম্যাপ <> ();

সর্বাধিক মান সহ সমস্ত মানচিত্রের এন্ট্রি পান।

আপনি ন্যূনতম বা সর্বাধিক মানগুলির সেটগুলির জন্য সংশ্লিষ্ট মানচিত্রের এন্ট্রিগুলি পেতে ফিল্টারটিতে নীচের যে কোনও পদ্ধতি ব্যবহার করতে পারেন

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

যদি কেবলমাত্র ফিল্টার মানচিত্রের কীগুলি পেতে চান

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

আপনি যদি ফিল্টারকৃত মানচিত্রের মান পেতে চান

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

আপনি যদি তালিকায় এই জাতীয় কীগুলি পেতে চান:

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

আপনি যদি একটি তালিকায় এই জাতীয় মান পেতে চান:

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

0

আমার প্রকল্পের জন্য, আমি জোনস এবং ফাতাহার সমাধানটির কিছুটা পরিবর্তিত সংস্করণ ব্যবহার করেছি। একই মান সহ একাধিক এন্ট্রিগুলির ক্ষেত্রে এটি এটি খুঁজে পাওয়া শেষ এন্ট্রি প্রদান করে:

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
কোড-কেবলমাত্র উত্তরগুলি এই ফোরামে সাধারণভাবে চিহ্নিত করা হয়। আপনার কোডটির ব্যাখ্যা অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন। এটি কীভাবে ওপির সমস্যা সমাধান করবে?
mypetlion

-2

আপনি এটা করতে পারেন

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");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.