Map 排序 TreeMap 陷阱

2021-07-16 20:22:49 字數 1798 閱讀 6755

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...