交错 - 在java中没有正常工作

时间:2011-07-04 13:09:08

标签: java list

我在java中实现了这个interleave方法,但它无法正常工作。我的错误在哪里? 我想混合使用2个字符串列表。

["a","b","c"]
["1","2","3","4"]

结果应为= [a, 1, b, 2, c, 3, 4] 但我只得到[a, 1, b, 2, c, 3]

public static List<String> interleave(List<String> list1,List<String>list2){
    List<String> result= new ArrayList<String>();

    for(int i=0; i<list1.size(); i++){
        result.add(list1.get(i));
        result.add(list2.get(i));
    }
    return result;
}
提前多多感谢。

的问候, 科科

6 个答案:

答案 0 :(得分:4)

错误是您只查看list1.size(),而在您的情况下,第二个列表比第一个列表长。

你应该很可能使用迭代器:

Iterator<String> iterator1 = list1.iterator();
Iterator<String> iterator2 = list2.iterator();

while (iterator1.hasNext() || iterator2.hasNext())
{
    if (iterator1.hasNext())
    {
        result.add(iterator1.next());
    }
    if (iterator2.hasNext())
    {
        result.add(iterator2.next());
    }
}

可以只使用尺寸,找到最小尺寸然后填写其余部分,但代码可能会变得难看。此外,上述代码可推广到任意两个Iterable<String>值,而不只是List<String>

答案 1 :(得分:1)

因为你循环遍历list1大小为3.你可以这样做:

public static List<String> interleave(List<String> list1,List<String>list2){
        List<String> result= new ArrayList<String>();

        if(list1.size()<list2.size()){
            for(int i=0; i<list1.size(); i++){
                result.add(list1.get(i));
                result.add(list2.get(i));
            }
            for (int i = list1.size(); i < list2.size(); i++) {
                result.add(list2.get(i));
            }
        } else {
            for(int i=0; i<list2.size(); i++){
                result.add(list1.get(i));
                result.add(list2.get(i));
            }
            for (int i = list2.size(); i < list1.size(); i++) {
                result.add(list1.get(i));
            }
        }
        return result;
    }

答案 2 :(得分:1)

实际上,您不会处理两个列表都有不同大小的情况。这是错误。

使用您当前的代码

  1. 如果size(list2)&gt;它会忽略一些值。大小(列表1)
  2. 如果size(list1)&gt;它将抛出异常大小(列表2)

  3. 这应该有效(或至少提出一个想法,无法测试)

    public static List<String> interleave(List<String> list1,List<String>list2){
        List<String> result= new ArrayList<String>();
    
        List<String> minList = list1.size() <= list2.size() ? list1 : list2;
        List<String> maxList = list1.size() <= list2.size() ? list2 : list1;
    
        // interleave up to the size of the smaller list
        for(int i=0; i<minList.size(); i++){
            result.add(list1.get(i));
            result.add(list2.get(i));
        }
    
        // add the other elements from the bigger list
        for(int i=minList.size(); i < maxList.size(); i++) {
            result.add(maxList.get(i));
        }
    
        return result;
    }
    

答案 3 :(得分:0)

那么,看看你的第一个列表的大小然后考虑for循环执行的频率怎么样呢?

答案 4 :(得分:0)

您的循环只在达到list1的大小时才会运行。这可能会导致两个问题:

  1. list2更长(如你的情况),所以如果list1的大小是X,你将从list1添加X元素,从list2添加X元素。

  2. 更糟糕的是 - list2更短 - 在这种情况下,您将获得异常,因为您的列表边界已用完。

  3. 当Y是较短列表的大小时,您应该执行此循环Y次,然后添加较长列表的其余元素。

答案 5 :(得分:0)

public static List<String> interleave(List<String> list1,List<String>list2){
    List<String> result= new ArrayList<String>();

    int common = Math.min(list1.size(),list2.size());
    for(int i=0; i<common; i++){
        result.add(list1.get(i));
        result.add(list2.get(i));
    }
    for(int i=common; i<list1.size(); i++){
        result.add(list1.get(i));
    }
    for(int i=common; i<list2.size(); i++){
        result.add(list2.get(i));
    }
    return result;
}

或者:

public static List<String> interleave(List<String> list1,List<String>list2){
    List<String> result= new ArrayList<String>();

    int max = Math.max(list1.size(),list2.size());
    for(int i=0; i<max; i++){
        if (i < list1.size()) {
            result.add(list1.get(i));
        }
        if (i < list2.size()) {
            result.add(list2.get(i));
        }
    }
    return result;
}