2014-09-17 17 views
5

मैं इस तरह एक hashmap है:जावा अपनी key.length द्वारा, तरह हैश नक्शा() में

HashMap<String,Integer> map = new HashMap<String,Integer>(); 
map.put("java",4); 
map.put("go",2); 
map.put("objective-c",11); 
map.put("c#",2); 

अब मैं, उसके प्रमुख लंबाई से इस नक्शे को सॉर्ट करने अगर दो कुंजी लंबाई बराबर हैं चाहते हैं (उदाहरण के लिए जाओ और सी # दोनों लंबाई 2), फिर अल्फा आदेश द्वारा क्रमबद्ध। तो परिणाम मैं प्राप्त करने की उम्मीद है कुछ की तरह:

मुद्रित परिणाम: उद्देश्य-सी, 11 जावा, 4 सी #, 2 जाना, 2

यहाँ मेरे अपने attamp है, लेकिन यह does not बिल्कुल काम ...

 HashMap<String,Integer> map = new HashMap<String,Integer>(); 
      map.put("java",4); 
      map.put("go",2); 
      map.put("objective-c",11); 
      map.put("c#",2); 

     Map<String,Integer> treeMap = new TreeMap<String, Integer>(
       new Comparator<String>() { 
        @Override 
        public int compare(String s1, String s2) { 
         return s1.length().compareTo(s2.length()); 
        } 
       } 
     ); 

वास्तव में 'compareTo' विधि (नहीं संकलन करने में सक्षम हो) लाल के रूप में प्रकट .... कोई कुछ कोड उदाहरण के साथ मेरी मदद कृपया ... मैं थोड़ा भ्रमित कर रहा हूँ कॉम्पा को अनुकूलित करने के लिए तुलनित्र वर्ग का उपयोग कैसे करें ऑब्जेक्ट ...

उत्तर

12

Integer.compare(s1.length(), s2.length()); अद्यतन कोड का उपयोग संकलक शिकायत कर रहा है क्योंकि आप एक int पर compareTo फोन नहीं कर सकते हैं।

Map<String, Integer> treeMap = new TreeMap<String, Integer>(
    new Comparator<String>() { 
     @Override 
     public int compare(String s1, String s2) { 
      if (s1.length() > s2.length()) { 
       return -1; 
      } else if (s1.length() < s2.length()) { 
       return 1; 
      } else { 
       return s1.compareTo(s2); 
      } 
     } 
}); 

पहले दो की स्थिति दो String रों की लंबाई की तुलना और तदनुसार एक सकारात्मक या नकारात्मक संख्या वापसी: मानचित्र सॉर्ट करने के लिए सही तरीका निम्न है। तीसरी स्थिति String की शब्दावली से तुलना करेगी यदि उनकी लंबाई बराबर होती है।

2

क्योंकि length()compareTo विधि को परिभाषित नहीं करता है कि आपको त्रुटि क्यों दिखाई देती है। सही करने के लिए इसे नीचे

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Test { 

    public static void main(String[] args) { 

     HashMap<String,Integer> map = new HashMap<String,Integer>(); 
     map.put("java",4); 
     map.put("go",2); 
     map.put("objective-c",11); 
     map.put("c#",2); 


     Map<String,Integer> treeMap = new TreeMap<String, Integer>(
       new Comparator<String>() { 
        @Override 
        public int compare(String s1, String s2) { 
         return Integer.compare(s1.length(), s2.length()); 
        } 
       } 
     ); 

     treeMap.putAll(map); 

     System.out.println(treeMap); 
    } 
} 
+1

जब आप अपने कोड चलाने के लिए, परिणाम {C# = 2, जावा = 4, उद्देश्य-सी = 11} है। प्रश्न यह है कि "जाओ", 2 कहां है? –

+0

इस तथ्य के कारण कि ट्रीमैप तुलनाकर्ता का उपयोग कर रहा है और तुलनित्र को समान लंबाई के 2 तारों के इलाज के लिए परिभाषित किया गया है। चूंकि ओपी ट्रीमैप के साथ खेल रहा था इसलिए मैंने केवल तुलनात्मक भाग को सही करने के लिए अपना उत्तर बढ़ाया। – sol4me

+0

ओह शांत मेरे उत्तर के बारे में आप क्या सोचते हैं? चूंकि सेशन ने उल्लेख नहीं किया था कि ट्रेमैप का उपयोग करना अनिवार्य है, मैंने एक और शैली –

-1

तुलनाकारी होना चाहिए:

new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     return Integer.compare(s1.length(), s2.length()); 
    } 
} 
+3

काम नहीं करती हैं। यदि दो तार समान लंबाई के हैं, और क्रमबद्ध करने के लिए एक TreeMap का उपयोग करके, यह समान लंबाई की स्ट्रिंग कुंजी को डुप्लिकेट के रूप में और उन्हें हटा देगा। –

4

आप String#length() है, जो एक आदिम int रिटर्न कहते हैं। आपको स्थिर विधि Integer.compare(int,int) की आवश्यकता है।

Map<String,Integer> treeMap = new TreeMap<>(
     Comparator.comparingInt(String::length) 
        .thenComparing(Function.identity())); 
+0

महोदय तुम्हारा बाहर रखा गया है {}? –

+1

मेरा कोड किसी भी आउटपुट का प्रयास नहीं करता है, लेकिन यदि आप एक खाली मानचित्र के स्ट्रिंग प्रस्तुति के बारे में पूछ रहे हैं, तो आप सही हैं। –

+0

मैंने इस प्रश्न को पोस्ट किया। यदि आप http://stackoverflow.com/questions/25905445/apply-distinct-function-on-treemap –

1

तो ट्री-मैप का उपयोग कर नहीं अनिवार्य

Explantion है: आप जावा 8 पर हैं, तो आप अपने आप को लिखने का बहुत सा बचा सकता है एक Comaprator को परिभाषित करें, और अगला चरण, एक सूची परिभाषित करें ताकि हम सभी मानचित्र प्रविष्टियों को एक सूची में जोड़ सकें।

Comparator<Map.Entry<String,Integer>> byMapValues = 
     (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) ->left.getValue().compareTo(right.getValue()); 

List<Map.Entry<String,Integer>> list = new ArrayList<>(); 
list.addAll(map.entrySet()); 
Collections.sort(list, byMapValues); 
list.forEach(i -> System.out.println(i)); 

आउटपुट:

c#=2 
go=2 
java=4 
objective-c=11 

नोट: अंत में, परिभाषित Comaprator

कोड द्वारा क्रमित संख्या

के अनुसार क्रमबद्ध करने के अगर वहाँ तुलना करने की जरूरत है कुंजी के आधार पर, निम्नलिखित पंक्ति का उपयोग किया जा सकता है।

Comparator<Map.Entry<String,Integer>> byMapKeys = 
      (Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) -> left.getKey().compareTo(right.getKey()); 
1
 public int compare(String o1, String o2) { 
      return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length(); 
     } 
संबंधित मुद्दे