2016-12-26 32 views
-1

我有一个字符串键和int值的映射,我对它们进行排序,并在更改值时对它们进行排序。 我试图使用树形图的排序对和未分类的巴黎法线地图,所以我可以在比较器中使用它,但一个值后通过其他我得到一个空预期,这是defenition:当我更改元素时,如何获得按值排序的treeMap继续排序?

public static TreeMap<String, Long> countryData; 
public static ValueComparator bvc; 

public static void setCountryData(HashMap<String, Long> map){ 
    bvc = new ValueComparator(map); 
    countryData = new TreeMap<String, Long>(bvc); 
    countryData.putAll(map); 
    System.out.println(Arrays.toString(countyNames)); 
    System.out.println(countryData.values()); 


} 

public static class ValueComparator implements Comparator<String> { 
    Map<String, Long> base; 

    public ValueComparator(Map<String, Long> base) { 
     this.base = base; 
    } 


    public int compare(String a, String b) { 
     if(base.get(a).equals(base.get(b))){ 
      return 0; 
     } 
     if (base.get(a) > base.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } 
    } 
} 

这是我改变数值:

General.bvc.base.put(country, newValue); 
General.countryData.put(country, newValue); 

一个值后经过另一个和我尝试存取权限的话,我得到一个空,我怎么能这样做呢?

回答

2

我怎么能有这是由价值排序的TreeMap ..

你不能。他们按键排序。

...

无关。

+0

但我做了一个自定义的比较器来比较两个值之间的值。如果是错误的方法,那么正确的方法是什么? – Yovboy

+1

如果你的自定义比较器没有返回键的顺序,那么'TreeMap'不可能工作。这违反了合同。此外,更新任何被用作密钥的内容也违反了合同。你不能这样做。 – EJP

+0

同意。没有办法编写一个按实际工作值排序的地图实现。你可以保留一张普通的地图,然后每次迭代时按照它的值排序,但这与你所能得到的一样好。 –