জাভা অ্যারেকে Iteable এ রূপান্তর করুন


150

আমার কাছে আদিমগুলির একটি অ্যারে রয়েছে, উদাহরণস্বরূপ ইনট, ইনট [] ফু। এটি একটি ছোট আকারের হতে পারে, নাও।

int foo[] = {1,2,3,4,5,6,7,8,9,0};

Iterable<Integer>এটি থেকে তৈরি করার সর্বোত্তম উপায় কী ?

Iterable<Integer> fooBar = convert(foo);

মন্তব্য:

দয়া করে লুপগুলি ব্যবহার করে উত্তর দেবেন না (যদি না আপনি কম্পাইলার কীভাবে স্মার্ট কিছু করেন তার একটি ভাল ব্যাখ্যা দিতে না পারলে?)

এটিও নোট করুন

int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);

সংকলনও করবে না

Type mismatch: cannot convert from List<int[]> to List<Integer>

এছাড়াও পরীক্ষা করুন যে কোনও অ্যারে কেন ইটেটেবলের জন্য নির্ধারিত নয়? উত্তর দেওয়ার আগে।

এছাড়াও, আপনি যদি কিছু লাইব্রেরি ব্যবহার করেন (যেমন, পেয়ারা) তবে এটি কেন সেরা তা দয়া করে ব্যাখ্যা করুন। (কারণ এটি গুগল থেকে সম্পূর্ণ উত্তর নয়: পি)

শেষ কথা, যেহেতু এটি সম্পর্কে কোনও হোমওয়ার্ক রয়েছে বলে মনে হয় তাই হোম ওয়ার্কিশ কোড পোস্ট করা এড়িয়ে চলুন।



এগুলি একটি লিঙ্কডলিস্টে যুক্ত করুন তারপরে সেই সেটটির পুনরাবৃত্তিটি ফিরিয়ে দিন।

উত্তর:


117
Integer foo[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

List<Integer> list = Arrays.asList(foo);
// or
Iterable<Integer> iterable = Arrays.asList(foo);

যদিও এটি কাজ করার জন্য আপনাকে একটি Integerঅ্যারের ব্যবহার করতে হবে (অ্যারে নয় int)।

আদিমদের জন্য, আপনি পেয়ারা ব্যবহার করতে পারেন:

Iterable<Integer> fooBar = Ints.asList(foo);
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
    <type>jar</type>
</dependency>

জাভা 8 এর জন্য: (জিন কোওনের উত্তর থেকে)

final int[] arr = {1, 2, 3};
final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator();
final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator();
final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator();

10
দুটি নোট: 1) তার রয়েছে int, Integer2 নয় ) Listইতিমধ্যে Iterableতৃতীয় লাইনটি অর্থহীন।
মাকসিমভ

1
তৃতীয় পংক্তি কেন তার অপরিহার্য প্রয়োজন।
fmucar

5
2 য় এবং 3 য় লাইনগুলি বিকল্পগুলি আমি বলব :)
fmucar

1
এটি কোনও হোম ওয়ার্কের অংশ নয়, আমি কেবল কোনও অ্যারে বা তালিকার বিষয়বস্তু প্রক্রিয়াকরণ করার জন্য একটি ডিবাগিং ফাংশনটির জন্য নকল কোডটি এড়াতে চেষ্টা করছিলাম ... চারদিকে তাকাতে গিয়ে আমি সত্যিই অ্যারেএস.এললিস্টটি খুঁজে পেলাম (..) ;, তবে কমপক্ষে গ্রহনটি মনে হয় এটি আমার যা করতে চায় তা করবে না (উদাহরণস্বরূপ, এটি অ্যারেজ.এললিস্টের ফলাফলকে অনুমান করে একটি তালিকা <int []> হিসাবে, তালিকা <ইন্টিজার> নয়) ... প্রশ্ন ... (-সীমাবদ্ধতার কারণগুলিতে মন্তব্য করা)
এনটিজি

