繁体   English   中英

交错 - 在 java 中无法正常工作

[英]Interleave - in java doesn't properly work

我在 java 中实现了这种交错方法,但它不能正常工作。 我的错误在哪里? 我想混合 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;
}

提前谢谢了。

问候,科科

错误是您只查看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());
    }
}

可以只使用尺寸,找到最小的尺寸,然后填写 rest,但代码可能会变得丑陋。 此外,上面的代码可以推广到任何两个Iterable<String>值,而不仅仅是List<String>

因为您正在循环 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;
    }

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

使用您当前的代码

  1. 如果 size(list2) > size(list1) 它将忽略一些值
  2. 如果 size(list1) > size(list2) 会抛出异常

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

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

那么,看看你的第一个列表的大小,然后想想 for 循环的执行频率如何?

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

  1. list2 更长(如您的情况),因此如果 list1 大小为 X,您将添加 list1 中的 X 元素和 list2 中的 X 元素。

  2. 更糟糕的是 - list2 更短- 在这种情况下,您会遇到异常,因为您已经超出了列表边界。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM