如何按索引顺序合并两个ArrayList为一个ArrayList

3
我有两个数组列表,它们都包含相同数量的元素。我的想法是将这两个数组列表合并成一个,但我希望按照索引顺序逐个添加元素。目前我有下面列出的代码,但效率不高:
ArrayList <String> listA = ["a", "c", "e"]
ArrayList <String> listB = ["b", "d","f"]
ArrayList <String> listC;
for (int i = 0; i < listA.size() + listB.size(); i++){
    listC.add(listA.get(i));
    lictC.add(listB.get(i));
}
return listC;

输出 = ["a", "b", "c", "d", "e", "f"];

listC会是null,所以你无法调用.add()方法...而那个for循环会导致IndexOutOfBounds Exception异常。 - 3kings
4
限制应该只是 listA.size(),而不是 listA.size() + listB.size()。你的意思是说,这样不太有效率?那你有什么其他方法可以做到除了逐个读取所有元素并将它们相加? - Paul Boddington
“持有x数量的相等元素” - 这些元素究竟如何相等? - Alex Salauyou
@jpablo09然后我可以引用我对类似问题的回答:http://stackoverflow.com/a/32720213/3459206 - Alex Salauyou
@jpablo09 如果是这样的话,那么这听起来像是一个XY问题。http://meta.stackexchange.com/a/66378 你真正的问题是如何提高应用程序启动的性能,而不是如何组合两个ArrayList。我建议你尝试创建一个最小的Android示例来演示性能问题,因为没有办法大幅度改善你向我们展示的问题的性能。 - Paul Boddington
显示剩余4条评论
4个回答

5

正如我在评论中所指出的,我认为这是一个XY问题。

然而,这个答案可能有帮助。它产生了一个List(但不是ArrayList),它是两个原始List的交替视图,避免了需要进行任何复制的需求。因此,它是O(1) 而不是 O(n)

public static <T> List<T> alternate(final List<? extends T> list1, final List<? extends T> list2) {
    final int size = list1.size();
    if (list2.size() != size)
        throw new IllegalArgumentException();
    return new AbstractList<T>() {
        @Override
        public int size() {
            return 2 * size;
        }
        @Override
        public T get(int i) {
            return ((i & 1) == 0 ? list1 : list2).get(i >> 1);
        }
    };
}

public static void main(String[] args) {
    List<String> list1 = Arrays.asList("A", "B", "C");
    List<String> list2 = Arrays.asList("D", "E", "F");
    System.out.println(alternate(list1, list2));  // prints [A, D, B, E, C, F]
}

谢谢您的回复,代码完美运行,应用程序现在加载速度非常快。@PaulBoddington - jpablo09
@jpablo09 这是个好消息。这个想法有些冒险,所以我很高兴它奏效了。AbstractList 是我最喜欢的 Java 类。 - Paul Boddington
其他像iteratorindexOfadd这样的List方法会起作用吗?这就是继承带来的风险,而组合则没有这些问题。 - Steve Kuo
是的,它们都按照预期工作。会改变列表的方法会抛出异常。通常情况下,您应该优先考虑组合而不是继承,但 AbstractList 的设计目的是为了被扩展。 - Paul Boddington

0

只需在for循环中使用一个arraylist大小即可。请参见我的答案:

ArrayList <String> listA = ["a", "c", "e"]
ArrayList <String> listB = ["b", "d","f"]
ArrayList <String> listC = new ArrayList(listA.size() + listB.size());
for (int i = 0; i  < listA.size(); i++){
    listC.add(listA.get(i));
    lictC.add(listB.get(i));
}
return listC;

只有当listA和listB的大小相同时,此代码才有效。new ArrayList(listA.size() + listB.size()); 是无用的。 - Aguid
问题有相同大小的列表,因此我建议使用这个。 如果两个列表的大小不同,则需要相应地更改此逻辑。 - Brijesh Chopda

-1
这段代码对你有用吗?
ArrayList<ArrayList<String>> arraListOfArrayList = new ArrayList<ArrayList<String>>();
ArrayList<String> arrayList = new ArrayList<String>();
arraListOfArrayList.add(arrayList);

-3
你可以尝试这样做。

ArrayList<String> listC = new ArrayList<>();

listC.addAll(listA);
listC.addAll(listB);

然后进行排序

Collections.sort(listC);


3
这将把listB添加到listA的末尾。他想要的是合并后 listA.get(N) 紧挨着listB.get(N)。如果列表没有排序,那么排序不起作用。 - DeeV
排序在最后。 - Giuseppe Scopelliti
@GiuseppeScopelliti 因为他想按索引排序,所以没有排序。 - Yassin Hajaj
@GiuseppeScopelliti 如果列表A是["S", "B", "R", "K"]呢? - DeeV
@Deev 你希望得到什么结果? - Giuseppe Scopelliti
1
如果列表A是["S", "B", "R", "K"],列表B是["Z", "Q", "A", "R"],则结果应该是["S", "Z", "B", "Q", "R", "A", "K", "R"]。排序会将它们放在不正确的顺序中。 - DeeV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接