2016-12-26 4 views
-1

문자열 키와 int 값의 맵이 있습니다. 값을 변경할 때 정렬하고 정렬합니다. 비교기에서 사용할 수 있도록 정렬 된 쌍 및 정렬되지 않은 paris에 대한 일반지도에 트리 맵을 사용했지만 한 값이 다른 값을 전달한 후에 널 expection을 얻었습니다.요소를 변경할 때 값순으로 정렬되는 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

동의 함. 실제로 작동하는 값으로 정렬 된 맵 구현을 작성하는 방법은 없습니다. 노멀 맵을 유지 한 다음 반복 할 때마다 값으로 정렬 할 수 있지만 얻을 수있는만큼 좋은 결과를 얻을 수 있습니다. –