পূর্ণসংখ্যা সহ অ্যারেলিস্টকে আদিম ইন অ্যারেতে কীভাবে রূপান্তর করবেন?


297

আমি নিম্নলিখিত কোডের টুকরো দিয়ে পূর্ণসংখ্যার অবধি [] পূর্ণসংখ্যার অবজেক্টযুক্ত একটি অ্যারেলিস্টে রূপান্তর করার চেষ্টা করছি, তবে এটি সংকলনের সময় ত্রুটি ছুঁড়ে দিচ্ছে। জাভা রূপান্তর করা সম্ভব?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);

10
এই প্রশ্নের একটি নির্ভুল নকল নয় (যদিও খুব
দূরেও

1
হ্যাঁ, এটি একটি অ্যারেলিস্ট, "সদৃশ" একটি সাধারণ অ্যারে সম্পর্কে।
স্কট ম্যাকআইন্টির

3
আপনার যদি আদিম List<Integer> x = new ArrayList<Integer>(); Integer[] n = x.toArray(new Integer[0]);
কালিগুলির

উত্তর:


219

আপনি রূপান্তর করতে পারেন, তবে আমি মনে করি না এটি স্বয়ংক্রিয়ভাবে করার জন্য কোনও কিছু অন্তর্নির্মিত রয়েছে:

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}

(দ্রষ্টব্য যে এটির মধ্যে একটি integersবা নলপয়েন্টার এক্সেকশনটি নিক্ষেপ করবে within null)

সম্পাদনা: মতামত অনুসারে, আপনি তালিকার পুনরাবৃত্তকারীগুলিকে তালিকার সাথে খারাপ ব্যবহারগুলি এড়াতে ব্যবহার করতে চাইতে পারেন যেমন LinkedList:

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    Iterator<Integer> iterator = integers.iterator();
    for (int i = 0; i < ret.length; i++)
    {
        ret[i] = iterator.next().intValue();
    }
    return ret;
}

21
তালিকার পুনরাবৃত্তকারী (প্রত্যেকটির জন্য) ব্যবহার করে পুনরাবৃত্তি করা ভাল হতে পারে যাতে তালিকায় অ্যাক্সেস ও (1) নয় এমন পারফরম্যান্স হিট এড়াতে পারে।
ম্যাথু উইলিস

@ ম্যাথুজ: হ্যাঁ, সম্ভবত - এটি বিকল্প হিসাবে দেওয়ার জন্য সম্পাদনা করবে।
জন স্কিটি

1
আপনি অ্যারেলিস্টটি পরিমার্জনযোগ্য (সংগ্রহের উত্তরাধিকারের মাধ্যমে) প্রয়োগ করে এবং ব্যবহার করতে পারেন: (int n: পূর্ণসংখ্যা) এর জন্য [ret [কাউন্টার ++] = n; } ... এবং আরম্ভ করা ইন কাউন্টার = 0;
গারধড়

8
জাভা 8-তে এখন অনেক সহজ:integers.stream().mapToInt(Integer::valueOf).toArray
মণীশ প্যাটেল 21 ই

241

আপনি যদি ব্যবহার করছেন এটি করার আরও একটি উপায় আছে।

int[] arr = list.stream().mapToInt(i -> i).toArray();

এটি যা করে তা হ'ল:

  • Stream<Integer>তালিকা থেকে একটি পেয়ে
  • একটি প্রাপ্তির IntStreamনিজেই (পরিচয় ফাংশন) প্রতিটি উপাদান ম্যাপিং, আনবক্সিং দ্বারা intপ্রতিটি দ্বারা মূল্য রাখা Integerবস্তু (জাভা 5 যেহেতু স্বয়ংক্রিয়ভাবে সম্পন্ন)
  • intকল করে অ্যারে পেয়েtoArray

আপনি intValueকোনও পদ্ধতি রেফারেন্সের মাধ্যমেও স্পষ্টভাবে কল করতে পারেন , যেমন:

