दिलचस्प पोस्ट
क्यों नहीं है एक XML-serializable शब्दकोश .net में है? PHP: फाइल को डाउनलोड किए बिना रिमोट फाइल आकार डेटा को Android में मुख्य गतिविधि पर वापस भेजा जा रहा है HTML + सीएसएस: अवधि के बिना आदेश की सूची? टॉमकेट का उपयोग कर एक PHP एप चलाएं? क्यों java.util.Observable एक सार वर्ग नहीं है? एंड्रॉइड: TextView.setText () का उपयोग कर एक स्ट्रिंग का रंग हिस्सा? अधिकांश पोर्ट पर सुनते समय Node.js EACCES त्रुटि आईफ़ोन: क्या हम UIWebView का उपयोग कर पीडीएफ फाइल खोल सकते हैं? एक ही दृश्य में नया Fxml लोड हो रहा है MySQL को सीएसवी आयात करें कैसे लिनक्स पर सी में निर्देशिकाओं की सूची को फिर से सूचीबद्ध करें? स्मृति गहन अनुप्रयोगों के लिए जेवीएम अधिकतम हेप आकार बढ़ाना सरल डायलॉग के साथ पायथन में फाइल चुनना लॉज 4नेट प्रोग्रामेटिक रूप से स्क्रैच से कॉन्फ़िगर कैसे करें (कोई भी कॉन्फ़िग नहीं)

उसी कुंजी के तहत कई मानों के साथ हैशमैप

क्या हम एक कुंजी और दो मानों के साथ एक हैशमैप को लागू करना संभव है बस हैशमैप के रूप में?

कृपया मेरी मदद करो, कहकर (यदि कोई रास्ता नहीं है) किसी भी तरह से एक के साथ तीन मूल्यों के भंडारण को लागू करने के लिए कोई अन्य तरीका है?

वेब के समाधान से एकत्रित समाधान "उसी कुंजी के तहत कई मानों के साथ हैशमैप"

आप ऐसा कर सकते हैं:

  1. उस मानचित्र का उपयोग करें, जिसमें मूल्य के रूप में एक सूची है। Map<KeyType, List<ValueType>>
  2. एक नया आवरण वर्ग बनाएं और मानचित्र में इस आवरण के उदाहरण दें। Map<KeyType, WrapperType>
  3. कक्षा की तरह एक ट्यूपल का उपयोग करें (बहुत सारी रैपर बनाने के लिए बचाता है) Map<KeyType, Tuple<Value1Type, Value2Type>>
  4. मल्टीप्लेप्ल नक्शे साइड-बाय-साइड का उपयोग करें।

उदाहरण

1. मूल्य के रूप में सूची के साथ मानचित्र

 // create our map Map<string, List<Person>> peopleByForename = new HashMap<string, List<Person>>(); // populate it List<Person> people = new ArrayList<Person>(); people.add(new Person("Bob Smith")); people.add(new Person("Bob Jones")); peopleByForename.put("Bob", people); // read from it List<Person> bobs = peopleByForename["Bob"]; Person bob1 = bobs[0]; Person bob2 = bobs[1]; 

इस दृष्टिकोण के साथ नुकसान यह है कि यह सूची बिल्कुल दो मानों के लिए बाध्य नहीं है।

2. आवरण वर्ग का उपयोग करना

 // define our wrapper class Wrapper { public Wrapper(Person person1, Person person2) { this.person1 = person1; this.person2 = person2; } public Person getPerson1 { return this.person1; } public Person getPerson2 { return this.person2; } private Person person1; private Person person2; } // create our map Map<string, Wrapper> peopleByForename = new HashMap<string, Wrapper>(); // populate it Wrapper people = new Wrapper() peopleByForename.put("Bob", new Wrapper(new Person("Bob Smith"), new Person("Bob Jones")); // read from it Wrapper bobs = peopleByForename["Bob"]; Person bob1 = bobs.Person1; Person bob2 = bobs.Person2; 

