2011-02-17 18 views
6

मुझे एक नक्शा बनाने की आवश्यकता है जिसमें दो तारों की कुंजी हो।मानचित्र में दो तारों के लिए कुंजी?

उदाहरण के लिए

कहना देता है

key = Name & Target 
value = Permission(boolean) 

मैं एक विशेष वस्तु बनाने के लिए की जरूरत है या वहाँ जावा/गूगल संग्रह या कॉमन्स संग्रह या कॉमन्स लैंग में टपल में किसी भी निर्माण है?

उत्तर

10

अपाचे कॉमन्स संग्रह MultiKey है:

map.put(new MultiKey(key1, key2), value); 

और एक MultiKeyMap:

multiKeyMap.put(key1, key2, value); 
+0

पर एक बहुत अच्छा खोज, thx के लिए आसान हो सकता है। – IAdapter

1

क्या आप यह देख रहे हैं?

String name = ... 
String target = ... 
String key = name + "_" + target; 

map.put(key, value) 

वैकल्पिक रूप से आप एक वस्तु है जो दो तार पकड़ बना सकते हैं और सरल स्ट्रिंग संयोजन से बेहतर तरीके से अलग करने के लिए hashCode और equals दिनचर्या ओवरराइड कर सकते हैं।

+0

यह सबसे अच्छा समाधान नहीं हो सकता है, नाम = 'ab' और target = 'c' उसी प्रविष्टि पर नाम = 'ए' और लक्ष्य = 'बीसी' के रूप में इंगित करेगा। सही समाधान नहीं है लेकिन उन तारों को कुछ असामान्य स्ट्रिंग से अलग किया जा सकता है। –

5

क्यों आप उन दो स्ट्रिंग्स से List नहीं बनाते और Map में कुंजी के रूप में उपयोग नहीं करते हैं। यह कोड को और भी पठनीय रखेगा।

+0

कृपया सुझाए गए समाधान के लिए एक कामकाजी उदाहरण पोस्ट करें, यह – Deepak

3

आप कर सकते थे बिल्ली एक साथ तार लेकिन मेरी निजी पसंद एक छोटे मूल्य वस्तु बनाने के लिए है:

public class NameTarget { 
    private final String name; 
    private final String target; 

    public NameTarget(String name, String target){ 
     this.name = name; 
     this.target = target; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     result = prime * result + ((target == null) ? 0 : target.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     NameTarget other = (NameTarget) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     if (target == null) { 
      if (other.target != null) 
       return false; 
     } else if (!target.equals(other.target)) 
      return false; 
     return true; 
    } 

    // add getters here 
} 

इसमें उत्पन्न होने में लगभग 30 सेकंड लग गए o ग्रहण में, यह लंबे समय तक काम करने के लिए एक और प्रकार के सुरक्षित और क्लीनर कोड के लिए बनाता है।

आप और मैंने अतीत में Pair स्टाइल टर्पल बनाया है लेकिन मैं इस तरह की चीज़ के लिए नामित अपरिवर्तनीय मूल्य प्रकारों को प्राथमिकता देना शुरू कर रहा हूं।

+0

30 सेकंड की पुष्टि कर सकते हैं - आप मैन्युअल रूप से एक पैकेज नाम, एक वर्ग का नाम और दो विशेषताओं को लिखते हैं, बाकी को स्वत: उत्पन्न किया जाता है (ग्रहक, गेटर, सेटटर, हैशकोड, टोस्टिंग और बराबर के लिए कार्यान्वयन) –

+0

30 सेकंड से अधिक समय लेता है मेरी अंग्रेजी को सही करें –

+1

यह गति के बारे में नहीं है, लेकिन पठनीयता के बारे में है। मल्टीकी, जोड़ी, या सिर्फ एक सूची वास्तव में कुंजी का प्रतिनिधित्व करने के बारे में कुछ भी नहीं कहती है। और यदि आपको इन दो तारों को एक कुंजी के रूप में उपयोग करने की आवश्यकता है, तो उनके पास शायद एक कार्यात्मक अर्थ हो। कुछ दुर्लभ मामलों में, अर्थ का प्रतिनिधित्व करने के लिए केवल एक मान प्रकार में एक मूल्य को लपेटना भी उपयोगी होता है। –

संबंधित मुद्दे