int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

এটি উল্লেখ করারও দরকার যে তালিকায় NullPointerExceptionআপনার কোনও nullরেফারেন্স থাকলে আপনি একটি পেতে পারেন । এই জাতীয় স্ট্রিম পাইপলাইনে ফিল্টারিং শর্ত যুক্ত করে সহজেই এড়ানো যায়:

                       //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();

উদাহরণ:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]

আমি এটি doubleপ্রকারের জন্য ব্যবহার করা যেতে পারে দেখতে ; floatপ্রকারের জন্য কোন সমতুল্য নেই ?
কোড_ড্রেড

জাভা 8 এর সুবিধাটি আপনি বিস্তৃত ব্যাখ্যা দ্বারা দেখেছেন।
ইউজিন

এবং এই কারণেই জাভা 8+ স্ট্রিম এপিআই সুন্দর।
প্রণব এ

67

গুগল পেয়ারা

গুগল পেয়ারা কল করে এটি করার একটি ঝরঝরে উপায় সরবরাহ করে Ints.toArray

List<Integer> list = ...;
int[] values = Ints.toArray(list);

6
আমি মনে করি এটি আমার জন্য উত্তর হবে - আমি কোনও দিন একটি অনুলিপি-পেস্ট ফাংশন নিয়ে একটি গ্রন্থাগার নেব .. বিশেষত একটি শালীন আকারের প্রকল্প সম্ভবত ইতিমধ্যে ব্যবহার করা হয়েছে। আমি আশা করি এই উত্তর ভবিষ্যতে আরও বেশি ভোট এবং দৃশ্যমানতা পেয়েছে।
শন কনোলি

61

অ্যাপাচি কমন্সে একটি অ্যারে ইউটিস ক্লাস রয়েছে, যার প্রিমিটিভ () করার পদ্ধতি রয়েছে যা এটি ঠিক করে দেয়।

import org.apache.commons.lang.ArrayUtils;
...
    List<Integer> list = new ArrayList<Integer>();
    list.add(new Integer(1));
    list.add(new Integer(2));
    int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

যাইহোক, জন যেমন দেখিয়েছেন, বাহ্যিক গ্রন্থাগার ব্যবহার না করে নিজেই এটি করা খুব সহজ।


2
নোট করুন যে এই পদ্ধতিটি ক্রমের দুটি সম্পূর্ণ অনুলিপি তৈরি করবে: একটি পূর্ণসংখ্যা [] টো অ্যারে দ্বারা তৈরি করা হয়েছে, এবং একটি অন্তর্নিহিত [] টুপ্রাইটিভের ভিতরে তৈরি করা হয়েছে। জনের অন্য উত্তরগুলি কেবল একটি অ্যারে তৈরি করে এবং পূরণ করে। আপনার কাছে বড় তালিকা রয়েছে কিনা তা বিবেচনা করার মতো কিছু এবং কর্মক্ষমতা গুরুত্বপূর্ণ।
পরকীয়া

আমি অ্যারে ইউটিলস বনাম খাঁটি জাভা এবং ছোট তালিকাগুলিতে (<25 উপাদান) খাঁটি জাভা 100 গুণ বেশি দ্রুত গতি ব্যবহার করে পারফরম্যান্সটি পরিমাপ করেছি। 3 কে উপাদানগুলির জন্য খাঁটি জাভা এখনও প্রায় 2 গুণ বেশি দ্রুত ... (অ্যারেলিস্ট <Integer> -> অন্তর্ [])
ওসকার লুন্ড

