जावा: पायथन की रेंज (int, int) के बराबर?


99

क्या जावा पायथन की range(int, int)विधि के बराबर है ?


क्या आपका मतलब एक पायथन 2.x रेंज है जो एक सूची लौटाता है, या एक पायथन 3.x रेंज जो एक इट्रेटर लौटाता है (2.x xrange के बराबर)? पूर्व को लागू करने के लिए अपेक्षाकृत सरल है जैसा कि दूसरों ने नीचे किया है, लेकिन पुनरावृत्त संस्करण थोड़ा अधिक मुश्किल है।
डेव किर्बी


किसी भी श्रेणी के Comparableलिए यह उत्तर देखें
c0der

स्टेपिंग वाली एक सीमा के लिए इसे
स्लावोमिर लेनार्ट

जवाबों:


27

अमरूद भी अजगर के समान कुछ प्रदान करता है range:

Range.closed(1, 5).asSet(DiscreteDomains.integers());

आप अमरूद के एन्टिसेन्टेटर का उपयोग करके एक ही प्रकार का साधारण इटरेटर भी कर सकते हैं।

return new AbstractIterator<Integer>() {
  int next = getStart();

  @Override protected Integer computeNext() {
    if (isBeyondEnd(next)) {
      return endOfData();
    }
    Integer result = next;
    next = next + getStep();
    return result;
  }
};

6
काश, मैंने अपनी जेनेरिक रेंज लागू करने से पहले इसे देखा होता। यह अच्छा है लेकिन अभी भी एक और याद दिलाता है कि अधिक कार्यात्मक भाषाओं की तुलना में क्लूनी जावा की तुलना कैसे की जा सकती है।
z7sg।

14
Range#asSetलगता है कि पदावनत हो गए हैं। अब आपको ऐसा करने की आवश्यकता है:ContiguousSet.create(Range.closed(low, high), DiscreteDomain.integers())
Chthonic Project

क्या पुस्तकालय मैं इस का उपयोग करने के लिए आयात करने की आवश्यकता है?
tgabb

जावा 8 से, इंटस्ट्रीम और लॉन्गस्ट्रीम में तरीकों की रेंज और रेंज क्लोज्ड है।
जोस मैनुअल गोमेज़ अल्वारेज़

225

पुराना प्रश्न, नया उत्तर (जावा 8 के लिए)

    IntStream.range(0, 10).forEach(
        n -> {
            System.out.println(n);
        }
    );

या विधि संदर्भ के साथ:

IntStream.range(0, 10).forEach(System.out::println);

1
क्या पैकेज? मैं इसे कैसे आयात करूं?
जस्टिन थॉमस

6
@ जस्टिन यह जावा 8 भाषा की विशेषता है।
तजफिर


16

अमरूद 15.0 के बाद से, Range.asSet () को हटा दिया गया है और इसे 16 संस्करण में हटा दिया जाएगा। इसके बजाय निम्नलिखित का उपयोग करें:

ContiguousSet.create(Range.closed(1, 5), DiscreteDomain.integers());

15

मैं जूल नामक एक छोटी सी जावा यूटिलिटी लाइब्रेरी पर काम कर रहा हूं , और इसमें एक वर्ग शामिल है Rangeजो आपको आवश्यक कार्यक्षमता प्रदान करता है (एक डाउनलोड करने योग्य जार)।
कंस्ट्रक्टर्स या तो कर रहे हैं Range(int stop), Range(int start, int stop)या Range(int start, int stop, int step)(पाश के लिए एक करने के लिए समान) और आप जो आलसी मूल्यांकन इस्तेमाल किया इसके माध्यम से पुनरावृति या तो कर सकते हैं, या आप अपने उपयोग कर सकते हैं toList()विधि के लिए स्पष्ट रूप से सीमा सूची मिलता है।

for (int i : new Range(10)) {...} // i = 0,1,2,3,4,5,6,7,8,9

for (int i : new Range(4,10)) {...} // i = 4,5,6,7,8,9

for (int i : new Range(0,10,2)) {...} // i = 0,2,4,6,8

Range range = new Range(0,10,2);
range.toList(); // [0,2,4,6,8]

14
public int[] range(int start, int stop)
{
   int[] result = new int[stop-start];

   for(int i=0;i<stop-start;i++)
      result[i] = start+i;

   return result;
}

