2012-02-13 11 views
8

में कई प्रकार के मानों वाले मानचित्र मुझे एक अजीब अनोखा परिदृश्य पूरा करना होगा। इसकी इस प्रकार के रूप में वर्णित:जावा

मैं एक मानचित्र जहां 'कुंजी' स्ट्रिंग प्रकार का हमेशा से रहे हैं डिजाइन करने के लिए किया है। हालांकि, 'वैल्यू' कुंजी में से एक के लिए स्ट्रिंग या एक सूची हो सकती है (किसी विशेष कुंजी के मूल्यों की संख्या पर निर्भर करता है। 'वैल्यू' स्ट्रिंग होगी यदि उस विशेष कुंजी में केवल एक मान है और यदि कुंजी में कई मान हैं तो इसे एक सूची होना चाहिए)। इस परिदृश्य को कैसे पूरा करें?

उदाहरण के लिए: मानचित्र में 2 कुंजी हैं अर्थात् "नाम" और "फोन नंबर"। एक व्यक्ति के पास केवल एक नाम और एकाधिक फोन नंबर हो सकते हैं। तो यहां पहली कुंजी यानी "नाम" में मूल्य के लिए 'स्ट्रिंग' प्रकार होना चाहिए, जबकि दूसरी कुंजी के लिए "फ़ोन नंबर" में मूल्य के लिए 'सूची' प्रकार होना चाहिए। इस तरह के एक मानचित्र की घोषणा कैसे करें। क्या यह संभव है?

+0

ही होमवर्क असाइनमेंट के रूप में: http://stackoverflow.com/questions/9259997/in-java-how-can-i-work-with-objects-which-can-be-either-string-or -सूचीस्ट्रिंग ??? –

उत्तर

13

Map<String, Object> जैसे कुछ करना संभव है।

लेकिन: मैं दृढ़ता से आपके डिजाइन को सोचने का सुझाव दूंगा। आपको इसके बजाय अपने लोगों के लिए कक्षा का उपयोग करना चाहिए। इस तरह आप कर सकते हैं: Map<String, Person>Person के साथ नाम, फोन नंबर और अन्य जानकारी के लिए गेटर्स और सेटर्स हैं।

उदाहरण Person वर्ग:

public class Person { 

    private String name; 
    private List<String> phoneNumbers = Collections.emptyList(); 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setPhoneNumbers(List<String> phoneNumbers) { 
     this.phoneNumbers = phoneNumbers; 
    } 

    public void addPhoneNumber(String number) { 
     phoneNumbers.add(number); 
    } 

    public List<String> getPhoneNumbers() { 
     return phoneNumbers; 
    } 
} 
0

क्यों एक PhoneNumber आवरण वर्ग कि या तो एक या multipel फोन नंबर soring के लिए एक API को उजागर करता है और उसके बाद या तो एक या सभी (एकाधिक) फ़ोन नंबरों को पुनः प्राप्त करने के लिए और फिर कर सकते हैं नहीं कर स्ट्रिंग और फोन नम्बर का नक्शा? कुछ की तरह:

class PhoneNumber { 


    private String[] phoneNumbers; 


    public void storePhoneNumber(String... phoneNumbers) { 
    this.phoneNumbers = phoneNumbers; 
    } 

    public String getPhoneNumber() { 
    if(phoneNumbers.length>=1) { 
     return phoneNumbers[0]; 
    } else { 
     return null; 
    } 

    } 

    public List<String> getPhoneNumbers() { 
    if(phoneNumbers!=null) { 
     return Arrays.asList(phoneNumbers); 
    } else { 
     return null; 
    } 

    } 

}

2

बेशक वहाँ है। अपना जहर चुनें:

Map<String, Object> mixed = new HashMap<String, Object>(); 

Map<String, Serializable> mixed = new HashMap<String, Serializable>(); 

@SuppressWarnings("rawtypes") 
Map mixed = new HashMap(); 
1

ठीक है, Map<String, List<String>> क्यों नहीं बनाते? आप हमेशा से ही अपनी सूची में एक तत्व जोड़ सकता है अगर वहाँ सिर्फ़ एक मान है या स्ट्रिंग और सूची की एक आम महाप्रकार उपयोग करते हैं, इस प्रकार आप मिलेगा

Map<String, Object> 
+0

उपयोगकर्ता इस संरचना का उपयोग करने के लिए एक तरीका मांगते हैं: '" नाम "->" सैम कुछ "," फोन नंबर "->" 1234 "," 5678 "जो अभी भी आपके उदाहरण के साथ काम नहीं करेगा। – nfechner

+2

अमरूद की 'ListMultimap'' मानचित्र > ' –

+0

@nfechner की बजाय उपयोग करने के लिए एक बेहतर संग्रह है: यह क्यों काम नहीं करेगा?वस्तु कुछ भी हो सकती है जिसे जावा में प्रदर्शित किया जा सकता है, या क्या मुझे यहां कुछ याद आ रहा है? – bvanvelsen

1

मैं निम्न में से एक करना होगा:

  1. Multimap<String, String> का उपयोग करें। Multimap में प्रत्येक कुंजी से जुड़े एक या अधिक मान होंगे।

  2. Map<String, Either<String, List<String>>> का उपयोग करें। एक या एकाधिक मानों के बीच अंतर करने के लिए Either का उपयोग करें।