package test; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import junit.framework.Assert; import org.junit.Test; public class MergeSortedList { @SuppressWarnings({ "rawtypes", "unchecked" }) public static List<Comparable> mergeList(List<Comparable> a, List<Comparable> b) { List<Comparable> ret = new ArrayList<Comparable>(a.size() + b.size()); if (a.size() == 0) { return b; } if (b.size() == 0) { return a; } Iterator<Comparable> ia = a.iterator(); Iterator<Comparable> ib = b.iterator(); ia.hasNext(); ib.hasNext(); Comparable ac = ia.next(); Comparable bc = ib.next(); while (true) { if (ac == null) { ret.add(bc); addRest(ib, ret); return ret; } if (bc == null) { ret.add(ac); addRest(ia, ret); return ret; } if (ac.compareTo(bc) > 0) { ret.add(bc); if (ib.hasNext()) { bc = ib.next(); } else { bc = null; } } else { ret.add(ac); if (ia.hasNext()) { ac = ia.next(); } else { ac = null; } } } } @SuppressWarnings("rawtypes") private static void addRest(Iterator<Comparable> ia, List<Comparable> ret) { while (ia.hasNext()) { ret.add(ia.next()); } } @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testEmptyA() { List<Comparable> a = listGen(0); List<Comparable> b = listGen(5000); List<Comparable> ret = mergeList(a, b); Assert.assertEquals(a.size() + b.size(), ret.size()); Comparable small = Integer.MIN_VALUE; for (Comparable c : ret) { Assert.assertTrue(small.compareTo(c) <= 0); small = c; } } @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testEmptyB() { List<Comparable> a = listGen(1000); List<Comparable> b = listGen(0); List<Comparable> ret = mergeList(a, b); Assert.assertEquals(a.size() + b.size(), ret.size()); Comparable small = Integer.MIN_VALUE; for (Comparable c : ret) { Assert.assertTrue(small.compareTo(c) <= 0); small = c; } } @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testIt() { List<Comparable> a = listGen(1000); List<Comparable> b = listGen(5000); List<Comparable> ret = mergeList(a, b); Assert.assertEquals(a.size() + b.size(), ret.size()); Comparable small = Integer.MIN_VALUE; for (Comparable c : ret) { Assert.assertTrue(small.compareTo(c) <= 0); small = c; } } @SuppressWarnings({ "rawtypes", "unchecked" }) public static List<Comparable> listGen(final int size) { List<Comparable> ret = new ArrayList<Comparable>(size); for (int i = 0; i < size; i++) { ret.add(new Integer((int) (Math.random() * size * 100000))); } Collections.sort(ret); return ret; } }