@paraquat এবং ওসকার লুন্ড যেটি আসলে সঠিক নয়। হ্যাঁ, প্রদত্ত কোডটি দুটি অ্যারে তৈরি করবে, তবে এই পদ্ধতিটি কার্যকর হয় না। এই কোডটিতে সমস্যাটি হ'ল আর্গুমেন্ট হিসাবে শূন্য দৈর্ঘ্যের অ্যারের ব্যবহার। ArrayList.toArray সোর্স কোড শো যে যদি বিষয়বস্তু মাপসই করা হবে, মূল অ্যারের ব্যবহার করা হবে। আমি মনে করি একটি নিখুঁত তুলনায় আপনি এই পদ্ধতিটি দক্ষ হিসাবে (আরও বেশি না হলে) এবং অবশ্যই বজায় রাখতে কম কোড পাবেন।
শন কনোলি


1
নতুন পূর্ণসংখ্যা [0] এর উদ্দেশ্য কি ওয়াট?
অ্যাডাম হিউজ

41

আমি বিশ্বাস করি যে তালিকার পুনরাবৃত্তকারী ব্যবহার করে পুনরাবৃত্তি করা একটি ভাল ধারণা, কারণ list.get(i)তালিকার বাস্তবায়নের উপর নির্ভর করে দুর্বল কার্য সম্পাদন করতে পারে:

private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}

6

ডলার ব্যবহার করা বেশ সহজ হওয়া উচিত:

List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4  
int[] array = $($(list).toArray()).toIntArray();

মধ্যবর্তী toArray()কল সরাতে আমি ডিএসএলকে উন্নত করার পরিকল্পনা করছি


1
আরে, আমি কেবল বলতে চেয়েছিলাম আমি ডলারের আগে দেখিনি, তবে আমি অবশ্যই এটি আমার পরবর্তী প্রকল্পে চেষ্টা করে যাচ্ছি। আপনি সেখানে যাচ্ছেন এমন এক নিফটি ছোট্ট এপিআই, ভাল কাজ চালিয়ে যান :)
বার্ট ভান্ডেন্দ্রিয়েশে

4

এটি আমার জন্য দুর্দান্ত কাজ করে :)

Https://www.techiedelight.com/convert-list-integer-array-int/ এ পাওয়া গেছে

import java.util.Arrays;
import java.util.List;

class ListUtil
{
    // Program to convert list of integer to array of int in Java
    public static void main(String args[])
    {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        int[] primitive = list.stream()
                            .mapToInt(Integer::intValue)
                            .toArray();

        System.out.println(Arrays.toString(primitive));
    }
}

3

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

শুধু অ্যাপাচি কমন্সের সাথে যান


7
আমি পূর্ববর্তী মন্তব্যকারীর সাথে একমত নই আপনি কেবল অ্যাপাচি কমন্সে টানবেন না, তবে এটি সহজেই ট্রানজিটিভ নির্ভরতার বৃহত সংখ্যায় অনুবাদ করে যা এগুলিতেও টানতে হবে Recently সাম্প্রতিককালে আমি কোডের একটি লাইন প্রতিস্থাপন করে একটি আশ্চর্যজনক # নির্ভরতা সরিয়ে ফেলতে পারি :-( নির্ভরতা ব্যয়বহুল এবং এই জাতীয় বুনিয়াদি কোড লেখা ভাল অনুশীলন
পিটার ক্রিয়েন্স

1
@ পিটারক্রাইনের সাথে একমত যদি কিছু হয় তবে দোষটি স্ট্যান্ডার্ড ডেটা ধরণের ক্ষেত্রে এর মতো সাধারণ রূপান্তরকে সমর্থন না করার জন্য জাভাতে রয়েছে
অ্যাডাম হিউজ

3

আপনি যদি গ্রিপস সংগ্রহগুলি ব্যবহার করছেন তবে আপনি collectInt()কোনও অবৈধ ধারক থেকে আদিম কোন পাত্রে স্যুইচ করার পদ্ধতিটি ব্যবহার করতে পারেন ।

List<Integer> integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
MutableIntList intList =
  ListAdapter.adapt(integers).collectInt(i -> i);
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray());

আপনি আপনার রূপান্তর করতে পারেন ArrayListএকটি থেকে FastList, আপনি অ্যাডাপ্টারের পরিত্রাণ পেতে পারেন।

