编写此程序的更有效方法

时间:2011-05-18 18:29:11

标签: java arraylist

本计划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;

}

}

4 个答案:

答案 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)

我认为你不能减少代码量。它也许不能太快。不过我会建议其他一些改进:

  1. 如果您要返回另一个对象,则改变传入的对象并不是一个好习惯。
  2. 您可以使用List代替ArrayList,因此可以传入任何类型的List
  3. 您可以使用泛型不使其特定于Integer
  4. 列表

    这些组合会产生这样的结果:

    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;
    }