【问题标题】:The best way to transform int[] to List<Integer> in Java? [duplicate]在 Java 中将 int[] 转换为 List<Integer> 的最佳方法? [复制]
【发布时间】:2011-10-01 10:08:09
【问题描述】:

可能重复:
How to create ArrayList (ArrayList<T>) from array (T[]) in Java

如何实现这个方法:

List<Integer> toList(int[] integers) {
    ???
    //return Arrays.asList(integers); doesn't work
}

【问题讨论】:

  • 在我编辑之前,这个问题的第二部分是否有原因?
  • @DJClayworth:我想,不。我已经标记了这个问题并解释了我在提交这个问题时遇到了一些困难。
  • @Merlyn:不是重复的。原始数组与对象数组不同
  • @Alexander:哇。太恶心了 :) 我无法撤销我的投票,所以我将删除我的评论。

标签: java generics collections


【解决方案1】:

可能有一种内置方法可以在某处执行此操作*(如您所见,Arrays.asList 无法正常工作,因为它需要 Integer[] 而不是 int[])。

我不太了解 Java 库,无法告诉您它在哪里。但是自己写很简单:

public static List<Integer> createList(int[] array) {
    List<Integer> list = new ArrayList<Integer>(array.length);
    for (int i = 0; i < array.length; ++i) {
        list.add(array[i]);
    }
    return list;
}

显然,这样做的一个缺点是您不能通用地执行此操作。您必须为所需的每个自动装箱的原始类型编写单独的 createList 方法。

*如果没有,我真的想知道为什么没有。

【讨论】:

  • 为了效率,我可能会推荐new ArrayList&lt;Integer&gt;(array.length)。应该让 Java 不必调整集合的大小来添加元素。
【解决方案2】:

使用 commons-lang3 org.apache.commons.lang3.ArrayUtils.toObject(&lt;yout int array&gt;) 然后java.util.Arrays.asList(&lt;&gt;)

ArrayUtils.toObject()复制数组,Array.asList() 将简单地创建由新数组支持的列表。

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

编辑:如果您想通过列表接口 add() 新元素(调整大小),这将不起作用,如果您想能够添加新元素,你可以使用new ArrayList(),但这会创建一个更多的副本。

【讨论】:

  • 你可以直接用List&lt;Integer&gt; xValues = Arrays.asList(new Integer[] { 150, 160, 175, 165, 165 });来做
  • @AlexanderPacha 当然,它适用于 Integer[] 文字,但不适用于现有的 int[]。它不能放在 OP 的方法框架中。
【解决方案3】:
List<Integer> asList(final int[] integers) {
    return new AbstractList<Integer>() {
        public Integer get(int index) {
            return integers[index];
        }

        public int size() {
            return integers.length;
        }
    };
}

【讨论】:

  • 有几个大问题:(1)列表是由数组支持的——也就是说,如果数组元素发生变化,列表元素也会发生变化。 (2) 对于较大的整数,每次都会返回一个不同的 Integer ——也就是说,你不能对引用相等有任何期望。其中任何一个都可能是问题,也可能不是问题,但它们是半出人意料的行为。在我添加 (3) 之前,Java 真的可以做这样的闭包吗?
  • @cHao: 3. 是的,Java 可以做这样的闭包!
  • 从技术上讲,这应该被命名为 as List,至少在假设 Java 在这方面遵循与 .NET 相同的命名约定时(asto 实际进行转换时为同一集合提供不同类型的视图)。
  • 这些不是闭包。它们是匿名类。
  • @Christoffer,啊,是的,那没问题:我以为add(...)是在AbstractList中实现的。我的错,谢谢你的信息!
【解决方案4】:
List<Integer> toList(int[] integers) {
    // Initialize result's size to length of the incoming array
    // this way it will not require reallocations
    ArrayList<Integer> result = new ArrayList<Integer>( integers.length );

    for ( int cur: integers )
    {
        result.add( Integer.valueOf( cur ) );
    }

    return result;
}

【讨论】:

    【解决方案5】:

    不幸的是,我认为没有快速的方法可以做到这一点。我相信你将不得不迭代数组并一个一个地添加它。

    【讨论】:

      【解决方案6】:
      import java.util.Arrays;
      import java.util.ArrayList;
      import java.util.List;
      
      public class Listing {
        public static void main(String[] args) {
      
         int[] integers = {1,2,3,4};
      
         java.util.List<Integer> list = new ArrayList<Integer>();
        for (int i=0; i< integers.length; i++)
        {
            list.add(integers[i]);
        }
        System.out.println(list);
      }
      }
      

      经过测试并按预期工作!

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 2021-07-16
        • 1970-01-01
        • 2016-12-26
        • 2021-08-20
        相关资源
        最近更新 更多