मैं एक HashMap<String, Long> को सॉर्ट करने का प्रयास कर रहा हूं। मेरे पास छँटाई के लिए निम्नलिखित कोड है:

private static class ValueComparator implements Comparator<String>{
            HashMap<String, Long> map = new HashMap<String, Long>();

            public ValueComparator(HashMap<String, Long> map){
                this.map.putAll(map);
            }

            @Override
            public int compare(String s1, String s2) {
                if(map.get(s1) > map.get(s2)){
                    System.out.println("s1: " + s1 + "; s2: " + s2);
                    return -1;
                }
                else if (map.get(s1).equals(map.get(s2))) {
                    return 0;
                }
                else{
                    return 1;
                }
            }
        }

private static TreeMap<String, Long> sortMapByValue(HashMap<String, Long> map){
                Comparator<String> comparator = new ValueComparator(map);
                //TreeMap is a map sorted by its keys.
                //The comparator is used to sort the TreeMap by keys.
                TreeMap<String, Long> result = new TreeMap<String, Long>(comparator);
                result.putAll(map);

                System.out.println("DONE sort");
                return result;
        }

समस्या यह है, जब कई अलग-अलग कुंजियों के समान मान होते हैं, तो केवल एक कुंजी इसे अंतिम मानचित्र में बनाती है:

उदाहरण:

 public class Test  {
    public static void main(String[] args)  {
        HashMap<String, Long> hashMap = new HashMap<>();
        hashMap.put("Cat", (long) 4);
        hashMap.put("Human", (long) 2);
        hashMap.put("Dog", (long) 4);
        hashMap.put("Fish", (long) 0);
        hashMap.put("Tree", (long) 1);
        hashMap.put("Three-legged-human", (long) 3);
        hashMap.put("Monkey", (long) 2);

        System.out.println(hashMap);  //7 pairs

        System.out.println(sortMapByValue(hashMap));  //5 pairs
   }
}

मैं इसे कैसे ठीक करूं?

0
parsecer 7 अक्टूबर 2018, 04:07

1 उत्तर

सबसे बढ़िया उत्तर

मुझे नहीं लगता कि यह ठीक करने योग्य है कि आप नक्शों का उपयोग अनपेक्षित तरीके से कर रहे हैं और अनुबंध तोड़ रहे हैं। पेड़ का नक्शा कुंजी द्वारा क्रमबद्ध होने की उम्मीद कर रहा है और कुंजी अद्वितीय होने की उम्मीद है, इसलिए जब == 0 की तुलना करें तो यह नोड के मान को ओवरराइड कर देगा। आप हमेशा अपना खुद का ट्रीमैप लागू कर सकते हैं और इसे वह कर सकते हैं जो आप चाहते हैं।

मुझे यकीन नहीं है कि आप इसके साथ क्या करना चाहते हैं, लेकिन मुझे लगता है कि आपको कुछ ऐसा चाहिए

TreeMap<Long,List<String>>

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/TreeMap.java

    if (cpr != null) {
        do {
            parent = t;
            cmp = cpr.compare(key, t.key);
            if (cmp < 0)
                t = t.left;
            else if (cmp > 0)
                t = t.right;
            else
                return t.setValue(value);
        } while (t != null);
2
Charles 7 अक्टूबर 2018, 04:54