इस दृष्टिकोण का नुकसान यह है कि इन सभी साधारण कंटेनर वर्गों के लिए आपको बहुत सारे बायलर-प्लेट कोड लिखना होगा।

3. एक ट्यूपल का उपयोग करना

 // you'll have to write or download a Tuple class in Java, (.NET ships with one) // create our map Map<string, Tuple2<Person, Person> peopleByForename = new HashMap<string, Tuple2<Person, Person>>(); // populate it peopleByForename.put("Bob", new Tuple2(new Person("Bob Smith", new Person("Bob Jones")); // read from it Tuple<Person, Person> bobs = peopleByForename["Bob"]; Person bob1 = bobs.Item1; Person bob2 = bobs.Item2; 

यह मेरी राय में सबसे अच्छा समाधान है

4. एकाधिक नक्शे

 // create our maps Map<string, Person> firstPersonByForename = new HashMap<string, Person>(); Map<string, Person> secondPersonByForename = new HashMap<string, Person>(); // populate them firstPersonByForename.put("Bob", new Person("Bob Smith")); secondPersonByForename.put("Bob", new Person("Bob Jones")); // read from them Person bob1 = firstPersonByForename["Bob"]; Person bob2 = secondPersonByForename["Bob"]; 

इस समाधान का नुकसान यह है कि यह स्पष्ट नहीं है कि दो मैप्स संबंधित हैं, एक प्रोग्राममैटिक त्रुटि दो मैंक सिंक से बाहर निकल सकती है।

नहीं, बस एक HashMap रूप में नहीं मूल रूप से आपको एक कुंजी से एक HashMap ज़रूरत होती है जो मूल्यों का संग्रह है।

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

एक अच्छा विकल्प अपाचे कॉमन्स से मल्टीवील मैप का उपयोग करना है। विशेष कार्यान्वयन के लिए पृष्ठ के शीर्ष पर सभी ज्ञात कार्यान्वयन क्लासेस पर एक नज़र डालें।

उदाहरण:

 HashMap<K, ArrayList<String>> map = new HashMap<K, ArrayList<String>>() 

के साथ प्रतिस्थापित किया जा सकता है

 MultiValuedMap<K, String> map = new MultiValuedHashMap<K, String>(); 

इसलिए,

 map.put(key, "A"); map.put(key, "B"); map.put(key, "C"); Collection<String> coll = map.get(key); 

"ए", "बी", और "सी" को संग्रहित होने में परिणाम होगा

पेरू-पुस्तकालयों से Multimap पर एक नज़र डालें और इसका कार्यान्वयन – HashMultimap

किसी मानचित्र के समान एक संग्रह, लेकिन जो एक कुंजी के साथ एकाधिक मूल्यों को संबद्ध कर सकता है। यदि आप कॉल (के, वी) दो बार, एक ही कुंजी लेकिन विभिन्न मूल्यों के साथ कहते हैं, तो multimap में कुंजी से मैपिंग दोनों मूल्यों में है

मै Map<KeyType, Object[]> में कुंजी के साथ कई मूल्यों को जोड़ने के लिए Map<KeyType, Object[]> उपयोग करता हूं। इस तरह, मैं एक कुंजी के साथ जुड़े विभिन्न प्रकार के एकाधिक मूल्यों को स्टोर कर सकता हूं। वस्तु को डालने और पुनः प्राप्त करने के उचित क्रम को बनाए रखने के लिए आपको ध्यान रखना होगा []

उदाहरण: विचार करें, हम छात्र की जानकारी संग्रहीत करना चाहते हैं। कुंजी आईडी है, जबकि हम छात्र से जुड़े नाम, पता और ईमेल को संचित करना चाहते हैं।

  //To make entry into Map Map<Integer, String[]> studenMap = new HashMap<Integer, String[]>(); String[] studentInformationArray = new String[]{"name", "address", "email"}; int studenId = 1; studenMap.put(studenId, studentInformationArray); //To retrieve values from Map String name = studenMap.get(studenId)[1]; String address = studenMap.get(studenId)[2]; String email = studenMap.get(studenId)[3]; 
 HashMap<Integer,ArrayList<String>> map = new HashMap<Integer,ArrayList<String>>(); ArrayList<String> list = new ArrayList<String>(); list.add("abc"); list.add("xyz"); map.put(100,list); 

