java - मुझे इस तरह के जावा संग्रह किस प्रकार उपयोग करना चाहिए?




collections (3)

मैं जावा के लिए काफी नया हूँ और मुझे विभिन्न संग्रहों के बीच अंतर को समझने में परेशानी हो रही है। मेरे पास 19 संसाधनों की सूची है प्रत्येक संसाधन को हेक्स रंग सौंपा गया है। मैं अपने रंग के साथ एक यादृच्छिक संसाधन प्राप्त करना चाहता हूं और अपने कोड के साथ उस संसाधन का उपयोग करना चाहता हूं। एक बार जब मैं वर्तमान संसाधन के साथ समाप्त हो जाता हूं, तो मैं इसे सूची से निकालना चाहता हूं ताकि केवल कुछ खास संसाधनों का उपयोग किया जा सके।

क्या मुझे एक शब्दकोश, मानचित्र या हैशटेबल का उपयोग करना चाहिए? या कोई अन्य जो मुझे याद आ रही है


Blockquote

अगर आपको यादृच्छिक क्रम की आवश्यकता है तो आप सूची ऑब्जेक्ट के लिए जा सकते हैं।

List<String> resourceMap = new CopyOnWriteArrayList<>();
          resourceMap.add("hex1");
          resourceMap.add("hex2");
          resourceMap.add("hex3");
          resourceMap.add("hex4");
          Collections.shuffle(resourceMap);
          resourceMap.forEach(resource->{
              resourceMap.remove(resource);
          });

आप क्या कर सकते हैं, एक List में अपने संसाधनों की दुकान है, फिर बेतरतीब ढंग से इसे Collections.shuffle(List<?> list) के लिए धन्यवाद देता है। शफल Collections.shuffle(List<?> list) या shuffle(List<?> list, Random rnd) , और अंततः iterator() पर कॉल परिणामस्वरूप सूची को Iterator का एक उदाहरण प्राप्त करने के लिए कि आप सदस्य सूची में अपनी सूची पर पुनरावृति करने के लिए सक्षम हो सकते हैं (धन्यवाद hasNext() / next() ) और हटाए जाने के बाद एक बार आपके संसाधन को remove()

यहाँ एक छद्म कोड है जो String को संसाधन के रूप में उपयोग करने का विचार दिखाता है:

// Create a read/write list (Arrays.asList returns a read-only list)
List<String> resources = new ArrayList<>(Arrays.asList("1", "2", "3"));
System.out.printf("Initial state = %s%n", resources);
Collections.shuffle(resources);
System.out.printf("Permuted List = %s%n", resources);
Iterator<String> iterator = resources.iterator();
if (iterator.hasNext()) {
    String resource = iterator.next();
    // do something
    iterator.remove();
    System.out.printf("After remove = %s%n", resources);
}

आउटपुट:

Initial state = [1, 2, 3]
Permuted List = [3, 1, 2]
After remove = [1, 2]

एनबी: यह दृष्टिकोण आपके मामले में समझ में आता है क्योंकि आपके पास एक छोटी सी सूची है, कृपया ध्यान दें कि यदि आपके पास एक बड़ी सूची है और आप इसका केवल एक छोटा हिस्सा प्राप्त करने का इरादा रखते हैं, तो आपको Random से सूचकांक प्राप्त करने के लिए एक Random का उपयोग करने पर विचार करना चाहिए। अगले तत्व ( nextInt(int bound) साथ list.size() पैरामीटर के साथ) get(int index) का उपयोग करके) और Collections.shuffle(List<?> list) remove(int index) का उपयोग करके remove(int index) बजाय Collections.shuffle(List<?> list) क्योंकि यह एक ओवरहेड का कारण होगा।

ArrayList काम नहीं करेगा क्योंकि मुझे संसाधन (कुंजी) को रंग (मान) निर्दिष्ट करने की आवश्यकता है I

हाँ, यदि आप एक आवरण वर्ग की एक List का उपयोग कर सकते हैं जिसमें ये दोनों, आपका रंग और आपके संसाधन होंगे (उदाहरण के लिए, AbstractMap.SimpleImmutableEntry या केवल एक कस्टम क्लास)। यह काफी अच्छा है क्योंकि आपको संसाधन द्वारा रंग पुनः प्राप्त करने की आवश्यकता नहीं है। यदि आप ऐसा करते हैं, तो आप संसाधनों की अपनी सूची को प्रारंभ करने के लिए संसाधन के साथ कुंजी और मूल्य के रूप में एक Map रख सकते हैं और new ArrayList<>(map.keySet()) का उपयोग कर सकते हैं, तो आप पहले से लागू होने वाले आवेदन को लागू करने में सक्षम होंगे यह जवाब।


यदि आप अपने हेक्स उपयोग के आधार पर खोज (प्राप्त करें) संसाधन चाहते हैं

// Initialize
Map<String, Resource> resourceMap = new HashMap<>();
resourceMap.put("hex1", hex1Resource);
resourceMap.put("hex2", hex3Resource);
resourceMap.put("hex3", hex3Resource);

// Get specific
Resource hex2Resource = resourceMap.get("hex2");
resourceMap.remove("hex2");

यदि आप संसाधनों को अनियमित खोजना चाहते हैं, तो 2 विकल्प हैं

  • सूची का उपयोग करें (यह डुप्लिकेट की अनुमति देता है)
  • सेट का उपयोग करें (स्टोर केवल अद्वितीय मान)

सूचियों का उपयोग करना

// Initialize
List<Resource> list = new ArrayList<>();
list.add(resource1);
list.add(resource2);
list.add(resource3);

// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));

// Delete the element from list
list.remove(randomResource);

समूह का उपयोग करना

// Initialize
Set<Resource> set = new HashSet<>();
set.add(resource1);
set.add(resource2);
set.add(resource3);

// Convert to List, since Set does not have get(int) method. 
List<Resource> list = new ArrayList<>(set);

// Get random
Random rand = new Random();
Resource randomResource = list.get(rand.nextInt(list.size()));

// Delete the element from list
list.remove(randomResource);

नोट : उपर्युक्त दोनों मामलों के लिए, संसाधन वर्ग के तरीकों को बराबर और हैशोड लागू करने की आवश्यकता होगी ताकि सूची / सेट तत्वों की तुलना कर सकें और सही तरीके से काम करें। जावा बराबर और हैशोड देखें

अद्यतन : समूह के पास (इंट) विधि नहीं है इसे ठीक करने के लिए कोड अपडेट किया गया।





collections