किसी भी वाक्यविन्यास या शैली त्रुटियों को क्षमा करें; मैं सामान्य रूप से C # में कार्यक्रम करता हूं।


यह देखते हुए कि विवियन बरौसे ने आपको एक जवाब दिया, कि आप किसी भी ठगी से बचने के लिए आपको क्यों नहीं हटाते हैं। जब तक आप वास्तव में अच्छी तरह से इसे बाहर करने की योजना नहीं बनाते हैं।
अपरोनस्टरलिंग

9
वे समान हैं; मुझे लगता है कि मेरा थोड़ा अधिक पठनीय है। "लंबाई" का उनका उपयोग भ्रामक है, और मुझे नहीं लगता कि उनकी पायथन कल्पना से मिलता है (वह ऊपरी सीमा को शामिल करता है, जो नेटवर्क-theory.co.uk/docs/pytut/rangeFunction.html कहता है कि पायथन में नहीं होता है )। यदि आपको लगता है कि कोई व्यक्ति ठगा हुआ है, तो मेरा मानना ​​है कि आपके पास खुद से निपटने के लिए पर्याप्त प्रतिष्ठा है।
20

10

पूर्णांक का एक श्रेणी सेट प्राप्त करने के लिए आप निम्न कोड स्निपेट का उपयोग कर सकते हैं:

    Set<Integer> iset = IntStream.rangeClosed(1, 5).boxed().collect
            (Collectors.toSet());

7
public int[] range(int start, int length) {
    int[] range = new int[length - start + 1];
    for (int i = start; i <= length; i++) {
        range[i - start] = i;
    }
    return range;
}

(केवल "नहीं" कहने के लिए लंबा उत्तर)


यह भी देखें कि अजगर 3 में "रेंज" और अजगर 2 में पसंदीदा "xrange" एक "लाइव" ऑब्जेक्ट लौटाता है जिसमें प्रत्येक आइटम के लिए मेमोरी का उपयोग नहीं होता है। यह जावा में लागू करने के लिए और भी बड़ा होगा।
jsbueno

3

जावा 9 - IntStream::iterate

जावा 9 के बाद से आप उपयोग कर सकते हैं IntStream::iterateऔर आप चरण को अनुकूलित भी कर सकते हैं। उदाहरण के लिए यदि आप intसरणी चाहते हैं :

public static int[] getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .toArray();
}

या List:

public static List<Integer> getInRange(final int min, final int max, final int step) {
    return IntStream.iterate(min, i -> i < max, i -> i + step)
            .boxed()
            .collect(Collectors.toList());
}

और फिर इसका उपयोग करें:

int[] range = getInRange(0, 10, 1);

2

ग्रूवी की निफ्टी रेंज क्लास का उपयोग जावा से किया जा सकता है, हालांकि यह निश्चित रूप से ग्रूवी के रूप में नहीं है।


2

"फ़ंक्शनल जावा" लाइब्रेरी इस तरह से एक सीमित डिग्री तक प्रोग्राम करने की अनुमति देती है, इसमें एक रेंज () विधि है जो एक fj.data.Array उदाहरण बनाती है।

देख:

इसी तरह "पूरी तरह से आलसी" पुस्तकालय एक आलसी रेंज विधि प्रदान करता है: http://code.google.com/p/totallylazy/


1

यदि आप इसका उपयोग करना चाहते हैं जैसे आप पायथन लूप में करेंगे, तो जावा स्टेटमेंट के लिए अच्छी तरह से लूप करेगा, जो इस संरचना को उस उद्देश्य के लिए अनावश्यक रूप से प्रस्तुत करता है।


5
आप आमतौर पर अजगर में लूप के लिए इसका इस्तेमाल नहीं करते हैं। वहाँ लगभग हमेशा एक क्लीनर रास्ता है।
डेनेथ

आमतौर पर, रेंज का उपयोग आमतौर पर लूप के लिए किया जाता है। लेकिन छोरों के लिए अक्सर सीमा के बिना उपयोग किया जाता है।
फोगबर्ड


0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन अगर आप एक ऐसे समाधान की तलाश में हैं, जो किसी ऑब्जेक्ट स्ट्रीम को लौटाए और कोई अतिरिक्त निर्भरता का उपयोग न करे या न कर सके:

Stream.iterate(start, n -> n + 1).limit(stop);

शुरू - समावेशी रोक - अनन्य

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.