hashmap的基於hash表的實現機制決定了他非常快的檢索速度,但也定了「不能排序」的標牌,工作中如果需要排序就要使用treemap
treemap是可排序map,可對ke進行排序,那麼,是不是任何我們原來使用hashmap實現的業務都能使用treemap進行替換排序呢?
答案是:「
否」
原因在於,它們判斷重複元素機制不同:hashmap通過hashcode和equals方法來判斷重複,以決定是否加入到map中
而treemap則是通過排序碼來決定的,也就是實現comparator元素的compare中使用到的排序碼(通常與我們的業務有關係),如果排序碼相同則不加入到treemap中,
實際工作中,hashmap中完全可能存在這種元素,因為hashmap的實現機制並沒有阻止這種排序碼相同的元素加入,所以不能簡單的將hashmap替換為treemap以完成元素排序,下面的這個例子演示了這個錯誤:
public static void main(string args)
@override
public int compareto(obj o)
}map hashmap = new hashmap();
hashmap.put(new obj(1),new obj(0));
hashmap.put(new obj(3),new obj(0));
hashmap.put(new obj(5),new obj(0));
hashmap.put(new obj(2),new obj(0));
hashmap.put(new obj(4),new obj(0));
system.out.println(hashmap);//5個元素
map treemap = new treemap();
treemap.putall(hashmap);
system.out.println(treemap);//1個元素
}
上面的**演示出:原先hashmap中的5個元素,被匯入到treemap中後變成了1個,慎重!
所以千萬不要直接將hashmap想當然地替換為treemap,你最好評估下是否會產生這種問題。
hashmap排序解決方案:
將hashmap的entry放入到list中,對list排序就好了,例項**:
public static void main(string args)
@override
public int compareto(obj o)
}map hashmap = new hashmap();
hashmap.put(new obj(1), new obj(0));
hashmap.put(new obj(3), new obj(0));
hashmap.put(new obj(5), new obj(0));
hashmap.put(new obj(2), new obj(0));
hashmap.put(new obj(4), new obj(0));
system.out.println(hashmap);//5個元素
list> list = new arraylist>();
list.addall(hashmap.entryset());
collections.sort(list, new comparator>()
});for (map.entryentry : list)
}
利用TreeMap對map進行排序
treemap是可以根據鍵對map進行排序的,注意 是根據鍵。一般來講,鍵可以使integer或者是string,但是也可以是物件,但是該物件的實現類必須實現comparable介面。class mycompare implements comparable override public stri...
TreeMap根據value排序
首先自己寫乙個比較器,實現comparator介面,自己寫乙個構造方法,將乙個map集合傳遞進去。class valuecomparator implements comparator override public int compare string o1,string o2 else 使用 p...
TreeMap對value的排序
我們都知道treemap是排序的,但是它是對key進行排序的,要對value進行排序,可以用下面這種方法 大致的思路是把treemap的entryset轉換成list,然後使用collections.sor排序。mapresult new treemap result.put aaaa 4 resu...