জাভাতে কীভাবে ইনট [] তালিকা <Integer> এ রূপান্তর করবেন?


382

আমি কিভাবে কনভার্ট করব int[]মধ্যে List<Integer>জাভা?

অবশ্যই, আমি আইটেম অনুসারে আইটেমটি লুপে করা ছাড়া অন্য কোনও উত্তরে আগ্রহী। তবে অন্য কোনও উত্তর না থাকলে, এই কার্যকারিতাটি জাভার অংশ নয় তা প্রমাণ করার জন্য আমি সেইটিকে সেরা হিসাবে বেছে নেব।


আমরা ইন্টারস্ট্রিম.অফ (অ্যারে) .কলোলেক্ট (কালেক্টর.টলিস্ট) ব্যবহার করতে পারি
সরোজ কুমার সাহু

উত্তর:


259

সেখান থেকে রূপান্তরের জন্য কোন শর্টকাট int[]থেকে List<Integer>যেমন Arrays.asListবক্সিং সাথে মোকাবিলা করে না এবং শুধু একটি তৈরি করবে List<int[]>যা নয় কি আপনি চান। আপনাকে একটি ইউটিলিটি পদ্ধতি তৈরি করতে হবে।

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>(ints.length);
for (int i : ints)
{
    intList.add(i);
}

32
অ্যারের আকারের সাথে তালিকার সূচনা করা ভাল
ডেভিড রবিনোভিট

110
(int i: ints) এর জন্য intList.add (i);
স্টিফেন ডেন

18
@ উইলকোডেজাভাফরফুড - ডেভিডের অর্থ এটি আরও ভাল: নতুন অ্যারেলিস্ট <ইনটেগার> (ints.length);
স্টিফেন ডেন 12

12
@ উইলকোডেজাভাফরফুড: অ্যারেলিস্টটি নির্মাণের সময় তার আকার ঘোষণা করা নির্দিষ্ট পরিমাণ যুক্ত হওয়ার পরে এটি অভ্যন্তরীণ আকার পরিবর্তন করতে বাধা দেবে। সুবিধাটি কম কিনা তা নিশ্চিত নয় তবে অবশ্যই একটি সুবিধা রয়েছে।
গ্রুন্ডলেফ্লেক

10
new ArrayList<Integer>() {{ for (int i : ints) add(i); }}
saka1029

350

প্রবাহের

জাভা 8 এ আপনি এটি করতে পারেন

int[] ints = {1,2,3};
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());

21
সমতুল্য: অ্যারে.স্ট্রিম (ইনস) .বক্সড ()। সংগ্রহ (সংগ্রাহক। টোলিস্ট ());
এনজেফ্রস্ট

4
@ এনজেফ্রস্ট আপনি ঠিক বলেছেন এবং ইন্টারস্ট্রিম.ওফ কেবল অ্যারেস স্ট্রিমকে কল করেছেন তাই আপনার পরামর্শ অনুসারে আমি উত্তরটির উন্নতি করেছি
মাইকিরিলি

কোনও কারণে এটি অ্যান্ড্রয়েড স্টুডিওতে প্রত্যাশিত ফলাফলের ধরণটি প্রত্যাবর্তন করবে বলে মনে হচ্ছে না (গ্রহনের উপর কাজ করে) এটি বলেছে, প্রত্যাশিত তালিকা <ইন্টিজার> খুঁজে পাওয়া তালিকা << বিষয়>।
ইউজিনিও লোপেজ 19 ই

এটি পরিষ্কার এবং সংক্ষিপ্ত দেখাচ্ছে তবে আমি যখন এটি ব্যবহার করেছি লেটকোডে @ উইলকোডেজাভাফরফুড দ্বারা সরবরাহিত মৌলিক সমাধানের বিপরীতে প্রোগ্রামের কর্মক্ষমতা স্মৃতির পাশাপাশি রানটাইমের ক্ষেত্রেও অবনমিত হয়েছে
চিত্রেশ সিরোহি

@ চিত্রশিরোহি যে কারণ স্ট্রিমের অভ্যন্তরে ব্যবহৃত ল্যাম্বদা ফাংশন জাভাতে কিছু বেনামী ক্লাস তৈরি করে।
আশ্বিন শর্মা

175

এছাড়াও থেকে পেয়ারা লাইব্রেরি ... com.google.common.primitives.Ints:

List<Integer> Ints.asList(int...)

11
এই এক সঠিক উত্তর হওয়া উচিত। প্রশ্নের দ্বিতীয় বাক্যটি দেখুন: "অবশ্যই আমি আইটেমের দ্বারা লুপে আইটেম না করা ছাড়া অন্য কোনও উত্তরে আগ্রহী।"
জোসকেট্রেস

আপনাকে ধন্যবাদ, আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ! এছাড়াও লঙ্গস.এএসলিস্টের জন্য কাজ করে (দীর্ঘ ...)।

