【问题标题】:Fill a array with List data with one more element用 List 数据填充一个数组,再添加一个元素
【发布时间】:2010-05-03 15:01:46
【问题描述】:

通过我提出的一个问题,我发现要将元素从一个列表复制到一个数组,我只需要使用 toArray() 方法即可。

但假设我有一个包含 n 个对象的列表。然后我想将其复制到一个大小为 n+1 的数组中,并将另一个对象添加到第一个位置,并在其他 n 位置添加 n 数据的列表。

这就是我现在正在做的方式,但我只是想知道是否有更好的方式来做到这一点:

    Object array[] = new Object[list.size() + 1];

    Object chk = new Object();

    array[0] = chk;

    for(int i = 1; i < array.length; i++){
        array[i] = list.get(i);
    }

【问题讨论】:

    标签: java list arrays copy


    【解决方案1】:

    您可以使用 LinkedList 并使用 offerFirst(),然后使用 toArray(),但我怀疑这真的很重要。

    【讨论】:

    • 这个 offerFirst 方法来自哪里?
    • offerFirst(E) 是 Java 1.6 (java.sun.com/javase/6/docs/api/java/util/…) 中的一个新函数,它在列表的开头添加一个给定元素。它对列表的影响与addFirst(E)add(0, E) 相同。
    • 似乎 offerFirst 仅在 LinkedLists 中可用。列表接口的其他实现没有这个方法。
    【解决方案2】:

    使用迭代器:

    ...
    
    int i = 1;
    for(Object item:list){
        array[i] = item;
        i++;
    }
    

    【讨论】:

    • +1:对于某些类型的列表,迭代比get(i) 解决方案更有效,例如LinkedList。与此处给出的其他一些答案不同,此解决方案不会更改列表。
    【解决方案3】:

    我不明白你想要达到什么目的,但如果我正确理解了这个问题,我会这样做:

        List<Object> elementList = new ArrayList<Object>();
        Object additionalElement = new Object();
        Object array[] = null;
    
        //[Add code to populate the List]
    
        //Add the additional element
        elementList.add(0,additionalElement);
    
        array = elementList.toArray();
    

    这样做的好处是不迭代任何东西。

    【讨论】:

    • 但是这个add方法不会改变位于位置0的元素吗?
    • 这种方法会改变列表:它在位置 0 添加一个新元素,将所有其他元素移动一个位置(位置 0 到位置 1 等)。
    • 谢谢@Christian。我不知道这个 add 实现改变了后续值的索引。
    • set 方法覆盖给定索引处的元素,而不是插入它。
    • 我在这里很困惑 - code to populate the ListtoArray() 都必须迭代。这根本没有“不迭代任何东西的优势”。
    【解决方案4】:

    如果您正在寻找一种避免遍历数组和列表的方法,我认为您不走运。 Java 不提供进行海量复制的方法,除了那些只使用 API 调用在后台循环遍历集合的方法,隐藏在视图之外。

    【讨论】:

      【解决方案5】:

      没有循环的唯一方法是:

      Object array[] = new Object[list.size() + 1];
      Object oldValues[] = list.toArray();
      
      Object chk = new Object();
      array[0] = chk;
      System.arrayCopy(oldValues, 0, array, 1, oldValues.length);
      

      System.arrayCopy 比循环快一点(不是太多,但还是更快),尽管toArray 可能会减轻性能提升,具体取决于您的 List 的实现。

      总而言之,只要List.get(int) 是可接受的成本,您所拥有的就是一种不错的方法。 (如果是 O(n),您的操作最终会得到 O(n^2),当 Frank 的解决方案是 O(n) 时,这是次优的。)

      【讨论】:

      • 这不是唯一的方法,请看上面
      • @Chepech 好的,已经十年了,但是-上面的答案使用add,它在内部使用grow,它使用Arrays.copyOf,它使用......鼓声...... System.arrayCopy - 所以我的意思是,是的,这是唯一的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2011-07-13
      相关资源
      最近更新 更多