मेरे पास निम्न जैसा उपयोग केस है:

SET is a Set of Integer with size N
for i in SET (I mean only iterate the Set of size N at start point):
    if i + 7 not in SET:
        SET.add(i + 7)

return SET

उस तत्व को संग्रहीत करने के लिए सहायक सूची/सेट का उपयोग करने के अलावा जावा हैशसेट का उपयोग करके इसे कैसे कार्यान्वित किया जाए?

1
maplemaple 14 मार्च 2020, 02:36
1
जैसा लिखा है, यदि SET में कोई तत्व हैं, तो यह हमेशा के लिए चलेगा
 – 
lucasvw
14 मार्च 2020, 02:39
1
यह concurrent modification exception होगा
 – 
maplemaple
14 मार्च 2020, 02:42
ठीक है, लेकिन मेरी बात यह है कि अगर हम इसे अनदेखा करते हैं, तो सेट असीम रूप से बढ़ेगा। आप क्या खत्म करने की कोशिश कर रहे हैं?
 – 
lucasvw
14 मार्च 2020, 02:43
हां मुझे पता है। मैं जो कहना चाहता हूं वह केवल शुरुआती बिंदु पर SET पर पुनरावृति है
 – 
maplemaple
14 मार्च 2020, 02:46
@lucasvw: वह हमेशा के लिए क्यों चलना चाहिए? यह देखते हुए कि यह बिल्कुल काम करेगा (यह नहीं होगा), इसे अनिश्चित काल तक चलने के लिए वर्तमान कर्सर स्थिति (शायद अंत में) के पीछे सम्मिलन होना चाहिए। लेकिन अगर सम्मिलन बिंदु शुरुआत में है (पहली प्रविष्टि से पहले), तो यह अच्छी तरह से समाप्त हो जाएगा। हैश आधारित Set (सबसे अधिक इस्तेमाल किया जाने वाला) के लिए, नया मान वर्तमान कर्सर स्थिति से पहले या बाद में कहीं भी डाला जा सकता है, इसलिए व्यवहार पूरी तरह से अप्रत्याशित होगा। लेकिन जैसा कि यह बिल्कुल भी काम नहीं करता है, यह चर्चा काल्पनिक है ...
 – 
tquadrat
14 मार्च 2020, 03:00

3 जवाब

इसकी सामग्री पर पुनरावृति करते हुए Set इंस्टेंस में कुछ जोड़ना असंभव है; foreach लूप (for( var e : set ) नोटेशन) का उपयोग करते समय, किसी भी संशोधन की अनुमति नहीं है, जबकि एक स्पष्ट इटरेटर (for( var i = set.iterator(); i.hasNext(); ) … नोटेशन) का उपयोग करते समय, आप i.remove() से छुटकारा पाने के लिए कॉल कर सकते हैं। वर्तमान तत्व। लेकिन इस मामले में नए तत्व जोड़ना अभी भी काम नहीं करता है।

यह व्यवहार सभी जावा संग्रह वर्गों द्वारा साझा किया जाता है, हालांकि List एक विशेष पुनरावर्तक वर्ग, ListIterator को जानता है, जो i.add() को कॉल करके प्रविष्टियां (नोटेशन for( var i = list.listIterator(); i.hasNext(); ) …) जोड़ने की भी अनुमति देता है - धन्यवाद मुझे उस पर याद दिलाने के लिए @lucasvw को।

3
tquadrat 14 मार्च 2020, 03:06
1
एक सूची पुनरावर्तक के साथ आप तत्व जोड़ सकते हैं, लेकिन ओपी एक सेट का उपयोग करके निर्दिष्ट करता है
 – 
lucasvw
14 मार्च 2020, 03:02
शुक्रिया! मैं कभी नहीं जानता कि listIterator के पास ऐसी संपत्ति है।
 – 
maplemaple
14 मार्च 2020, 03:09

@lucasvw यहां अंतर्निहित मुद्दे से दूर है - आपको मूल मूल्यों और आपके द्वारा जोड़े गए मूल्यों के बीच अंतर करने की आवश्यकता है, अन्यथा, लूप अनिश्चित काल तक चलेगा (या, कम से कम, जब तक कि मान पर्याप्त रूप से ओवरफ्लो नहीं हो जाते हैं, इसलिए वे खुद को दोहराना शुरू कर देते हैं) .

ऐसा करने का सबसे अच्छा तरीका वास्तव में उन सभी मूल्यों को रखने के लिए एक सहायक सेट है जिन्हें आप जोड़ना चाहते हैं:

Set<Integer> aux = original.stream().map(i -> i + 7).collect(Collectors.toSet());
original.addAll(aux);
2
Mureinik 14 मार्च 2020, 02:46

यदि आप स्वयं प्रतिलिपि नहीं बनाना चाहते हैं, तो जावा आपके लिए यह कर सकता है: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArraySet.html। यह तेज़ या कुछ भी जादुई नहीं होगा, लेकिन आप "मूल" को पुनरावृत्त कर सकते हैं और एक ही समय में संशोधित कर सकते हैं।

हालाँकि यदि आप कुछ कुशल चाहते हैं, तो संभवतः नए तत्वों के साथ एक और Set बनाना है, और addAll() उन्हें। सेट के आकार के आधार पर नियंत्रण-जांच को छोड़ना और विलय के लिए इसे छोड़ना तेज़ हो सकता है।

BitSet और इसके or() ऑपरेशन यह देखने के लिए भी कुछ हो सकता है कि क्या आपके नंबर गैर-ऋणात्मक हैं और कम परिमाण के हैं।

1
tevemadar 14 मार्च 2020, 03:04