rain
rain

Reputation: 25

merge two arraylist lists in list1 while it remain sorted

In my assignment the third step is to Call the method merge to merge the two lists in list1 so that the list1 remains sorted.

I write my code but it doesn't work well , the output show wrong because it important to be sorted

 public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
 {
        int i;
        int n=list1.size();
        int pos , j=0;

        for (pos =0 ;pos<n ; pos++)
        {
            for ( i=0 ; i<n ; i++)
                if (list1.get(j)>list2.get(pos))
                    list1.add(pos,list2.get(pos));
                else 
                    j++;
       } 
 }

Upvotes: 1

Views: 13967

Answers (7)

Satish Kumar
Satish Kumar

Reputation: 21

public list mergeAndSort(List<integer> list1, List<integer> list2){
List<integer> list3;
int list2Size = list2.size();
for(int i=0;i<list2Size;i++){
    list1.add(list2(i));  
}
// Here we got all the elements in 1 list i.e list1

int list1Size = list1.size();
for(i=0;i<list1Size;i++){
    int small = 0;
    for(int j=i;j<list1size;j++){
        if(list1(i)> list2(j)){
            small = list2(j;
        }
    }
    list3.add(small); //Smallest 1 will be added to the new list
}

}

Upvotes: 0

Cemil Dogan
Cemil Dogan

Reputation: 1199

     ArrayList<Integer> a = new ArrayList();
     ArrayList<Integer> b = new ArrayList();
     ArrayList<Integer> c = new ArrayList();

     a.add(1);
     a.add(3);
     a.add(5);
     a.add(7);
     a.add(17);
     a.add(27);
     a.add(37);

     b.add(0); 
     b.add(2);
     b.add(4);

     while( a.size() > 0 || b.size() >0){

        if( a.size() == 0 || b.size() == 0){
            c.addAll(b);
            c.addAll(a);
            break;
        }

        if(a.get(0) < b.get(0)){
            c.add(a.get(0));
            a.remove(0);
        }
        else{
            c.add(b.get(0));
            b.remove(0);
        }

    }

    System.out.println(c.toString());

Upvotes: -1

Keppil
Keppil

Reputation: 46209

You only need one for loop assuming both lists are sorted:

public static void merge(List<Integer> l1, List<Integer> l2) {
    for (int index1 = 0, index2 = 0; index2 < l2.size(); index1++) {
        if (index1 == l1.size() || l1.get(index1) > l2.get(index2)) {
            l1.add(index1, l2.get(index2++));
        }
    }
}  

If l2 isn't sorted, you need two loops:

public static void merge(List<Integer> l1, List<Integer> l2) {
    for (int index2 = 0; index2 < l2.size(); index2++) {
        for (int index1 = 0; ; index1++) {
            if (index1 == l1.size() || l1.get(index1) > l2.get(index2)) {
                l1.add(index1, l2.get(index2));
                break;
            }
        }
    }
}

Upvotes: 10

netmikey
netmikey

Reputation: 2550

If your input Lists aren't too long, I'd suggest just merging the lists and using the Collections.sort() Method to restore the order:

public static void mergeAndSort(List<Integer> list1, List<Integer> list2) {
    List<Integer> combinedList = new ArrayList<Integer>(list1);
    combinedList.addAll(list2);
    Collections.sort(combinedList);
    return combinedList;
}

As a sidenote, you should use the List interface instead of the ArrayList implementation class wherever possible.

Upvotes: 0

Harry
Harry

Reputation: 1472

public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    list1.addAll(list2);
    Collections.sort(list1);
}

Upvotes: 1

Renjith
Renjith

Reputation: 3617

After you merge the lists, call sort method as below.

Collections.sort(list1); // carries out natural ordering.

If you need a customized sorting, use Comparator object

Collections.sort(list1, comparatorObject);

Check Comparator example for more details.

Here is your modified code:

 public static void merge (ArrayList<Integer> list1, ArrayList<Integer> list2)
 {
    list1.add(list2); //merges list 2 to list1
    Collections.sort(list1); //natural ordering
 }

Upvotes: 0

atamanroman
atamanroman

Reputation: 11808

Easy fix: sort afterwards.

list1.addAll(list2);
Collections.sort(list1);

Use sets to avoid duplicates.

Upvotes: 2

Related Questions