1
সাধারণভাবে এটি করার বিভিন্ন উপায় সম্পর্কে আমরা ভাবতে পারি, তবে আমি ভাবছিলাম সেরাটি কী (উদাহরণস্বরূপ একটি লুপটি তুলনায় তুলনামূলকভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নামবে!) )}) এছাড়াও , আমার প্রশ্নটি কেন নয়, তবে কীভাবে এবং কী ধরণের কনটেইনার সবচেয়ে ভাল হবে (কেন অ্যারেলিস্ট? আসলে, আমি কিছু অ্যাবস্ট্রাকলিস্ট কল্পনা করতে পারি ) এই বিষয়ে আলোচনার জন্য স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ১১6০০৮১/২ পরীক্ষা করুন check জেনারিকস ব্যবহার করে র‌্যাপার .., সম্ভবত আকারের উপর নির্ভর করে ...)
এনটিজি

44

শুধু আমার 2 সেন্ট:

final int a[] = {1,2,3};

java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {

    public Iterator<Integer> iterator() {
       return new Iterator<Integer>() {
            private int pos=0;

            public boolean hasNext() {
               return a.length>pos;
            }

            public Integer next() {
               return a[pos++];
            }

            public void remove() {
                throw new UnsupportedOperationException("Cannot remove an element of an array.");
            }
        };
    }
};

9
মুছে ফেলা () জাভা 8-তে প্রয়োজনীয় নয়, কারণ এটি একটি ডিফল্ট পদ্ধতি যা অসমর্থিত অপারেশন এক্সেক্সশনটি ছুড়ে দেয়। আপনি যদি আরও ভাল ব্যাখ্যা বার্তা সরবরাহ করতে চান তবেই।
অ্যালেক্স

+1 আমি এ Iterator<Character>থেকে একটি তৈরি করতে অনুরূপ কিছু করি String। আপনার নিজের বাস্তবায়নকারী Iteratorঅযথা মূল্যবোধের সব মাধ্যমে iterating আদিম ধরনের বস্তু ধরণ থেকে রূপান্তর করতে (পেয়ারা এর মাধ্যমে এড়ানো একমাত্র উপায় মত মনে হয় Ints.asList(), উদাহরণস্বরূপ) শুধু একটি পেতে পাবে Iteratorথেকে Listতৈরি করা হয়েছে যে।
spaaarky21

2
তুমি ঠিক আলেক্স। ডিফল্ট পদ্ধতিগুলি জাভা ৮-এ যুক্ত করা হয়েছিল ২০১৩-তে আমি কোডের এই প্রাচীন অংশটি যুক্ত করেছি।
জোয়ার্গ রুথসিলিং

29

জাভা 8 দিয়ে, আপনি এটি করতে পারেন।

final int[] arr = {1, 2, 3};
final PrimitiveIterator.OfInt i1 = Arrays.stream(arr).iterator();
final PrimitiveIterator.OfInt i2 = IntStream.of(arr).iterator();
final Iterator<Integer> i3 = IntStream.of(arr).boxed().iterator();

20

পেয়ারা আপনার পছন্দসই অ্যাডাপ্টার সরবরাহ করে ইনট্যাসলিস্ট () হিসাবে । সংশ্লিষ্ট বর্গ, যেমন প্রতিটি আদিম টাইপ জন্য একটি সমতুল্য নেই Booleansজন্য boolean, ইত্যাদি

int foo[] = {1,2,3,4,5,6,7,8,9,0};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
    System.out.println(i);
}

উপরের পরামর্শগুলি ব্যবহার করার জন্য কার্যকর Arrays.asListহবে না, এমনকি যদি তারা তার Iterator<int[]>পরিবর্তে একটি পায় তবে এটি সংকলন করে Iterator<Integer>। যা ঘটে তা হ'ল আপনার অ্যারে ব্যাক করা একটি তালিকা তৈরি করার পরিবর্তে আপনি অ্যারে যুক্ত 1-এলিমেন্ট তালিকা তৈরি করেছিলেন।


কেবল একটি নোট: লিঙ্কটি আর কাজ করছে না। গিথুব
অরেঙ্গল

ধন্যবাদ @ পাসি, স্থির হয়েছে (জাভাদোকের সাথে লিঙ্ক করার কোনও গুগল সমর্থিত উপায় আর মনে হচ্ছে না তাই আমি আপনার সরবরাহকারীর উত্সের সাথে লিঙ্ক করেছি)।
বিওনরোপ

8

আমার একই সমস্যা ছিল এবং এটি এর মতো সমাধান করা হয়েছে:

final YourType[] yourArray = ...;
return new Iterable<YourType>() {
  public Iterator<YourType> iterator() {
     return Iterators.forArray(yourArray);   // Iterators is a Google guava utility
  }
}