2
এখানে কয়েকটি সূক্ষ্মতা রয়েছে। প্রত্যাশিত তালিকাটি প্রদত্ত অ্যারেটিকে ব্যাকিং স্টোর হিসাবে ব্যবহার করে, সুতরাং আপনার অ্যারেটি পরিবর্তন করতে হবে না। তালিকাটি অন্তর্ভুক্ত পূর্ণসংখ্যার অবজেক্টগুলির পরিচয়ের গ্যারান্টি দেয় না। অর্থাৎ list.get (0) == list.get (0) এর ফলাফল নির্দিষ্ট করা হয়নি।
pburka

1
লাইব্রেরি যুক্ত করার সময় অ্যান্ড্রয়েডে পদ্ধতি রেফারেন্স কাউন্ট থেকে সাবধান থাকুন। যদিও ভাল পাওয়া।
milosmns

95

অন্যান্য উত্তরগুলির প্রত্যাশার সাথে অ্যারে.এএসলিস্ট কাজ করবে না।

এই কোডটি 10 পূর্ণসংখ্যার একটি তালিকা তৈরি করবে না । এটি 10 টি নয়, 1 টি মুদ্রণ করবে :

int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List lst = Arrays.asList(arr);
System.out.println(lst.size());

এটি পূর্ণসংখ্যার একটি তালিকা তৈরি করবে:

List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

আপনার কাছে ইতিমধ্যে ইনস এর অ্যারে থাকলে, রূপান্তর করার কোনও দ্রুত উপায় নেই, আপনি লুপটি দিয়ে আরও ভাল।

অন্যদিকে, যদি আপনার অ্যারেতে বস্তুগুলি থাকে তবে এটি আদিম নয়, অ্যারে.এএসলিস্ট কাজ করবে:

String str[] = { "Homer", "Marge", "Bart", "Lisa", "Maggie" };
List<String> lst = Arrays.asList(str);

2
মনে রাখবেন, সেই তালিকাটি অপরিবর্তনীয়
ড্যানিয়েলসন

51

আমি একটি পৃথক পদ্ধতিতে অন্য উত্তর যুক্ত করব; কোনও লুপ নয় তবে একটি বেনাম শ্রেণি যা অটোবক্সিং বৈশিষ্ট্যগুলি ব্যবহার করবে:

public List<Integer> asList(final int[] is)
{
    return new AbstractList<Integer>() {
            public Integer get(int i) { return is[i]; }
            public int size() { return is.length; }
    };
}

1
+1 এটি আমার চেয়ে খাটো তবে খনি সমস্ত আদিম ধরণের জন্য কাজ করে
dfa

5
আরেলিস্ট তৈরির চেয়ে দ্রুত এবং কম মেমরি ব্যবহার করার সময়, ট্রেড অফটি তালিকা.এডিডি () এবং তালিকা.রেভ () কাজ করে না।
স্টিফেন ডেন

3
আমি বিস্মৃত অ্যাক্সেস প্যাটার্ন সহ বড় অ্যারেগুলির জন্য এই সমাধানটি বেশ পছন্দ করি তবে ঘন ঘন অ্যাক্সেস করা উপাদানগুলির জন্য এটি পূর্ণসংখ্যার অনেক অপ্রয়োজনীয় তাত্ক্ষণিক পরিণতি ঘটায় (যেমন আপনি যদি একই উপাদানটি 100 বার অ্যাক্সেস করেন তবে)। এছাড়াও আপনার সংগ্রহকারীকে সংজ্ঞায়িত করতে হবে এবং সংগ্রহগুলি.মোমডিফিকেশনযোগ্য তালিকায় রিটার্ন মানটি মোড়ানো দরকার।
অ্যাডামস্কি

ক্রিস্টোফার ধন্যবাদ আমি setপদ্ধতিটি যুক্ত করেছি এবং এখন আমি এমনকি অ্যারে বাছাই করতে পারি ...
ফ্রিডেভ

39

কোডের ক্ষুদ্রতম অংশটি হবে:

public List<Integer> myWork(int[] array) {
    return Arrays.asList(ArrayUtils.toObject(array));
}

যেখানে অ্যারে ইউটিলস কমন্স-ল্যাং থেকে আসে :)


9
কেবল একটি নোট করুন ArrayUtilsএটি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য আপেক্ষিক বড় লাইব্রেরি
মিসেসমিলু

বিপরীত অপারেশনটি এখানে বর্ণিত হয়েছে: stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) মূল।
জিরো ওনে

26

প্রবাহ সহ জাভা 8 এ:

int[] ints = {1, 2, 3};
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));

বা সংগ্রহকারীদের সাথে

List<Integer> list =  Arrays.stream(ints).boxed().collect(Collectors.toList());

3
কেন কেবল সংগ্রাহক ব্যবহার করবেন না?
অ্যাসিলেয়াস


16

আপনি যদি জাভা 8 ব্যবহার করে থাকেন তবে আমরা এটিকে স্ট্রিম এপিআই ব্যবহার করে একটি তালিকায় রূপান্তর করতে পারি।

List<Integer> list = Arrays.stream(arr)     // IntStream 
                                .boxed()        // Stream<Integer>
                                .collect(Collectors.toList());

আপনি পাশাপাশি রূপান্তর করতে ইন্টারস্ট্রিম ব্যবহার করতে পারেন।

