本计划WAS作业。我们已经完成了它并且很好。我想知道是否有更简化的方式来编写这个程序?该程序称为Interleave,它所做的是采用两个ArrayLists并将它们组合在一起,以便第一个中的每个其他元素来自第二个ArrayList。听起来很简单,就是这样,我们使用Iterator来完成并添加必要的元素。但代码是BLOCKY。在我看来,必须有更好的方式来写这个,对吧?提前致谢。
import java.util.*;
public class Interleave
{
public static void main(String[] args)
{
ArrayList<Integer> a1 = new ArrayList<Integer>();
Collections.addAll(a1, 10, 20, 30);
ArrayList<Integer> a2 = new ArrayList<Integer>();
Collections.addAll(a2, 4, 5, 6, 7, 8, 9);
System.out.println(a1);
System.out.println(a2);
System.out.println(interleave(a1, a2));
ArrayList<String> list = new ArrayList<String>();
String[] words =
{ "how", "are", "you?" };
for (String s : words)
{
list.add(s);
}
}
public static ArrayList<Integer> interleave(ArrayList<Integer> a1,
ArrayList<Integer> a2)
{
Iterator<Integer> it = a2.iterator();
int i = 1;
while (it.hasNext())
{
int val = it.next();
if (a1.size() >= i)
{
a1.add(i, val);
} else
{
a1.add(val);
}
i += 2;
}
return a1;
}
}
答案 0 :(得分:2)
public static ArrayList<Integer> interleave(ArrayList<Integer> a1, ArrayList<Integer> a2)
{
Iterator<Integer> it1 = a1.iterator();
Iterator<Integer> it2 = a2.iterator();
ArrayList<Integer> output = new ArrayList<Integer>();
while (it1.hasNext() || it2.hasNext())
{
if (it1.hasNext()) { output.add( it1.next() ); }
if (it2.hasNext()) { output.add( it2.next() ); }
}
return output;
}
答案 1 :(得分:1)
效率比代码的外观更重要。每次在索引i处添加元素时,ArrayList之后的每个元素都需要由ArrayList向上移动一个索引,因为它使用数组作为其底层数据结构。如果使用LinkedList来避免这个问题,或者如果你创建了第三个大小的数组(第一个数组+第二个数组)并且只是将元素添加到那个代码,那么这个代码会更有效。然后,您还必须考虑空间,因此制作另一个阵列会增加空间要求。
即使您坚持使用当前的方法,也应该在添加所有元素之前增加阵列的容量。这样,阵列的容量已经足够大,可以添加来自另一个阵列的所有元素,并且不会(可能)需要多次增加。
希望有所帮助。
编辑:
你也可以事先重新配置你的阵列,这样每隔一个点就已经空了,这样可以避免我之前描述的阵列移位问题。
答案 2 :(得分:0)
现在,您的interleave
函数假设特定的列表实现(ArrayList
)和特定的类型必须< / em>包含(Integer
)。您可以使用泛型来概括此函数:
public static <T> List<T> interleave(List<T> first, List<T> second)
{
Iterator<T> it = second.iterator();
int i = 1;
while (it.hasNext()) {
T val = it.next();
if (first.size() >= i)
first.add(i, val);
else
first.add(val);
i += 2;
}
return first;
}
答案 3 :(得分:0)
我认为你不能减少代码量。它也许不能太快。不过我会建议其他一些改进:
List
代替ArrayList
,因此可以传入任何类型的List
。Integer
。这些组合会产生这样的结果:
public static <T> List<T> interleave(List<T> a1, List<T> a2) {
List<T> list = new ArrayList<T>(a1.size() + a2.size());
Iterator<T> it1 = a1.iterator();
Iterator<T> it2 = a2.iterator();
while (it1.hasNext() || it2.hasNext()) {
if (it1.hasNext()) {
list.add(it1.next());
}
if (it2.hasNext()) {
list.add(it2.next());
}
}
return list;
}