পুনরুক্তিকারী নিজেই একটি অলস UnmodifiableIteratorতবে এটি আমার প্রয়োজন ছিল।


7

জাভা 8 বা তারপরে, Iterableএকটি কার্যকরী ইন্টারফেসের রিটার্ন হয় Iterator। সুতরাং আপনি এটি করতে পারেন।

int[] array = {1, 2, 3};
Iterable<Integer> iterable = () -> Arrays.stream(array).iterator();
for (int i : iterable)
    System.out.println(i);

->

1
2
3

3

প্রথমত, আমি কেবল Arrays.asList(T...)এটিই সম্মত করতে পারি যে স্পষ্টতই র‍্যাপার প্রকারগুলি বা অ-প্রিমিটিভ ডেটাটাইপগুলি সহ অ্যারেগুলির জন্য সেরা সমাধান। এই পদ্ধতিটি ক্লাসে একটি সাধারণ প্রাইভেট স্ট্যাটিক AbstractListপ্রয়োগের একজন কনস্ট্রাক্টরকে কল করে Arraysযা মূলত প্রদত্ত অ্যারে রেফারেন্সটিকে ক্ষেত্র হিসাবে সংরক্ষণ করে এবং প্রয়োজনীয় পদ্ধতিগুলিকে ওভাররাইড করে একটি তালিকা অনুকরণ করে।

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

1) আপনি প্রতিটি আদিম ডেটাটাইপ অ্যারের জন্য স্ট্যাটিক পদ্ধতি সহ একটি শ্রেণি তৈরি করতে পারেন ( boolean, byte, short, int, long, char, float, doubleএকটি Iterable<র‌্যাপারটাইপ ফিরিয়ে দিচ্ছেন These >এই পদ্ধতিগুলি বেনামে ক্লাস ব্যবহার করবে Iterator(পাশাপাশিIterable) যা int[]পদ্ধতিগুলি প্রয়োগের ক্ষেত্রে ক্ষেত্র হিসাবে সমন্বিত পদ্ধতির যুক্তির (উদাহরণস্বরূপ একটি ) রেফারেন্স ধারণ করার অনুমতিপ্রাপ্ত ।

-> এই পদ্ধতিটি পারফর্মেন্ট এবং আপনার স্মৃতি সংরক্ষণ করে (নতুনভাবে তৈরি পদ্ধতিগুলির স্মৃতি ব্যতীত, যদিও Arrays.asList()একইভাবে স্মৃতি গ্রহণ করবে)

2) অ্যারেগুলির কোনও পদ্ধতি নেই (পাশের অংশে পড়তে হবে) আপনি লিঙ্ক করেছেন) তারা কোনও Iteratorউদাহরণ সরবরাহ করতে পারে না । আপনি যদি নতুন ক্লাস লিখতে সত্যিই খুব অলস হন তবে আপনাকে অবশ্যই ইতিমধ্যে বিদ্যমান বর্গের একটি উদাহরণ ব্যবহার করতে হবে যা প্রয়োগ করে Iterableকারণ তাত্ক্ষণিক Iterableবা সাব টাইপ ছাড়া অন্য কোনও উপায় নেই ।
বিদ্যমান সংগ্রহ ডেরিভেটিভ বাস্তবায়ন তৈরি করার একমাত্র উপায়Iterableএকটি লুপ ব্যবহার করা (আপনি উপরে বর্ণিত হিসাবে Iterableবেনাম ক্লাস ব্যবহার বাদে) বা আপনি এমন একটি বাস্তবায়নকারী ক্লাস ইনস্ট্যান্ট করবেন যার নির্মাতা একটি প্রাইমটিভ টাইপ অ্যারের Object[]অনুমতি দেয় (কারণ আদিম ধরণের উপাদানগুলির সাথে অ্যারেগুলিকে অনুমতি দেয় না) তবে যতদূর আমি জানি, জাভা এপিআই যে মত একটি শ্রেণীর বৈশিষ্ট্য নেই। লুপটির

