abdulaziz
abdulaziz

Reputation: 1

Trying to merge two ArrayLists by interleaving throws IndexOutOfBoundsException when one is larger than the other

The below code crashes with IndexOutOfBoundsException when ArrayList a is larger than b but it works just fine when they are equal in size or b is bigger

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

Upvotes: 0

Views: 62

Answers (1)

Ayoub
Ayoub

Reputation: 1435

you should loop over the two arrays separately or loop on the size of the smaller oner then add the rest of the larger one

First Solution:

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

}

Second Solution:

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

or simply you can use java.util.ArrayList.addAll(Collection c) method

Upvotes: 2

Related Questions