অ্যারেলিস্ট.অটোরে () আরও সুনির্দিষ্ট প্রকার ফেরান


189

সুতরাং, সাধারণত ArrayList.toArray()একটি প্রকার ফিরে আসবে Object[].... তবে এটি Arraylistঅবজেক্টের একটি ধারণা Custom, আমি কীভাবে toArray()এর Custom[]পরিবর্তে কোনও প্রকার ফেরত দেব Object[]?


1
অ্যারেলিস্টে একই সাথে 'টু অ্যারে ()' নামে দুটি পদ্ধতি রয়েছে। 1.5 থেকে শুরু করে, দ্বিতীয় পদ্ধতিটি টাইপযুক্ত অ্যারে নেয়। আপনি কি প্রাক-1.5 এর জন্য সমাধান খুঁজছেন?
রীতেশ

সম্পর্কিত: stackoverflow.com/questions/174093
tkruse

উত্তর:


308

এটার মত:

List<String> list = new ArrayList<String>();

String[] a = list.toArray(new String[0]);

জাভা Before এর আগে এটি লেখার জন্য সুপারিশ করা হয়েছিল:

String[] a = list.toArray(new String[list.size()]);

কারণ অভ্যন্তরীণ বাস্তবায়ন যে কোনও উপায়ে সঠিক আকারের অ্যারেটিকে পুনরায় প্রত্যাখ্যান করবে তাই আপনি আরও ভাল করে সামনে এগিয়ে যাচ্ছেন। যেহেতু জাভা 6 খালি অ্যারেটিকে অগ্রাধিকার দেওয়া হয়েছে, তাই .আরআরে (নতুন মাইক্লাস [0]) বা .to অরে (নতুন মাইক্লাস [মাইলিস্ট.সাইজ ()]) দেখুন?

যদি আপনার তালিকাটি যথাযথভাবে টাইপ করা না থাকে তবে অ্যারিতে কল করার আগে আপনাকে একটি কাস্ট করতে হবে। এটার মত:

    List l = new ArrayList<String>();

    String[] a = ((List<String>)l).toArray(new String[l.size()]);

1
আফাইক: জেনারিক কনস্ট্রাক্টর ব্যবহার করতে না পারায় সামগ্রিকভাবে জাভার সাথে এর কিছু করার রয়েছে। সুতরাং যখন এটি জানে যে আপনার স্ট্রিং [] বা মাইবজেক্ট [] এর মতো কোনও বিষয় আপনাকে রূপান্তর করতে হবে তবে এটি এটি নিজেই ইনস্ট্যান্ট করতে পারে না।

স্ট্রিংয়ের পরিবর্তে যদি আমরা ডাবল ব্যবহার করতে চাই? এটি ব্যর্থ বলে মনে হচ্ছে ... আমরা ডাবল ব্যবহার করতে পারি, তবে আমি যদি ডাবল চাই?
পিক্সেল

2
@pbs আপনি পারবেন না জাভার জেনেরিকগুলি কেবল প্রারম্ভিক নয়, রেফারেন্স ধরণের সমর্থন করে। অটো-বক্সিং / আনবক্সিংয়ের মাধ্যমে আপনাকে বেশিরভাগ অংশের মধ্যে পার্থক্য উপেক্ষা করতে দেওয়া উচিত।
সোলারশাদো

16

এটির ফিরে আসার দরকার নেই Object[], উদাহরণস্বরূপ: -

    List<Custom> list = new ArrayList<Custom>();
    list.add(new Custom(1));
    list.add(new Custom(2));

    Custom[] customs = new Custom[list.size()];
    list.toArray(customs);

    for (Custom custom : customs) {
        System.out.println(custom);
    }

এখানে আমার Customক্লাস:

public class Custom {
    private int i;

    public Custom(int i) {
        this.i = i;
    }

    @Override
    public String toString() {
        return String.valueOf(i);
    }
}


1

আমি উত্তর পেয়েছি ... এটি পুরোপুরি ঠিকঠাক কাজ করছে বলে মনে হচ্ছে

public int[] test ( int[]b )
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    Object[] returnArrayObject = l.toArray();
    int returnArray[] = new int[returnArrayObject.length];
    for (int i = 0; i < returnArrayObject.length; i++){
         returnArray[i] = (Integer)  returnArrayObject[i];
    }

    return returnArray;
}

0
@SuppressWarnings("unchecked")
    public static <E> E[] arrayListToArray(ArrayList<E> list)
    {
        int s;
        if(list == null || (s = list.size())<1)
            return null;
        E[] temp;
        E typeHelper = list.get(0);

        try
        {
            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            for (int i = 0; i < list.size(); i++)
                Array.set(temp, i, list.get(i));
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

নমুনা:

String[] s = arrayListToArray(stringList);
Long[]   l = arrayListToArray(longList);

1
যদি আমাদের অ্যারেলিস্ট <অ্যানিমাল> থাকে এবং এতে কুকুর এবং বিড়ালের ধরণের রয়েছে যা প্রাণীজ প্রসারিত করে? দেখে মনে হচ্ছে এটি ব্যর্থ হবে যদি প্রথম উপাদানটি কুকুর এবং পরেরটি ক্যাট হয়। এটি প্রথম উপাদানটি দেখে, প্রকারের কুকুরের একটি অ্যারে তৈরি করে, কুকুরটিকে যুক্ত করে বিড়াল যুক্ত করার চেষ্টা করে এবং ব্যর্থ হয়। জেনেরিক ই এর
সাথেও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.