रिकॉर्ड के लिए, शुद्ध जेडीके 8 समाधान Map::compute पद्धति का उपयोग करना होगा:

 map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value); 

जैसे कि

 public static void main(String[] args) { Map<String, List<String>> map = new HashMap<>(); put(map, "first", "hello"); put(map, "first", "foo"); put(map, "bar", "foo"); put(map, "first", "hello"); map.forEach((s, strings) -> { System.out.print(s + ": "); System.out.println(strings.stream().collect(Collectors.joining(", "))); }); } private static <KEY, VALUE> void put(Map<KEY, List<VALUE>> map, KEY key, VALUE value) { map.compute(key, (s, strings) -> strings == null ? new ArrayList<>() : strings).add(value); } 

आउटपुट के साथ:

 bar: foo first: hello, foo, hello 

ध्यान दें कि कई थ्रेड इस डेटा संरचना तक पहुंचने के मामले में स्थिरता सुनिश्चित करने के लिए, ConcurrentHashMap CopyOnWriteArrayList और CopyOnWriteArrayList उदाहरण के लिए उपयोग किए जाने की आवश्यकता है।

हां और ना। समाधान आपके मूल्यों के लिए रैपर क्लैस बनाने के लिए है, जिसमें आपकी कुंजी के अनुरूप 2 (3, या अधिक) मान शामिल हैं

हां, इसे अक्सर multimap कहा जाता है।

देखें: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html

यदि आप स्प्रिंग फ़्रेमवर्क का उपयोग करते हैं इसमें है: org.springframework.util.MultiValueMap

अनमोडिफायबल मल्टी वैल्यू मैप बनाने के लिए:

 Map<String,List<String>> map = ... MultiValueMap<String, String> multiValueMap = CollectionUtils.toMultiValueMap(map); 

या org.springframework.util.LinkedMultiValueMap उपयोग करें

मैं पॉल की टिप्पणी पर उत्तर नहीं दे सकता इसलिए मैं यहां विद्या के लिए नई टिप्पणी कर रहा हूं:

आवरण दो वर्गों के लिए एक SuperClass क्लास होगा जो हम एक मूल्य के रूप में स्टोर करना चाहते हैं।

और आवरण वर्ग के अंदर, हम संगठनों को दो वर्ग वस्तुओं के लिए आवृत्ति चर ऑब्जेक्ट्स के रूप में रख सकते हैं।

जैसे

 class MyWrapper { Class1 class1obj = new Class1(); Class2 class2obj = new Class2(); ... } 

और हैशमैप में हम इस तरह से रख सकते हैं,

 Map<KeyObject, WrapperObject> 

रैपर ओज में कक्षा के चर होंगे: class1Obj, class2Obj

आप इसे निहित रूप से कर सकते हैं

 // Create the map. There is no restriction to the size that the array String can have HashMap<Integer, String[]> map = new HashMap<Integer, String[]>(); //initialize a key chosing the array of String you want for your values map.put(1, new String[] { "name1", "name2" }); //edit value of a key map.get(1)[0] = "othername"; 

यह बहुत सरल और प्रभावी है यदि आप इसके बजाय अलग वर्गों के मान चाहते हैं, तो आप निम्न कर सकते हैं:

 HashMap<Integer, Object[]> map = new HashMap<Integer, Object[]>(); 

एक पहचान हैशमैप का उपयोग करके किया जा सकता है, इस शर्त के अनुसार कि चाबी की तुलना == ऑपरेटर द्वारा की जाएगी और बराबर नहीं होगी ()।

