Java में int [] को List <Integer> में कैसे कन्वर्ट करें?


382

मैं जावा int[]में कैसे परिवर्तित करूं List<Integer>?

बेशक, मैं किसी अन्य उत्तर में रुचि रखता हूं, इसे लूप में करने से, आइटम द्वारा आइटम। लेकिन अगर कोई और जवाब नहीं है, तो मैं इस तथ्य को दिखाने के लिए सबसे अच्छा के रूप में चुनूंगा कि यह कार्यक्षमता जावा का हिस्सा नहीं है।


हम IntStream.Of (सरणी) .collect (संग्राहक.लूटिस्ट) का उपयोग कर सकते हैं
सरोज कुमार साहू

जवाबों:


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
for (int i: ints) intList.add (i);
स्टीफन डेने

18
@willcodejavaforfood - डेविड का मतलब है कि यह बेहतर है: नए एरियरिस्ट <Integer> (ints.nength);
स्टीफन डेने

12
@willcodejavaforfood: जब यह निर्माण किया जा रहा है तो ArrayList के आकार को घोषित करने से यह निश्चित मात्रा में जोड़े जाने के बाद आंतरिक रूप से आकार बदलने से रोकेगा। यकीन नहीं है कि लाभ छोटा है, लेकिन निश्चित रूप से एक लाभ है।
ग्रैन्डलफ्लेक

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

350

स्ट्रीम

Java 8 में आप ऐसा कर सकते हैं

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

21
समतुल्य: Arrays.stream (ints) .boxed ()। एकत्रित करना (कलेक्टर .toList ());
njfrost

4
@njfrost आप सही हैं और IntStream.of सिर्फ Arrays.stream को कॉल करता है, इसलिए मैंने आपके सुझाव के बाद जवाब में सुधार किया है
mikeyreilly

किसी कारण से यह एंड्रॉइड स्टूडियो (ग्रहण पर काम करता है) पर अपेक्षित परिणाम प्रकार को वापस नहीं करता है, यह कहता है, अपेक्षित सूची <पूर्णांक> पाया सूची <ऑब्जेक्ट>।
यूजेनियो लोपेज

यह साफ और संक्षिप्त लगता है, लेकिन जब मैंने इसे लेटकोड पर @willcodejavaforfood द्वारा उपलब्ध कराए गए मूल समाधान के विरोध के रूप में इस्तेमाल किया, तो कार्यक्रम प्रदर्शन स्मृति के साथ-साथ रनटाइम के रूप में अपमानित हुआ
चित्रेश सिरोही

@chitreshsirohi ऐसा इसलिए है क्योंकि धाराओं के अंदर इस्तेमाल किए गए लैम्ब्डा कार्यों के परिणामस्वरूप जावा में कुछ अनाम कक्षाएं बनती हैं।
अश्विन शर्मा

175

अमरूद पुस्तकालयों से भी ... com.google.common.primatics.Ints:

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

11
यह सही उत्तर होना चाहिए। प्रश्न का दूसरा वाक्य देखें: "बेशक, मैं किसी अन्य उत्तर को लूप में करने के बजाय आइटम द्वारा आइटम करने में रुचि रखता हूं।"
josketres

धन्यवाद धन्यवाद धन्यवाद! इसके अलावा Longs.asList (लंबे ...) के लिए काम करता है।
अनुष्ठान

2
यहाँ कुछ सूक्ष्मताएँ हैं। लौटी सूची प्रदान की गई सरणी को बैकिंग स्टोर के रूप में उपयोग करती है, इसलिए आपको सरणी को म्यूट नहीं करना चाहिए। सूची में निहित इंटेगर ऑब्जेक्ट की पहचान की गारंटी नहीं है। अर्थात, list.get (0) == list.get (0) का परिणाम निर्दिष्ट नहीं है।
pburka

1
लाइब्रेरी जोड़ते समय एंड्रॉइड पर विधि संदर्भ गणना से सावधान रहें। हालांकि अच्छा मिल गया।
milosmns

95

Arrays.asList कुछ अन्य उत्तरों की अपेक्षा के अनुरूप काम नहीं करेगा।

यह कोड 10 पूर्णांकों की सूची नहीं बनाएगा। यह 1 प्रिंट करेगा , न कि 10 :

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);

यदि आपके पास पहले से ही टाट की सरणी है, तो कन्वर्ट करने का कोई त्वरित तरीका नहीं है, आप लूप के साथ बेहतर हैं।

दूसरी ओर, यदि आपके एरे में ऑब्जेक्ट्स हैं, न कि इसमें प्रिमिटिव हैं, Arrays.asList काम करेगा:

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
जबकि ArrayList बनाने की तुलना में कम मेमोरी का उपयोग करना, व्यापार बंद है। List.add () और List.remove () काम नहीं करते हैं।
स्टीफन डेने

3
मैं विरल एक्सेस पैटर्न वाले बड़े सरणियों के लिए इस समाधान को बहुत पसंद करता हूं, लेकिन अक्सर एक्सेस किए गए तत्वों के लिए यह इंटेगर के कई अनावश्यक इंस्टेंसेस के परिणामस्वरूप होगा (उदाहरण के लिए यदि आप एक ही तत्व 100 बार एक्सेस करते हैं)। इसके अलावा, आपको Iterator को परिभाषित करने और कलेक्शन में रिटर्न वैल्यू को लपेटने की आवश्यकता होगी।
Adamski

@Christoffer धन्यवाद मैंने setविधि जोड़ दी है और अब मैं सरणी को सॉर्ट भी कर सकता हूं ...
स्वतंत्रता दिवस

39

कोड का सबसे छोटा टुकड़ा होगा:

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

जहाँ ArrayUtils कॉमन्स-लैंग से आता है :)


9
बस ध्यान दें ArrayUtilsकि यह एक एंड्रॉइड ऐप के लिए एक रिश्तेदार बड़ा पुस्तकालय है
msysmilu

विपरीत ऑपरेशन यहां वर्णित है: 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
बस एक कलेक्टर का उपयोग क्यों नहीं?
assylias


16

यदि आप जावा 8 का उपयोग कर रहे हैं, तो हम इसे एक सूची में बदलने के लिए स्ट्रीम एपीआई का उपयोग कर सकते हैं।

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

तुम भी रूपांतरित करने के लिए IntStream का उपयोग कर सकते हैं।

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

अमरूद जैसे अन्य बाहरी पुस्तकालय हैं और अपाचे कॉमन्स भी इसे परिवर्तित करते हैं।

खुश होती है।


11

यह इस बग रिपोर्ट को देखने लायक भी है , जिसे "नहीं दोष" और निम्नलिखित पाठ के कारण बंद किया गया था:

"पूरे सरणियों का ऑटोबॉक्सिंग अच्छे कारण के लिए, निर्दिष्ट व्यवहार नहीं है। यह बड़े सरणियों के लिए निषेधात्मक रूप से महंगा हो सकता है।"


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);

मुझे यह सबसे ज्यादा पसंद है। लेकिन मैं अभी भी अमरूद का उपयोग सीधे-फॉरवर्ड समाधान करने के लिए
करूंगा

1

यदि आप किसी तीसरे पक्ष के पुस्तकालय का उपयोग करने के लिए खुले हैं, तो यह ग्रहण संग्रहों में काम करेगा :

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

सरणी को ArrayList में बदलने का एक सामान्य तरीका यहां दिया गया है

<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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.