কারণ সহজেই ব্যাখ্যা করা যেতে পারে:
প্রতিটি সংগ্রহের জন্য আপনার প্রয়োজন অবজেক্টস এবং প্রিমিটিভ ডেটাটাইপগুলি বস্তু নয়। অবজেক্টগুলি আদিম ধরণের চেয়ে অনেক বড় যার ফলে তাদের অতিরিক্ত ডেটা প্রয়োজন যা আদিম ধরণের অ্যারের প্রতিটি উপাদানের জন্য তৈরি করা আবশ্যক। এর অর্থ যদি তিনটি উপায়ে ( Arrays.asList(T...)একটি বিদ্যমান সংগ্রহ ব্যবহার বা ব্যবহারের জন্য) সামগ্রিক সামগ্রীর প্রয়োজন হয় তবে আপনার প্রতিটি আদিম মান তৈরি করতে হবেint[]আবরণ বস্তু অ্যারে। তৃতীয় উপায়টি অ্যারেটিকে যেমন ব্যবহার করবে এবং এটি বেনাম শ্রেণিতে ব্যবহার করবে কারণ আমার কাছে মনে হয় দ্রুত পারফরম্যান্সের কারণে এটি পছন্দনীয়। আপনি যে পদ্ধতিটিতে অ্যারেটি ব্যবহার করতে চান সেখানে

তৃতীয় কৌশলটিও Objectযুক্তি হিসাবে ব্যবহার করা হয় বা Iterableএটি কী ধরণের আর্গুমেন্ট রয়েছে তা নির্ধারণের জন্য টাইপ চেকের প্রয়োজন হয়, তবে আপনাকে সাধারণত যা প্রয়োজন ঠিক তেমন আমি এটি সুপারিশ করব না বিবেচনা করুন যে অবজেক্টটি সর্বদা প্রয়োজনীয় ধরণের নয় এবং নির্দিষ্ট ক্ষেত্রে আপনার পৃথক কোডের প্রয়োজন।

উপসংহারে, এটি জাভার সমস্যাযুক্ত জেনেরিক টাইপ সিস্টেমের দোষ যা আদিম প্রকারকে জেনেরিক প্রকার হিসাবে ব্যবহার করতে দেয় না যা কেবলমাত্র ব্যবহার করে প্রচুর কোড বাঁচায় wouldArrays.asList(T...)। সুতরাং আপনার প্রতিটি আদিম ধরণের অ্যারের জন্য প্রোগ্রাম করা দরকার, আপনার এমন একটি পদ্ধতি প্রয়োজন (যা মূলত সি ++ প্রোগ্রাম দ্বারা ব্যবহৃত স্মৃতিতে কোনও পার্থক্য করে না যা প্রতিটি ব্যবহৃত টাইপ আর্গুমেন্টের জন্য পৃথক পদ্ধতি তৈরি করে।


3

আপনি ক্যাকটুসIterableOf থেকে ব্যবহার করতে পারেন :

Iterable<String> names = new IterableOf<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

তারপরে, আপনি এটি ব্যবহার করে এটি তালিকায় পরিণত করতে পারেন ListOf:

List<String> names = new ListOf<>(
  new IterableOf<>(
    "Scott Fitzgerald", "Fyodor Dostoyevsky"
  )
);

বা কেবল এটি:

List<String> names = new ListOf<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

1

যদিও এর আগে একই ধরণের উত্তর পোস্ট করা হয়েছে, আমি মনে করি নতুন প্রিমিটিভআইট্রেটর ব্যবহার করার কারণটি স্পষ্ট ছিল না। জাভা 8 প্রিমিটিভআইটিরেটর ব্যবহার করা ভাল সমাধান হ'ল যেহেতু এটি আদিম অভ্যন্তরীণ প্রকারের জন্য বিশেষীকরণযোগ্য (এবং অতিরিক্ত বক্সিং / আনবক্সিং জরিমানা এড়ানো):

    int[] arr = {1,2,3};
    // If you use Iterator<Integer> here as type then you can't get the actual benefit of being able to use nextInt() later
    PrimitiveIterator.OfInt iterator = Arrays.stream(arr).iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.nextInt());
        // Use nextInt() instead of next() here to avoid extra boxing penalty
    }

রেফ: https://doc.bccnsoft.com/docs/jdk8u12-docs/api/java/util/PrimitiveIterator.OfInt.html


-2

জাভা 8-তে ইনটস্টিম স্ট্রিমটি পূর্ণসংখ্যার প্রবাহে বক্স করা যায়।

public static Iterable<Integer> toIterable(int[] ints) {
    return IntStream.of(ints).boxed().collect(Collectors.toList());
}

আমি মনে করি অ্যারের আকারের উপর ভিত্তি করে পারফরম্যান্সের বিষয়গুলি।

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