List<Integer> list = IntStream.of(arr) // return Intstream
                                    .boxed()        // Stream<Integer>
                                    .collect(Collectors.toList());

পেয়ারা এবং অ্যাপাচি কমনের মতো অন্যান্য বাহ্যিক গ্রন্থাগারও এটি রূপান্তরিত উপলভ্য।

চিয়ার্স।


11

এই ত্রুটি প্রতিবেদনটি যাচাই করা উচিত , যা "ত্রুটি নয়" এবং নীচের পাঠ্যের কারণে বন্ধ ছিল:

"পুরো অ্যারেগুলির অটোবক্সিং যথাযথ আচরণের জন্য নির্দিষ্ট করা হয়নি large বড় অ্যারেগুলির জন্য এটি প্রতিরোধমূলক ব্যয়বহুল হতে পারে" "


7

এই ক্লাসে চেষ্টা করুন:

class PrimitiveWrapper<T> extends AbstractList<T> {

    private final T[] data;

    private PrimitiveWrapper(T[] data) {
        this.data = data; // you can clone this array for preventing aliasing
    }

    public static <T> List<T> ofIntegers(int... data) {
        return new PrimitiveWrapper(toBoxedArray(Integer.class, data));
    }

    public static <T> List<T> ofCharacters(char... data) {
        return new PrimitiveWrapper(toBoxedArray(Character.class, data));
    }

    public static <T> List<T> ofDoubles(double... data) {
        return new PrimitiveWrapper(toBoxedArray(Double.class, data));
    }  

    // ditto for byte, float, boolean, long

    private static <T> T[] toBoxedArray(Class<T> boxClass, Object components) {
        final int length = Array.getLength(components);
        Object res = Array.newInstance(boxClass, length);

        for (int i = 0; i < length; i++) {
            Array.set(res, i, Array.get(components, i));
        }

        return (T[]) res;
    }

    @Override
    public T get(int index) {
        return data[index];
    }

    @Override
    public int size() {
        return data.length;
    }
}

পরীক্ষা ক্ষেত্রে:

List<Integer> ints = PrimitiveWrapper.ofIntegers(10, 20);
List<Double> doubles = PrimitiveWrapper.ofDoubles(10, 20);
// etc

5

সেরা শট:

**
 * Integer modifiable fix length list of an int array or many int's.
 *
 * @author Daniel De Leon.
 */
public class IntegerListWrap extends AbstractList<Integer> {

    int[] data;

    public IntegerListWrap(int... data) {
        this.data = data;
    }

    @Override
    public Integer get(int index) {
        return data[index];
    }

    @Override
    public Integer set(int index, Integer element) {
        int r = data[index];
        data[index] = element;
        return r;
    }

    @Override
    public int size() {
        return data.length;
    }
}
  • সমর্থন পেতে এবং সেট।
  • কোনও মেমরি ডেটা সদৃশ নয়।
  • লুপগুলিতে সময় নষ্ট করার দরকার নেই।

উদাহরণ:

int[] intArray = new int[]{1, 2, 3};
List<Integer> integerListWrap = new IntegerListWrap(intArray);
List<Integer> integerListWrap1 = new IntegerListWrap(1, 2, 3);

আমি এটি সবচেয়ে পছন্দ করি। তবে আমি সোজা-সামনের সমাধানের জন্য পেয়ারা ব্যবহার করব :)
23:25

1

আপনি যদি কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহারের জন্য উন্মুক্ত হন তবে এটি Eclipse সংগ্রহগুলিতে কাজ করবে :

int[] a = {1, 2, 3};
List<Integer> integers = IntLists.mutable.with(a).collect(i -> i);
Assert.assertEquals(Lists.mutable.with(1, 2, 3), integers);

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ ।


1
   /* Integer[] to List<Integer> */



        Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        List<Integer> arrList = new ArrayList<>();
        arrList.addAll(Arrays.asList(intArr));
        System.out.println(arrList);


/* Integer[] to Collection<Integer> */


    Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    Collection<Integer> c = Arrays.asList(intArr);

1

এই সম্পর্কে কি:

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


1

এখানে একটি সমাধান:

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

Integer[] iArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(iArray));

List<Integer> list = new ArrayList<>();
Collections.addAll(list, iArray);
System.out.println(list);

আউটপুট:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1

এখানে আবার জাভা 8 স্ট্রিম সহ আরও একটি সম্ভাবনা রয়েছে:

void intArrayToListOfIntegers(int[] arr, List<Integer> list) {
    IntStream.range(0, arr.length).forEach(i -> list.add(arr[i]));
}

0

অ্যারেলিস্টে অ্যারে রূপান্তর করার একটি সাধারণ উপায়

<T> ArrayList<T> toArrayList(Object o, Class<T> type){
    ArrayList<T> objects = new ArrayList<>();
    for (int i = 0; i < Array.getLength(o); i++) {
        //noinspection unchecked
        objects.add((T) Array.get(o, i));
    }
    return objects;
}

ব্যবহার

ArrayList<Integer> list = toArrayList(new int[]{1,2,3}, Integer.class);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.