2010-09-24 14 views
71

क्या जावा के पास पाइथन की range(int, int) विधि के बराबर है?जावा: पायथन की सीमा (int, int) के समतुल्य?

+0

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

+0

मेरा मतलब था एक सूची। –

+0

http://stackoverflow.com/questions/16570091/for-loop-like-python-range-function/31867991#31867991 – zengr

उत्तर

21

Guava भी कुछ इसी तरह प्रदान करता है पायथन के range रहे हैं:

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

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

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

+12

'रेंज # asSet' को बहिष्कृत किया गया प्रतीत होता है। अब आपको यह करने की ज़रूरत है: 'ContiguousSet.create (रेंज.क्लोज्ड (कम, उच्च), DiscreteDomain.integers()) ' –

+0

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

6
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; 
} 

(लांग जवाब सिर्फ "नहीं" कहने के लिए)

+0

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

13
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; 
} 

किसी भी वाक्य रचना या शैली त्रुटियों माफ कर दो; मैं आमतौर पर सी # में कार्यक्रम।

+0

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

+9

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

1

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

+5

आप आमतौर पर इसे पाइथन में लूप के लिए उपयोग नहीं करते हैं। पुनरावृत्त करने के लिए लगभग हमेशा एक क्लीनर तरीका है। – Daenyth

+0

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

15

मैं Jools नामक एक छोटी जावा यूटिल लाइब्रेरी पर काम कर रहा हूं, और इसमें कक्षा Range है जो आपको आवश्यक कार्यक्षमता प्रदान करता है (एक डाउनलोड करने योग्य JAR है)।
कंस्ट्रक्टर्स (पाश के लिए समान एक करने के लिए) या तो Range(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] 
2

ग्रूवी की:

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

तुम भी अमरूद के AbstractIterator का उपयोग कर बात की इसी तरह करने के लिए एक काफी सरल इटरेटर लागू कर सकते हैं निफ्टी Range class जावा से उपयोग किया जा सकता है, हालांकि यह निश्चित रूप से ग्रोवी के रूप में नहीं है।

15

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

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

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

देखें:

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

161

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

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

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

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

क्या पैकेज? मैं इसे कैसे आयात करूं? –

+4

@ जस्टिन यह जावा 8 भाषा सुविधा है। – Tzafrir

+0

https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html – jhodges

6

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

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