Assert.assertArrayEquals(
  new int[]{1, 2, 3, 4, 5},
  Lists.mutable.with(1, 2, 3, 4, 5)
    .collectInt(i -> i).toArray());

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



2

Arrays.setAll ()

    List<Integer> x = new ArrayList<>(Arrays.asList(7, 9, 13));
    int[] n = new int[x.size()];
    Arrays.setAll(n, x::get);

    System.out.println("Array of primitive ints: " + Arrays.toString(n));

আউটপুট:

আদিম কালের অ্যারে: [7, ৯, ১৩]

একটি অ্যারের জন্য একই কাজ longবা double, কিন্তু এর অ্যারে জন্য নয় boolean, char, byte, shortবা float। যদি আপনি সত্যিই একটি বিশাল তালিকা পেয়ে থাকেন তবে এমন একটি parallelSetAllপদ্ধতি রয়েছে যা আপনি পরিবর্তে ব্যবহার করতে পারেন।

আমার কাছে এটি যথেষ্ট ভাল এবং মার্জিত যে আমি কোনও বাহ্যিক গ্রন্থাগার পেতে চাই না এবং এর জন্য স্ট্রিম ব্যবহার করতে চাই না।

ডকুমেন্টেশন লিঙ্ক: Arrays.setAll(int[], IntUnaryOperator)


1

আপনি কেবল একটি অ্যারে অনুলিপি করতে পারেন:

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

খুব অভিনব নয়; কিন্তু, আরে, এটা কাজ করে ...


1

খুব সহজ এক-লাইন সমাধান হ'ল:

Integer[] i = arrlist.stream().toArray(Integer[]::new);

0

এই কোড বিভাগটি আমার জন্য কাজ করছে, এটি চেষ্টা করুন:

Integer[] arr = x.toArray(new Integer[x.size()]);

অ্যারেলিস্ট উল্লেখ করার মতো বিষয় এইভাবে ঘোষণা করা উচিত:

ArrayList<Integer> list = new ArrayList<>();

5
হ্যালো কেবল একটি মৃদু অনুস্মারক যে ওপি একটি আদিম অ্যারে চায় না কোনও অবজেক্ট অ্যারে।
ওলিভার.কু

3
পূর্ণসংখ্যার অভ্যন্তরের মোড়ক নয়!
বার্টজিলা

-4
   List<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(2);

    int[] result = null;
    StringBuffer strBuffer = new StringBuffer();
    for (Object o : list) {
        strBuffer.append(o);
        result = new int[] { Integer.parseInt(strBuffer.toString()) };
        for (Integer i : result) {
            System.out.println(i);
        }
        strBuffer.delete(0, strBuffer.length());
    }

1
এই উত্তরটি কাজ করে না, এটি একাধিক উপাদানের পরিবর্তে একটি একক উপাদান সহ একটি অ্যারে প্রদান করে।
রহস্যময়

স্ট্রিংবাফার কেন ব্যবহার করবেন? কেন পূর্ণসংখ্যাটিকে একটি স্ট্রিং এবং তারপরে একটি পূর্ণসংখ্যার এবং তারপরে একটি পূর্ণসংখ্যা এবং তারপরে আবার একটি পূর্ণসংখ্যায় রূপান্তর করা হয়? কেন এটিতে একটি একক উপাদান সহ একটি অ্যারে ব্যবহার করবেন এবং কেন যখন কেবলমাত্র একটি উপাদান থাকবে তখন সেই একক-উপাদান অ্যারের উপরে লুপ করবেন? বাইরের লুপে অবজেক্টগুলিতে ইন্টিজারগুলি কাস্ট করুন? এখানে অনেক প্রশ্ন আছে। @ কোডেমেডনেস কি কেবল একটি ট্রল অ্যাকাউন্ট?
ভিক্টর জামামানিয়ান

-5
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

arrসাধারণ মত অ্যাক্সেস int[]


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