2010-02-20 14 views
11

में ऑब्जेक्ट्स को कैसे ढूंढें और वापस कैसे करें हैशसेट जैवाडोक के अनुसार, हैशसेट कॉन्टैन्स केवल एक बूलियन लौटाता है। मैं हैशसेट में किसी ऑब्जेक्ट को "ढूंढ" कैसे सकता हूं और इसे संशोधित कर सकता हूं (यह एक आदिम डेटा प्रकार नहीं है)?जावा हैशसेट

मुझे लगता है कि हैशटेबल को एक() विधि है, लेकिन मैं सेट का उपयोग करना पसंद करूंगा।

+0

धन्यवाद हर कोई! मेरी ऑब्जेक्ट में वास्तव में एक लिंक की गई सूची होती है जिसे मुझे अक्सर अपडेट करने की आवश्यकता होती है, इसलिए मुझे लगता है कि मैं हर ऑब्जेक्ट अपडेट के लिए महंगी पुनरावृत्ति करने के बजाय हैशटेबल के साथ जा रहा हूं। – user276712

उत्तर

11

आप एक तत्व को हटा सकते हैं और एक अलग जोड़ सकते हैं।

किसी ऑब्जेक्ट को एक हैश सेट में रखते हुए संशोधित करना आपदा के लिए एक नुस्खा है (यदि संशोधन हैश मान या समानता व्यवहार को बदलता है)।

+1

यह पूरी तरह से सच नहीं है। यदि परिवर्तन ऑब्जेक्ट की समानता (और हैश कोड) को प्रभावित नहीं करता है तो हैशसेट तत्व को संशोधित करना सुरक्षित है। उदाहरण के लिए, यदि बराबर और हैशकोड ओवरराइड नहीं किया गया था, तो परिवर्तन करना सुरक्षित है क्योंकि इसकी समानता नहीं बदली गई है। –

+2

हां, और यही कारण है कि मैंने भाग कोष्ठक में लिखा था। – starblue

2

आप अपनी वस्तु को खोजने के लिए सेट के माध्यम से पुन: प्रयास कर सकते हैं।

API doc हालांकि से चेतावनी का एक शब्द:

"ध्यान दें: अगर परिवर्तनशील वस्तुओं सेट तत्व के रूप में इस्तेमाल कर रहे हैं बहुत ध्यान प्रयोग किया जाना चाहिए एक सेट के व्यवहार निर्दिष्ट नहीं है, तो एक वस्तु का मूल्य है। इस तरह से बदल दिया गया है कि वस्तु तुलना के बराबर होती है जबकि वस्तु सेट में एक तत्व है। "

+2

"आप पुन: प्रयास कर सकते हैं ..." लेकिन निश्चित रूप से यदि आप ऐसा करते हैं, तो सेट तत्व अपडेट करना 'ओ (एन)' ऑपरेशन बन जाता है। –

12

शेयर सूर्य java.util.HashSet के स्रोत के शब्दों में:

public class HashSet<E> 
    extends AbstractSet<E> 
    implements Set<E>, Cloneable, java.io.Serializable 
{ 
    static final long serialVersionUID = -5024744406713321676L; 

    private transient HashMap<E,Object> map; 

तो तुम एक नक्शे के लिए भुगतान कर रहे हैं, तो आप के रूप में अच्छी इसका इस्तेमाल हो सकता है।

+3

मुझे लगता है कि आप "हैश मैप का उपयोग करें" कहने की कोशिश कर रहे हैं ... सही? :-) –

+5

हां। क्षमा करें, कभी-कभी मैं उत्तर से थोड़ा पहेली बनाने के आग्रह का विरोध नहीं कर सकता। – bmargulies

0
Object oldobj; //object to modify 
if (hashset.remove(oldobj)) { 
    Object newobj; //modified object 
    hashset.add(newobj); 
} 
0

कुछ की तरह:

MyObject obj = new MyObject(); 
HashSet hashSet = new HashSet(); 
hashSet.add(obj); 

if (hashSet.contains(obj) == true) { 
    hashSet.remove(obj); 
    obj.setSomething(); 
    hashSet.add(obj); 
} 
+3

1. '== true' - अनावश्यक है 2. आपने' .remove (obj) ' 3. के वापसी मूल्य की जांच नहीं की है।" अगर आप अगले चरण –

+1

पर हटा रहे हैं तो अनावश्यक है तथ्य यह सब सच है, आपको इतना पसंद नहीं होना चाहिए :) – kovica

-1

मैं एक ही समस्या हुई है और निम्नलिखित समाधान के साथ आया था (यह सेट इंटरफ़ेस को लागू करना चाहिए, लेकिन नहीं सभी तरीकों यहाँ हैं)

public class MySet<T> implements Set<T>{ 

    private HashMap<T,T> items = new HashMap<T,T>(); 


    public boolean contains(Object item) 
    { 
     return items.containsKey(item); 
    } 

    public boolean add(T item) 
    { 
     if (items.containsKey(item)) 
      return false; 
     else 
     { 
      items.put(item, item); 
      return true; 
     } 
    } 

    public T get(T item) 
    { 
     return items.get(item); 
    } 
} 
+1

प्रतिनिधि को भेजने की कोई आवश्यकता नहीं है। हैशसेट के बजाय बस हैश मैप का उपयोग करें। – mostruash

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