वहाँ एक उत्पन्न करने के लिए एक छोटा और प्रभावी तरीका है List<Integer>
, या शायद एक Integer[]
या int[]
कुछ से अनुक्रमिक मूल्यों के साथ, start
एक करने के लिए मूल्य end
मूल्य?
यह है, कुछ की तुलना में कम है, लेकिन निम्नलिखित 1 के बराबर है :
void List<Integer> makeSequence(int begin, int end) {
List<Integer> ret = new ArrayList<>(end - begin + 1);
for (int i=begin; i<=end; i++) {
ret.add(i);
}
return ret;
}
अमरूद का उपयोग ठीक है।
अपडेट करें:
क्षमता का परिक्षण
चूँकि इस सवाल को कई अच्छे उत्तर मिले हैं, दोनों में देशी जावा 8 और थर्ड पार्टी लाइब्रेरी का उपयोग किया गया है, मैंने सोचा कि मैं सभी समाधानों के प्रदर्शन का परीक्षण करूँगा।
पहला परीक्षण केवल [1..10]
निम्नलिखित विधियों का उपयोग करके 10 तत्वों की एक सूची बनाने का परीक्षण करता है :
- ClassicArrayList : मेरे प्रश्न में ऊपर दिया गया कोड (और अनिवार्य रूप से adarshr के उत्तर के समान)।
- eclipseCollections : नीचे दिए गए कोड डोनाल्ड के उत्तर में ग्रहण संग्रह 8.0 का उपयोग करते हुए।
- guavaRange : नीचे दिए गए daveb के उत्तर में दिया गया कोड । तकनीकी रूप से, यह
List<Integer>
एकContiguousSet<Integer>
- बल्कि - लेकिन पैदा नहीं करता है, क्योंकि यहIterable<Integer>
क्रम में लागू होता है, यह ज्यादातर मेरे उद्देश्यों के लिए काम करता है। - intStreamRange : व्लादिमीर के जवाब में नीचे दिया गया कोड , जो उपयोग करता है
IntStream.rangeClosed()
- जिसे जावा 8 में पेश किया गया था। - streamIterate : नीचे दिए गए कैटलिन के उत्तर में दिया गया कोड, जो
IntStream
जावा 8 में शुरू की गई कार्यक्षमता का उपयोग करता है ।
यहां प्रति सेकंड 10 किलो के संचालन में परिणाम (उच्च संख्या बेहतर हैं), उपरोक्त सभी के लिए आकार 10 की सूची के साथ:
... और फिर से आकार १०,००० की सूची के लिए:
वह अंतिम चार्ट सही है - एक्लिप्स और अमरूद के अलावा अन्य समाधान भी एक पिक्सेल बार पाने के लिए बहुत धीमे हैं! बाकी की तुलना में तेजी से समाधान 10,000 से 20,000 गुना तेज हैं।
यहाँ क्या चल रहा है, निश्चित रूप से, यह है कि अमरूद और ग्रहण समाधान वास्तव में किसी भी तरह के 10,000 तत्व सूची में नहीं आते हैं - वे बस शुरुआत और समापन बिंदु के आसपास निश्चित आकार के रैपर हैं। प्रत्येक तत्व पुनरावृत्ति के दौरान आवश्यकतानुसार बनाया जाता है। चूंकि हम वास्तव में इस परीक्षण में पुनरावृति नहीं करते हैं, इसलिए लागत को स्थगित कर दिया जाता है। अन्य सभी समाधान वास्तव में पूरी सूची को स्मृति में बदल देते हैं और एक निर्माण-केवल बेंचमार्क में भारी कीमत का भुगतान करते हैं।
चलो कुछ और अधिक यथार्थवादी करते हैं और सभी पूर्णांकों पर भी पुनरावृति करते हैं, उन्हें संक्षेप में लिखें। इसलिए IntStream.rangeClosed
संस्करण के मामले में , बेंचमार्क इस तरह दिखता है:
@Benchmark
public int intStreamRange() {
List<Integer> ret = IntStream.rangeClosed(begin, end).boxed().collect(Collectors.toList());
int total = 0;
for (int i : ret) {
total += i;
}
return total;
}
यहां, चित्र बहुत बदल जाते हैं, हालांकि गैर-भौतिक समाधान अभी भी सबसे तेज़ हैं। यहाँ लंबाई = 10 है:
... और लंबाई = 10,000:
कई तत्वों पर लंबे समय तक चलना चीजों को बहुत बढ़ा देता है, लेकिन 10,000 टन के परीक्षण पर भी ग्रहण और अमरूद दो बार से अधिक तेज रहते हैं।
इसलिए यदि आप वास्तव में एक चाहते हैं List<Integer>
, तो ग्रहण संग्रह सबसे अच्छा विकल्प लगता है - लेकिन निश्चित रूप से यदि आप अधिक देशी तरीके से धाराओं का उपयोग करते हैं (जैसे, .boxed()
आदिम डोमेन में कमी और भूल कर) तो आप शायद इन सभी की तुलना में तेजी से समाप्त हो जाएंगे। वेरिएंट।
1 शायद त्रुटि से निपटने के अपवाद के साथ, उदाहरण के लिए, यदि end
< begin
, या यदि आकार कुछ कार्यान्वयन या जेवीएम सीमा से अधिक है (उदाहरण के लिए, इससे बड़ा है) 2^31-1
।