मैं एक अलग वर्ग बनाने के बिना किसी भी संख्या में चर को संग्रहीत करने के लिए निम्न पसंद करता हूं I

 final public static Map<String, Map<String, Float>> myMap = new HashMap<String, Map<String, Float>>(); 

यहां उत्तर दिया गया है:):)

स्ट्रिंग कुंजी = "services_servicename"

ArrayList डेटा;

के लिए (int i = 0; i lessthen data.size (); i ++) {

  HashMap<String, String> servicesNameHashmap = new HashMap<String, String>(); servicesNameHashmap.put(key,data.get(i).getServiceName()); mServiceNameArray.add(i,servicesNameHashmap); } 

मुझे सर्वश्रेष्ठ परिणाम मिल चुके हैं

आपको सिर्फ नई हैशमैक्स की तरह ही बनाना है

हैशमैप सेवाएंनामहेशैप = नया हैशमैप ();

लूप के लिए आपका यह समान कुंजी और एकाधिक मान की तरह समान प्रभाव होगा

हैप्पी कोडिंग 🙂

मुझे ऐसा उद्देश्य सी में डाटा डिक्शनरी के साथ करने के लिए किया जाता है। यह एंड्रॉइड के लिए जावा में इसी तरह के परिणाम प्राप्त करना कठिन था। मैं एक कस्टम वर्ग का निर्माण कर रहा हूं, और फिर मेरे कस्टम क्लास के एक हैशप कर रहा हूं।

 public class Test1 { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.addview); //create the datastring HashMap<Integer, myClass> hm = new HashMap<Integer, myClass>(); hm.put(1, new myClass("Car", "Small", 3000)); hm.put(2, new myClass("Truck", "Large", 4000)); hm.put(3, new myClass("Motorcycle", "Small", 1000)); //pull the datastring back for a specific item. //also can edit the data using the set methods. this just shows getting it for display. myClass test1 = hm.get(1); String testitem = test1.getItem(); int testprice = test1.getPrice(); Log.i("Class Info Example",testitem+Integer.toString(testprice)); } } //custom class. You could make it public to use on several activities, or just include in the activity if using only here class myClass{ private String item; private String type; private int price; public myClass(String itm, String ty, int pr){ this.item = itm; this.price = pr; this.type = ty; } public String getItem() { return item; } public void setItem(String item) { this.item = item; } public String getType() { return item; } public void setType(String type) { this.type = type; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } } 

हम एकाधिक चाबियाँ या मान प्राप्त करने के लिए एक वर्ग बना सकते हैं और इस क्लास का ऑब्जेक्ट नक्शे में पैरामीटर के रूप में इस्तेमाल किया जा सकता है। आप https://stackoverflow.com/a/44181931/8065321 को संदर्भित कर सकते हैं

सबसे आसान तरीका एक Google संग्रह लाइब्रेरी का उपयोग करना होगा:

आयात करें com.google.common.collect.ArrayListMultimap; आयात करें com.google.common.collect.Multimap;

सार्वजनिक कक्षा परीक्षण {

 public static void main(final String[] args) { // multimap can handle one key with a list of values final Multimap<String, String> cars = ArrayListMultimap.create(); cars.put("Nissan", "Qashqai"); cars.put("Nissan", "Juke"); cars.put("Bmw", "M3"); cars.put("Bmw", "330E"); cars.put("Bmw", "X6"); cars.put("Bmw", "X5"); cars.get("Bmw").forEach(System.out::println); // It will print the: // M3 // 330E // X6 // X5 } 

}

maven लिंक: https://mvnrepository.com/artifact/com.google.collections/google-collections/1.0-rc2

इस पर अधिक: http://tomjefferys.blogspot.be/2011/09/multimaps-google-guava.html

लिंक्डएचशैप की कोशिश करें, नमूना:

 Map<String,String> map = new LinkedHashMap<String,String>(); map.put('1','linked');map.put('1','hash'); map.put('2','map');map.put('3','java');.. 

उत्पादन:

कुंजियाँ: 1,1,2,3

मान: लिंक, हैश, मानचित्र, जावा