jdk6和7的sort排序實現不兼容問題

public class TestComparator {

	private List<Integer> intList = null;
	
	@Before
	public void setup(){
		intList = Arrays.asList(
				  1,0,0,0,0,0,0,0,0,0,
				  0,0,0,0,0,0,0,0,0,0,
				  0,0,0,0,-2,1,0,-2,0,
				  0,0,0);
	}
	
	/**
	 * jdk7中錯誤的比較器實現
	 * 若需在jdk7中兼容此寫法,能夠配置
	 * -Djava.util.Arrays.useLegacyMergeSort=true
	 * 
	 * 由於在1.7中使用了TimSort來實現排序算法,和1.6的MergeSort不一樣
	 * 不能相互兼容
	 * 
	 * IllegalArgumentException不是必定會被觸發,取決於須要被排序的內容
	 * 如下的一個int數組是一個可觸發的例子。具體緣由過於複雜,有興趣能夠深刻
	 * 看看TimSort的算法源碼實現。
	 */
	@Test
	public void testIllegalComparator(){
		try{
			Collections.sort(intList, new Comparator<Integer>(){
				@Override
				public int compare(Integer o1, Integer o2) {
					return o1 > o2 ? 1 : -1; // 不理會相等返回0的狀況
				}
			});
		}catch(Exception e){
			Assert.assertTrue(e instanceof IllegalArgumentException);
		}
	}
	
	/**
	 * jdk7中正確的比較器實現
	 */
	@Test
	public void testCorrectComparator(){
		try{
			Collections.sort(intList, new Comparator<Integer>(){
				@Override
				public int compare(Integer o1, Integer o2) {
					if(o1 == o2){
						return 0; // 增長相等返回0的狀況
					}
					return o1 > o2 ? 1 : -1;
				}
			});
		}catch(Exception e){
			Assert.assertTrue(false);
		}
		Assert.assertTrue(true);
	}
	
	@After
	public void teardown(){}
	
}
相關文章
相關標籤/搜索