【问题标题】:recursion - adding numbers from two lists to an new list递归 - 将两个列表中的数字添加到新列表中
【发布时间】:2015-02-06 16:04:23
【问题描述】:

堆栈溢出。

我有两个 ArrayList,一个包含数字 1,2,3,4,5(list1),另一个包含 6,7,8,9,10,11,12 (list2)。

我正在编写一个递归程序,将所有这些数字添加到一个新列表(list3)中。它必须添加 list1 中的第一个数字,然后是 list2 中的第一个数字,然后是 list1 中的第二个数字,然后是 list2 中的第二个数字,依此类推。

如果其中一个列表包含的数字比另一个多,那么它应该简单地将剩余的数字添加到列表的后面。在这种情况下,应添加数字 11 和 12。

我现在得到的输出是:[1, 6, 2, 7, 3, 8, 4, 9, 5, 10] 但它应该是: [1, 6, 2, 7, 3, 8, 4 , 9, 5, 10, 11, 12]

错误是“java.lang.IndexOutOfBoundsException:索引:5,大小:5”,但我不知道如何解决这个问题。 它说我添加到 list3 的两行有错误。

任何帮助将不胜感激。

 import java.util.ArrayList;
 import java.util.List;


 public class Ex12_2_alternate {
public static void main(String[] args){

    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();

    //adds 1 - 5 (both incl.) to list1
    for (int i = 1; i <= 5; i++) {
        list1.add(i);
    }

    // adds 6 - 12 (both incl.) to list2
    for (int i = 6; i <= 12; i++) {
        list2.add(i);
    }

    System.out.println("list1: " + list1);
    System.out.println("list2: " + list2);

    alternate(list1,list2);

}

private static void alternate(List<Integer> list1, List<Integer> list2) {

    List<Integer> list3 = new ArrayList<Integer>();

    int j = 0;
    int k = list1.size() + list2.size();
    while (j < k) {
        list3.add(list1.get(j));
        list3.add(list2.get(j));
        System.out.println("list3 so far: " + list3);
        j++;
    }
 }
}

【问题讨论】:

  • 该代码中没有递归。
  • 当 J = 6 时,list3.add(list1.get(j)); 会做什么?
  • 这个程序不是递归的,它是迭代的。此外, k 将始终大于 list1 和 list2 的大小(因为您将它们的大小相加),因此您将始终超出范围。您需要确定哪个列表更小并在该大小上循环。然后遍历更大列表的剩余元素。
  • @molbdnilo,哦...我认为它有一点递归。我还有多远?
  • @chancea, IndexOutOfBounds: Index: 6, Size: 5

标签: java recursion arraylist parameters


【解决方案1】:

您可以实施的一个简单解决方案是只运行您的 while 循环,而您的计数小于小于您较小列表的大小。在现有的while 循环之后,您可以简单地迭代将较大列表中的剩余元素添加到list3。

尝试自己编写这篇文章对您来说是一个很好的练习。请注意,您当前的错误是您的方法在list1 中查找索引 6 处的元素的结果,但显然该索引处没有值。

【讨论】:

    【解决方案2】:

    `public static void main(String[] args) { System.out.println("init"); 列表 list1 = new ArrayList(); List list2 = new ArrayList();

        //adds 1 - 5 (both incl.) to list1
        for (int i = 1; i <= 5; i++) {
            list1.add(i);
        }
    
        // adds 6 - 12 (both incl.) to list2
        for (int i = 6; i <= 12; i++) {
            list2.add(i);
        }
    
        List<Integer> list3=recursive(list1, list2, new ArrayList<Integer>());
    
        Iterator<Integer> it=list3.iterator();
        while(it.hasNext())
        {
            System.out.print(it.next() +" ");
        }
    
    }
    
    private static List<Integer> recursive(List<Integer>list1, List<Integer> list2,List<Integer> list3)
    {
        if(list1.isEmpty()&&list2.isEmpty())
        {
            return list3;
        }
        if(!list1.isEmpty())
        {
         list3.add(list1.remove(0));
        }
        if(!list2.isEmpty())
        {
         list3.add(list2.remove(0));
        }
         return recursive(list1, list2,list3);
    }`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多