2012-10-01 9 views
6

से कोई आइटम प्राप्त करें मेरे पास महंगे ऑब्जेक्ट्स का Set है।जावा सेट

इन ऑब्जेक्ट्स में आईडी हैं और equals समानता के लिए इन आईडी का उपयोग करता है।

इन ऑब्जेक्ट्स के प्रकार में दो निर्माता हैं; एक महंगा वस्तु के लिए, और एक जो सिर्फ आईडी सेट करता है।

तो मैं का उपयोग कर Set में कोई विशेष आईडी जांच सकता हूं या नहीं।

हालांकि, यह निर्धारित करने के बाद कि ऑब्जेक्ट सेट में है, मैं सेट में ऑब्जेक्ट उदाहरण प्राप्त नहीं कर सकता।

सेट में सटीक ऑब्जेक्ट को मैं कैसे प्राप्त कर सकता हूं?

उत्तर

4

कक्षा Eclipse Collections (पूर्व में GS Collections) का उपयोग करने पर विचार करें। यह सेट के अलावा Pool इंटरफ़ेस लागू करता है। पूल डालने और प्राप्त करने के लिए मानचित्र जैसी एपीआई जोड़ता है। पूल मानचित्र से अधिक स्मृति कुशल है क्योंकि यह मानों के लिए स्मृति को सुरक्षित नहीं करता है, केवल कुंजी।

UnifiedSet<Integer> pool = UnifiedSet.newSet(); 

Integer integer = 1; 
pool.add(integer); 

Assert.assertSame(integer, pool.get(new Integer(integer))); 

नोट: मैं ग्रहण संग्रह के लिए एक कमिटर हूं।

2

यदि HashMap आईडी के रूप में कुंजी के साथ काम नहीं करेगा, तो मैं आपकी ऑब्जेक्ट के साथ HashMap का उपयोग करूँगा, क्योंकि यह कुंजी और मूल्य दोनों के साथ होगा।

4

यदि आप संग्रह से get चाहते हैं तो आपको एक मानचित्र का उपयोग करना चाहिए।

(नोट सबसे सेट कार्यान्वयन एक मानचित्र के लिए रैपर हैं)

Map<Key, Value> map = new .... 

Value value = map.get(new Key(ID)); 

आपके मामले में, कुंजी और मान एक ही प्रकार हो सकता है लेकिन है कि आम तौर कुंजी के रूप में एक बुरा विचार है, एक सेट के तत्वों की तरह अपरिवर्तनीय होना चाहिए।

+0

मुझे लगता है कि कुंजी मूल्य के फ़ील्ड का उप-सेट है। यदि कुंजी इस तरह से मूल्य से ली गई है और आपके पास डुप्लिकेट कुंजी नहीं हो सकती हैं, तो आप डुप्लिकेट मान भी प्राप्त नहीं कर पाएंगे। –

0

आप एक FilterIterator अपाचे कॉमन्स संग्रह से इस्तेमाल कर सकते हैं:

Predicate eq = new EqualPredicate(new Object(ID)); 
FilterIterator filter = new FilterIterator(set.iterator(), eq); 
Object o = (Object) filter.next(); 

जाहिर है यह तक पहुँचने का एक महंगी रास्ता होने जा रहा है, लेकिन आप एक Set के प्रयोग पर तय कर रहे हैं, आप होगा किसी बिंदु पर इसे फिर से शुरू करने के लिए।

1

यहां एक हैक है जिसे आप प्राप्त करने के लिए कर सकते हैं। असल में जब आप किसी हैशसेट के भीतर खोज करने के लिए उपयोग करते हैं, तो उस ऑब्जेक्ट की बराबर विधि जिसे आप ढूंढ रहे हैं उसे हैश कोड मिलान करते समय बुलाया जाएगा। मान लीजिए कि आप अपनी खुद की वस्तुओं से निपट रहे हैं, या जिन्हें आप विस्तारित कर सकते हैं, 'बीकन सिग्नल' सेट करना मुश्किल है;) कक्षा के स्थैतिक क्षेत्र को संदर्भ के साथ समझाया गया था। और यहां आप जाते हैं, आप कॉल कर सकते हैं और यदि सत्य वापस आ गया है, तो ऑब्जेक्ट पुनर्प्राप्त करें;)

पीएस मुझे न्याय न करें

import java.util.HashSet; 
import java.util.Set; 

public class BecauseWhyNot { 

    public static void main(String[] args) { 

     Set<Poop> sewage = new HashSet<Poop>(); 

     set.add(new Poop("Morning Delight")); 
     set.add(new Poop("Hangover Doodle")); 

     System.out.println("Contains Fire Drill?: " 
      + set.contains(new Poop("Fire Drill"))); 
     System.out.println("Contains Morning Delight?: " 
      + set.contains(new Poop("Morning Delight"))); 

     if (Poop.lastlySmelled != null) 
      System.out.println("It's you lucky day: " + Poop.lastlySmelled); 
     else 
      System.out.println("Sorry, try again ;)"); 
    } 

    public static class Poop { 
     static Poop lastlySmelled = null; 

     String description; 

     Poop(String desc) { 
      description = desc; 
     } 

     @Override 
     public int hashCode() { 
      return 900913 * description.hashCode(); 
     } 

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

     public String toString() { 
      return "Poop: " + description + "!"; 
     } 
    } 
+0

यह बहुत भयानक है, लेकिन यह मुझे मुस्कान बना दिया:) –

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