2014-03-03 72 views
0

我是Java新手。 我實現Comparator接口&我有以下的compareTo功能: -什麼是可比較的類型鑄造&Map.Entry?

public int compare(Object o1, Object o2) { 
    Map.Entry e1 = (Map.Entry) o1; 
    Map.Entry e2 = (Map.Entry) o2; 
    return ((Comparable) e1.getValue()).compareTo(e2.getValue()); 
} 

我無法理解這是什麼線意味着

Map.Entry e1 = (Map.Entry) o1; 

什麼用兩個Map.Entry? ?

爲什麼Comparable在類型casting?

有人請給我一個參考,以便我能弄明白。 謝謝。

編輯: - 這裏是我的全班同學,我有一個HashMap 我想通過使用泛型類值進行排序,因此寫這個類

package via; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 

public class SortMap<K, V> { 
    public Map<K, V> getSortedMap(Map<K, V> mapToSort) { 
     List<Map.Entry> list = new ArrayList<Map.Entry>(mapToSort.entrySet()); 
     Collections.sort(list, new Comparator() { 

      @Override 
      public int compare(Object o1, Object o2) { 
       Map.Entry e1 = (Map.Entry) o1; 
       Map.Entry e2 = (Map.Entry) o2; 
       return ((Comparable) e2.getValue()).compareTo(e1.getValue()); 
      } 

     }); 
     Map sortedMap = new LinkedHashMap(); 
     for(Iterator i=list.iterator();i.hasNext();) 
     { 
      Map.Entry entry=(Map.Entry)i.next(); 
      sortedMap.put(entry.getKey(), entry.getValue()); 
     } 
     System.out.println(list); 
     return sortedMap; 
    } 

} 
+1

你可以發佈完整的課程嗎?你應該實現參數化的比較器而不是原始類型。 –

+1

看起來你正在實現* raw *'Comparator'接口 - 任何你沒有將它作爲Comparator >或其他實現的原因? –

+0

正如我前面提到的,我是新的蜜蜂,所以不知道這裏發生了什麼。 我對此只有很少的想法。 – NamingException

回答

2

我正在考慮在這裏,無論是K,V是字符串值。如果你有其他的價值,那麼首先你的課程K,V應該遵循equals()hashcode()規則。 如果您遵循以下程序,則不需要比較。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.LinkedHashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class SortMap { 
    public Map<String, String> getSortedMap(Map<String, String> mapToSort) { 
     Set<Map.Entry<String,String>> mapEntry = mapToSort.entrySet(); 

     List<Map.Entry<String,String>> listMap= new ArrayList<Map.Entry<String,String>>(); 
     listMap.addAll(mapEntry); 
     Collections.sort(listMap, new Comparator<Map.Entry<String,String>>() { 

      @Override 
      public int compare(Map.Entry<String,String> o1, Map.Entry<String,String> o2) { 
       return o1.getValue().compareTo(o2.getValue()); 
      } 

     }); 
     Map<String,String> sortedMap = new LinkedHashMap<String,String>(); 
     for(Map.Entry<String,String> mapE:listMap) 
     { 
      sortedMap.put(mapE.getKey(), mapE.getValue()); 
     } 
     System.out.println(sortedMap); 
     return sortedMap; 
    } 

} 

Map.Entry的不過進入內它實現項,這裏面地圖接口編寫接口HashMap的類編寫類。所以有規則可以使用內部類引用。

static class Entry<K,V> implements Map.Entry<K,V> { 
     final K key; 
     V value; 
     Entry<K,V> next; 
     final int hash; 

     /** 
     * Creates new entry. 
     */ 
     Entry(int h, K k, V v, Entry<K,V> n) { 
      value = v; 
      next = n; 
      key = k; 
      hash = h; 
     } 
} 
+0

我已經接近早些時候的方式。 它不給compareTo函數來比較對象的值。 – NamingException

+0

由於該引用的類型爲「Object」,並且它沒有'compareTo'方法。 – AmitG