Java 当一个数组列表大于另一个数组列表时,尝试通过交错合并两个数组列表会引发IndexOutOfBoundsException

Java 当一个数组列表大于另一个数组列表时,尝试通过交错合并两个数组列表会引发IndexOutOfBoundsException,java,arraylist,Java,Arraylist,当ArrayList a大于b时,下面的代码会因IndexOutOfBoundsException而崩溃,但当ArrayList a的大小等于b或b的大小大于b时,下面的代码会正常工作 public class Q2 { /*this is the test for my code there has to be two arraylists */ public static void main(String[] args) { ArrayList<Int

当ArrayList a大于b时,下面的代码会因IndexOutOfBoundsException而崩溃,但当ArrayList a的大小等于b或b的大小大于b时,下面的代码会正常工作

public class Q2 {

    /*this is the test for my code there has to be two arraylists */
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<Integer>();
        a.add(2);
        a.add(3);
        a.add(7);
        a.add(1);
        a.add(10);
        ArrayList<Integer> b = new ArrayList<Integer>();
        b.add(1);
        b.add(2);
        b.add(3);
        b.add(9);

        System.out.print(merges(a, b));
    }

    public static ArrayList<Integer> merges(ArrayList<Integer> a, ArrayList<Integer> b) {

        ArrayList<Integer> merges = new ArrayList<Integer>();
        for (int i = 0; i < a.size(); i++) {
            merges.add(a.get(i));
            merges.add(b.get(i));
        }

        if (b.size() > a.size()) {
            for (int i = a.size(); i < b.size(); i++) {
                merges.add(b.get(i));
            }
        }
        else if (a.size() > b.size()) {
            for (int i = b.size(); i < a.size(); i++) {
                merges.add(a.get(i));
            }
        }
        else {
            return merges;
        }
        return merges;
    }
}
公共类Q2{
/*这是对我的代码的测试,必须有两个ArrayList*/
公共静态void main(字符串[]args){
ArrayList a=新的ArrayList();
a、 增加(2);
a、 增加(3);
a、 增加(7);
a、 增加(1);
a、 增加(10);
ArrayList b=新的ArrayList();
b、 增加(1);
b、 增加(2);
b、 增加(3);
b、 增加(9);
系统输出打印(合并(a、b));
}
公共静态ArrayList合并(ArrayList a、ArrayList b){
ArrayList merges=新建ArrayList();
对于(int i=0;ia.size()){
对于(int i=a.size();ib.size()){
对于(int i=b.size();i
您应该分别在两个阵列上循环,或者在较小的阵列上循环,然后添加较大阵列的其余部分

第一个解决方案:

public static ArrayList<Integer> merges(ArrayList<Integer> a, ArrayList<Integer> b) {

    ArrayList<Integer> merges = new ArrayList<Integer>();
    for (int i = 0; i < a.size(); i++) {
        merges.add(a.get(i));
    }
    for (int i = 0; i < b.size(); i++) {
        merges.add(b.get(i));
    }

    return merges;
}
        public static ArrayList<Integer> merges(ArrayList<Integer> a, ArrayList<Integer> b) {
  ArrayList<Integer> merges = new ArrayList<Integer>();
  if(a.size()<b.size()){
    int i=0;
    while(i<a.size()){
      merges.add(a.get(i++));
      merges.add(b.get(i++));
    }
    while(i<b.size()){
      merges.add(b.get(i++));
    }
  }else{
    int i=0;
    while(i<b.size()){
      merges.add(a.get(i++));
      merges.add(b.get(i++));
    }
    while(i<a.size()){
      merges.add(a.get(i++));
    }
  }
  return merges;
}
公共静态ArrayList合并(ArrayList a、ArrayList b){
ArrayList merges=新建ArrayList();
对于(int i=0;i
}

第二种解决方案:

public static ArrayList<Integer> merges(ArrayList<Integer> a, ArrayList<Integer> b) {

    ArrayList<Integer> merges = new ArrayList<Integer>();
    for (int i = 0; i < a.size(); i++) {
        merges.add(a.get(i));
    }
    for (int i = 0; i < b.size(); i++) {
        merges.add(b.get(i));
    }

    return merges;
}
        public static ArrayList<Integer> merges(ArrayList<Integer> a, ArrayList<Integer> b) {
  ArrayList<Integer> merges = new ArrayList<Integer>();
  if(a.size()<b.size()){
    int i=0;
    while(i<a.size()){
      merges.add(a.get(i++));
      merges.add(b.get(i++));
    }
    while(i<b.size()){
      merges.add(b.get(i++));
    }
  }else{
    int i=0;
    while(i<b.size()){
      merges.add(a.get(i++));
      merges.add(b.get(i++));
    }
    while(i<a.size()){
      merges.add(a.get(i++));
    }
  }
  return merges;
}
公共静态ArrayList合并(ArrayList a、ArrayList b){
ArrayList merges=新建ArrayList();

如果(a.size(),则只需循环较小列表的大小,然后在较大列表中添加剩余的元素。当尝试循环较大列表时,在访问较小列表中不存在的索引时,会出现nullpointer异常。