জাভা: পাইথনের পরিসরের সমতুল্য (int, int)?


99

জাভা কি পাইথনের range(int, int)পদ্ধতির সমতুল্য ?


আপনি কি একটি পাইথন ২.x ব্যাপ্তি বলতে চান যা একটি তালিকা দেয়, বা পাইথন ৩.x পরিসীমা যা একটি পুনরাবৃত্তির (২.x এক্সরঞ্জের সমতুল্য) ফেরত দেয়? অন্যটি নীচে যেমন করেছে তেমনটি প্রয়োগ করা অপেক্ষাকৃত সহজ, তবে পুনরাবৃত্তকারী সংস্করণটি আরও জটিল।
ডেভ কির্বি 21


যে কোনও Comparableএস এর একটি ব্যাপ্তির জন্য এই উত্তরটি দেখুন
c0der

পদবিন্যাস সঙ্গে কাজ করার জন্য দেখতে এই
স্লায়োমির Lenart,

উত্তর:


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 প্রকল্প

এটি ব্যবহারের জন্য আমার কোন লাইব্রেরির আমদানি করা দরকার?
tgabb

জাভা 8 থেকে, ইনটস্ট্রিম এবং লংস্ট্রিমের পদ্ধতিগুলির সীমা এবং রেঞ্জক্লোজড রয়েছে।
হোসে ম্যানুয়েল গোমেজ আলভারেজ

232

পুরানো প্রশ্ন, নতুন উত্তর (জাভা 8 এর জন্য)

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

বা পদ্ধতি রেফারেন্স সহ:

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

4
কি প্যাকেজ? আমি কীভাবে এটি আমদানি করব?
জাস্টিন থমাস

6
@ জাস্টিন এটি জাভা 8 ভাষা বৈশিষ্ট্য।
Tzafrir


16

আমি Jools নামক একটি সামান্য জাভা ইউটিস লাইব্রেরিতে কাজ করছি , এবং এটিতে একটি শ্রেণি রয়েছে 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;
}

কোনও বাক্য গঠন বা শৈলীর ত্রুটিগুলি ক্ষমা করুন; আমি সাধারণত সি # তে প্রোগ্রাম করি।


এই বলে যে ভিভিওন বারৌস আপনাকে একটি উত্তরে মারবে, কোনও ধোঁকা এড়াতে আপনি কেন নিজেকে মুছবেন না। যদি না আপনি সত্যিই অবশ্যই খুব সুন্দরভাবে এটির পরিকল্পনা করেন।
অ্যারোনস্টার্লিং

9
তারা একই রকম; আমার মনে হয় আমার কিছুটা বেশি পঠনযোগ্য। তাঁর "দৈর্ঘ্য" এর ব্যবহার বিভ্রান্তিকর, এবং আমি মনে করি না যে সে পাইথন স্পেকের সাথে মিলিত হয়েছে (তিনি উপরের সীমানাটি অন্তর্ভুক্ত করেছেন, যা নেটওয়ার্ক- থিওরি.কম / ডকস / পিসিট / অ্যারেঞ্জ ফাংশন এইচটিএমএল বলে যে পাইথনে ঘটে না) )। আপনি যদি কারও ডুপ ভাবেন, আমি বিশ্বাস করি এটির মোকাবিলা করার জন্য আপনার যথেষ্ট খ্যাতি রয়েছে।
কিথস

11

পূর্ণসংখ্যার একটি ব্যাপ্তি সেট পেতে আপনি নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে পারেন:

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

8
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

"ফাংশনাল জাভা" গ্রন্থাগারটি এমনভাবে একটি সীমাবদ্ধ ডিগ্রীতে প্রোগ্রাম করার অনুমতি দেয়, এটির একটি পরিসর () পদ্ধতি রয়েছে একটি fj.data.Array উদাহরণ তৈরি করে।

দেখা:

একইভাবে "সম্পূর্ণ অলস" গ্রন্থাগারটি একটি অলস পরিসীমা পদ্ধতি সরবরাহ করে: http://code.google.com/p/totallylazy/


1

যদি আপনি এটি ব্যবহার করার অর্থ যদি আপনি পাইথন লুপে করেন তবে জাভা বিবৃতি দেওয়ার জন্য সুন্দরভাবে লুপ করেন যা এই উদ্দেশ্যে এই কাঠামোটিকে অপ্রয়োজনীয় করে তোলে।


5
আপনি সাধারণত পাইথনে লুপের জন্য এটি ব্যবহার করবেন না। পুনরাবৃত্তি করার প্রায় সবসময় একটি ক্লিনার উপায় আছে।
দেনিথ

ওয়েল, রেঞ্জটি সাধারণত লুপের জন্য ব্যবহৃত হয়। তবে লুপগুলির জন্য প্রায়শই ব্যাপ্তি ছাড়াই ব্যবহৃত হয়।
ফোগলবার্ড


0

আমি জানি এটি একটি পুরানো পোস্ট তবে আপনি যদি এমন কোনও সমাধান খুঁজছেন যা কোনও বস্তুর প্রবাহকে ফেরত দেয় এবং কোনও অতিরিক্ত নির্ভরতা ব্যবহার করতে বা ব্যবহার করতে না চায়:

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

শুরু - অন্তর্ভুক্ত স্টপ - একচেটিয়া

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.