Ⅰ TreeMap的排序問題
public interface Comparator<T>比較函數強行對某些對象 collection 進行整體排序。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如 TreeSet 或 TreeMap)的順序。
當且僅當對於一組元素 S 中的每個 e1 和 e2 而言,(compare((Object)e1, (Object)e2)==0) 與 e1.equals((Object)e2) 具有相等的布爾值時,Comparator c 強行對 S 進行的排序才叫做與等號一致 的排序。
當使用具有與等號一致的強行排序能力的 comparator 對有序 set(或有序映射)進行排序時,應該小心謹慎。假定一個帶有顯式 Comparator c 的有序 set(或有序映射)與從 set S 中抽取出來的元素(或鍵)一起使用。如果 c 強行對 S 進行的排序與等號一致,那麼有序 set(或有序映射)將是行為「怪異的」。尤其是那些將違背根據 equals 所定義 set(或映射)的常規協定的有序 set(或有序映射)。
例如,如果使用 comparator c 將滿足 (a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) 的兩個鍵 a 和 b 添加到有序 set 中,則第二個 add 操作將返回 false(有序 set 的大小沒有增加),因為從有序 set 的角度來看,a 和 b 是相等的。
註:通常用 comparator 來實現 java.io.Serializable 是一個好主意,因為它們在可序列化的數據結構(像 TreeSet、TreeMap)中可用作排序方法。為了成功地序列化數據結構,comparator(如果已提供)必須實現 Serializable。
在算術上,定義給定 comparator c 對給定對象 set S 強行實施整體排序 的關系式 為:
{(x, y) such that c.compare((Object)x, (Object)y) <= 0}.
整體排序的商 是:
{(x, y) such that c.compare((Object)x, (Object)y) == 0}.
它直接遵循 compare 的協定,商是 S 上的等價關系,自然順序是 S 上的整體排序。當我們說 c 強行對 S 的排序是與等號一致 時,意思是說自然排序的商是對象的 equals(Object) 方法所定義的等價關系:
{(x, y) such that x.equals((Object)y)}.
Ⅱ java map容器 哪些排序
一.理論准備
Map是鍵值對的集合介面,它的實現類主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。
TreeMap:基於紅黑樹(Red-Black tree)的 NavigableMap 實現,該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
HashMap的值是沒有順序的,它是按照key的HashCode來實現的,對於這個無序的HashMap我們要怎麼來實現排序呢?參照TreeMap的value排序。
Map.Entry返回Collections視圖。
二.key排序
TreeMap默認是升序的,如果我們需要改變排序方式,則需要使用比較器:Comparator。Comparator可以對集合對象或者數組進行排序的比較器介面,實現該介面的public compare(T o1,To2)方法即可實現排序,如下:
import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class TreeMapTest { public static void main(String[] args) { Map<String, String> map = new TreeMap<String, String>( new Comparator<String>() { public int compare(String obj1, String obj2) { // 降序排序 return obj2.compareTo(obj1); } }); map.put("b", "ccccc"); map.put("d", "aaaaa"); map.put("c", "bbbbb"); map.put("a", "ddddd"); Set<String> keySet = map.keySet(); Iterator<String> iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + ":" + map.get(key)); } }}
運行結果如下:
d:aaaaac:bbbbbb:ccccca:ddddd
三.value排序
上面例子是對根據TreeMap的key值來進行排序的,但是有時我們需要根據TreeMap的value來進行排序。對value排序我們就需要藉助於Collections的sort(List<T> list, Comparator<? super T> c)方法,該方法根據指定比較器產生的順序對指定列表進行排序。但是有一個前提條件,那就是所有的元素都必須能夠根據所提供的比較器來進行比較,如下:
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;public class TreeMapTest { public static void main(String[] args) { Map<String, String> map = new TreeMap<String, String>(); map.put("a", "ddddd"); map.put("c", "bbbbb"); map.put("d", "aaaaa"); map.put("b", "ccccc"); //這里將map.entrySet()轉換成list List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //然後通過比較器來實現排序 Collections.sort(list,new Comparator<Map.Entry<String,String>>() { //升序排序 public int compare(Entry<String, String> o1, Entry<String, String> o2) { return o1.getValue().compareTo(o2.getValue()); } }); for(Map.Entry<String,String> mapping:list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
}}
運行結果如下:
d:aaaaac:bbbbbb:ccccca:ddddd
Ⅲ 用java實現TreeMap的排序問題。。。。急急急。。。。
TreeMap(Comparator<? super K> comparator)
構造一個新的、空的樹映射,該映射根據給定比較器進行排序。
注意這個構造方法....這個構造方法是傳進去一個比較器,當然比較器可以自己寫 他會按照比較器排序.....!!
keySet()
返回此映射包含的鍵的 Set 視圖。
這個方法 返回set 然後調用set的方法得到鍵的值 就是排完序的鍵的值了....
Ⅳ Java中的map會自動排序嗎是按什麼排序的
java中的map默認是對元素不排序的,但是map的實現類treemap能夠把它保存的記錄根據key排序,默認是按升序排序。如果我們想要改變排序方式,則需要使用比較器:comparator。
Ⅳ java treeMap 排序後 get不到value
你想按照map的value進行排序,首先你的compare介面就是個錯誤的實現,一般會實現2個if分支,就是比較的值要求是返回3種情況-1,0,1。為啥要這樣?如果你不這樣做會產生很多bug,你去看看treemap的源碼,在使用你自己實現的comparator借口進行比較的時候有
while(p!=null){
intcmp=cpr.compare(k,p.key);
if(cmp<0)
p=p.left;
elseif(cmp>0)
p=p.right;
else
returnp;
}
但是你自己實現的介面沒有else那種情況,就是cmp=0那種情況,所以永遠得不到key對應的value了。
你的問題有兩種方法解決在你的comapre方法改為
publicintcompare(Stringa,Stringb){
if(base.get(a)>base.get(b)){
return-1;
}elseif(base.get(a)<base.get(b)){
return1;
}else{
return0;
}
}
或者你取value的時候不通過get方法,而是通過
Set<Entry<String,Double>>set=sorted_map.entrySet();
for(Entry<String,Double>i:set){
System.out.println(i.getValue());
}
Ⅵ java中TreeMap中,對Student(name,age); 如何對name進行排序
Map map = new TreeMap(new Comparator<Student>(){
@Override
public int compare(Student stu1, Student stu2) {
//TODO:重寫compare方法.
}
});
Map, 和TreeMap可以使用泛型.
Ⅶ java TreeMap 中的key是怎麼排序的呢 如果說key是 Double 類型的,自動排序的結果是從小到大的么
可以的,你可以看下TreeMap API幫助文檔的介紹
例子如下
@Test
public void test() {
TreeMap<Double,String> treeMap = new TreeMap();
treeMap.put(0.1003, "zhangsan");
treeMap.put(1.1, "lisi");
treeMap.put(1.00031, "wangwu");
treeMap.put(0.1102, "xiaohong");
Set<Entry<Double, String>> entry = treeMap.entrySet();
for(Iterator<Entry<Double,String>> it = entry.iterator();it.hasNext();) {
Entry<Double, String> entry2 = it.next();
System.err.println("KEY:"+entry2.getKey()+" "+"VALUE:"+entry2.getValue());
}
}
------------------------------------
運行結果:
KEY:0.1003 VALUE:zhangsan
KEY:0.1102 VALUE:xiaohong
KEY:1.00031 VALUE:wangwu
KEY:1.1 VALUE:lisi
按照大小排序了
Ⅷ Java怎麼實現HashMap或TreeMap以key值進行排序
HashMap本身是hash散列,做不到你說的排序。
TreeMap可以,是二叉樹實現,自己實現一個Comparator。
Ⅸ 怎麼將java中一個treeMap排序後的統計值,即鍵和值輸出到文件
你可以參考下面的代碼能夠實現你的需求:
public static void main(String[] args) {
int [] number ={1,2,3,4,5,6,3,4,5,2,7,4,9,1,3,1,2,4,3,5};
TreeMap<Integer, Integer> treeMap=new TreeMap<Integer, Integer>();
for (int i = 0; i < number.length; i++) {
if(!treeMap.containsKey(number[i])){
treeMap.put(number[i], 1);
}else if(treeMap.containsKey(number[i])) {
treeMap.put(number[i], treeMap.get(number[i])+1);
}
System.out.println(number[i]+","+treeMap.get(number[i]));
}
int [][] resultNumber=new int [treeMap.size()][2];
int index=0;
for(Integer n : treeMap.keySet()){
resultNumber[index][0]=n;
resultNumber[index][1]=treeMap.get(n);
index++;
}
for (int i = 0; i < resultNumber.length; i++) {
System.out.println("Number is :" +resultNumber[i][0]+" Number count is : "+resultNumber[i][1]);
}
}
Ⅹ 請教java中的TreeMap如何順序按照插入順序排序
treemap是按照鍵的順序排序,可以通過實現comparator介面,重寫compare方法來自定義排序