Alternating between two arraylists.
我无法让这个东西运行。 我不确定到目前为止我的情况是否正确。 我不太确定在哪里给我一个出界的错误。
以下是说明:
编写一个名为interleave的方法,它接受两个整数a1和a2的ArrayLists作为参数,并在交替索引处将a2的元素插入a1。 如果列表长度不等,则较长列表的其余元素将保留在a1的末尾。 例如,如果a1存储[10,20,30]和a2存储[4,5,6,7,8],则调用interleave(a1,a2); 应该改变a1来存储[10,4,20,5,30,6,7,8]。 如果a1已存储[10,20,30,40,50]并且a2已存储[6,7,8],则交错调用(a1,a2); 会改变a1来存储[10,6,20,7,30,8,40,50]。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | private static void interleave(ArrayList<Integer> a1, ArrayList<Integer> a2) { int i = a1.size(); int j = a2.size(); if (i < j) { // a1 is shorter than a2 for (int k = 0; k < a1.size(); k++) { // before k passes a1 size a1.add(k+1, a2.get(k)); } for (int l = a1.size(); l < a2.size(); l++) { a1.add(a1.size(), a2.get(l)); } } else if (i > j) { // a1 is longer than a2 for (int k = 1; k < a2.size(); k++) { a1.add(k+1, a2.get(k)); } } else { // they are equal length for (int k = 1; k < a2.size(); k++) { a1.add(k+1, a2.get(k)); } } } |
这应该工作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private static void interleave(ArrayList<Integer> a1, ArrayList<Integer> a2) { int i = -1; for(Integer elem: a2) { if(i < a1.size()-1) { i += 2; } else { i += 1; } a1.add(i, elem); } } public static void main(String[] args) throws Exception { ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(10, 20, 30)); ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(4, 5, 6, 7, 8)); interleave(a1, a2); System.out.println(a1); } |
编辑:我不得不承认,这段代码实际上是一个非常糟糕的解决方案,因为对于长列表来说它会非常慢。每次将元素添加到a1时,列表的大部分都必须移动一个位置。
因此,按照"MadProgrammer"的建议,这是一个更好,更快的方法
1 2 3 4 5 6 7 8 9 10 | private static void interleave(ArrayList<Integer> a1, ArrayList<Integer> a2) { ArrayList<Integer> r = new ArrayList<>(a1.size() + a2.size()); for(int i = 0, j = 0; i < a1.size() || j < a2.size(); i++, j++) { if(i < a1.size()) r.add(a1.get(i)); if(j < a2.size()) r.add(a2.get(j)); } a1.clear(); a1.addAll(r); } |
我看到已经有任何已接受的答案,但我认为这是一种情况,使用具有适当索引变量的
我同意关于不提供作业答案的评论,但由于已经有完整实现的答案,并且我想将
1 2 3 4 5 6 | public static < T > List< T > interleave( final List< T > l1, final List< T > l2 ) { for ( int i = 0; i < l2.size(); i++ ) { l1.add( Math.min( i*2+1, l1.size()), l2.get( i )); } return l1; } |
但这不一定是最有效的实现。当你到达
在上下文中,并使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Interleave { public static < T > List< T > interleave( final List< T > l1, final List< T > l2 ) { for ( int i = 0; i < l2.size(); i++ ) { l1.add( Math.min( i*2+1, l1.size()), l2.get( i )); } return l1; } public static void main(String[] args) { final List<Integer> l1 = new ArrayList<Integer>( Arrays.asList( 10, 20, 30 ) ); final List<Integer> l2 = Arrays.asList( 4, 5, 6, 7 ,8 ); System.out.println( interleave( l1, l2 )); } } |
在考虑了这个之后,我认为在这里使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static < T > List< T > interleaveWithIterators( final List< T > l1, final List< T > l2 ) { // Get an iterator for the l1, and position it after the first element // or at the end, if there's no first element. final ListIterator< T > it1 = l1.listIterator(); if ( it1.hasNext() ) { it1.next(); } // Get an iterator for l2. While there are elements remaining in l2, // keep adding them to l1 by calling it1.add(). While there are elements // in l1, this also requires pushing it1 forward by one element on each iteration. final ListIterator< T > it2 = l2.listIterator(); while ( it2.hasNext() ) { it1.add( it2.next() ); if ( it1.hasNext() ) { it1.next(); } } return l1; } |
为避免在每次迭代时检查
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static < T > List< T > interleaveWithIterators( final List< T > l1, final List< T > l2 ) { final ListIterator< T > it1 = l1.listIterator(); if ( it1.hasNext() ) { it1.next(); } final ListIterator< T > it2 = l2.listIterator(); while ( it2.hasNext() && it1.hasNext() ) { it1.add( it2.next() ); it1.next(); } while ( it2.hasNext() ) { it1.add( it2.next() ); } return l1; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public static LinkedList<Integer> alternate(LinkedList<Integer> list1, LinkedList<Integer> list2){ List<Integer> newList = new LinkedList<Integer>(); Iterator<Integer> itr1 = list1.iterator(); Iterator<Integer> itr2 = list2.iterator(); while (itr1.hasNext() || itr2.hasNext()){ if (itr1.hasNext()){ newList.add(itr1.next()); } if (itr2.hasNext()){ newList.add(itr2.next()); } } return newList; } |
这对我有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private static void interleave(ArrayList<Integer> a1, ArrayList<Integer> a2) { int i = -1; for(Integer elem: a2) { if(i < a1.size()-1) { i += 2; } else { i += 1; } a1.add(i, elem); } } public static void main(String[] args) throws Exception { ArrayList<Integer> a1 = new ArrayList<>(Arrays.asList(10, 20, 30)); ArrayList<Integer> a2 = new ArrayList<>(Arrays.asList(4, 5, 6, 7, 8)); interleave(a1, a2); System.out.println(a1); } |