2014-04-28 2 views
0

지도를 만들었으므로 그 값으로 정렬하고 싶지만 그 결과를 문자열 목록으로 제공해야합니다. 내가 비교할 수있는 확장하여지도 정렬 할 수 있다고 생각하고 모든 정렬 된 키 목록에 추가하지만 가장 좋은 방법인지 잘 모르겠습니다. 어떤 아이디어?지도의 값으로 문자열 목록 정렬

//code is not finished yet// 
public List<String> search(String prefix) { 
    Map <String, Integer> suitable_sites = new LinkedHashMap<>() ; 
    List<String> sorted_list = new ArrayList<>(); 
    for (Map.Entry<String, Site<String>> site :index.entrySet()) { 
     Map <String, Integer> words = site.getValue().getWords() ; 
     int counter =0 ; 
     for (String word : words.keySet()) { 
      if (word.startsWith(prefix)) 
       counter++; 
     } 
     int weight = counter/site.getValue().getAmmount(); 
     if (weight == 0) 
      continue; 
     suitable_sites.put(site.getKey(), weight); 
    } 
    return null; 
} 
+0

http://www.mkyong.com/java/how-to-sort- a-map-in-java/ – Jay

+0

키의 목록을 값별로 정렬해야하기 때문에 약간 다른 점이 있습니다. 필자는 도움이되는 대답을 얻었습니다. –

답변

1
final HashMap<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("abcd",5); 
    map.put("xyz",152); 
    map.put("pqr",1); 
    List list = new ArrayList<String>(map.keySet()); 

    System.out.println("before : "+ list); 
    Collections.sort(list, new Comparator<String>(){ 
     public int compare(String item1, String item2){ 
      int compare = map.get(item1) - map.get(item2); 
      if(compare == 0) 
      { 
       return (item1.compareTo(item2)); 
      } 
      return compare; 
     } 
    }); 

    System.out.println("after : "+ list); 

우리는 어휘 order.This이

아래에 인쇄됩니다 생각보다 값이 같은 경우이 코드는 ... 인라인 비교기를 사용하고 있습니다

전에 [PQR, ABCD, XYZ]

후 [PQR, ABCD, XYZ]

0

맵 값을 비교 가능으로 구현하십시오.

그리고는 수행하면 기본 문자열 정렬 메커니즘

HashMap<Integer, String> map = new HashMap<Integer, String>(); 
     map.put(1,"xyz"); 
     map.put(2,"abcd"); 
     List<String> mapValues = new ArrayList<String>(map.values()); 
     Collections.sort(mapValues); 
     System.out.println(mapValues); 

UPDATE

에 만족하는 경우 Comparable를 구현해야

// Populate the Map 
List<String> mapValues = new ArrayList<String>(map.values()); 
Collections.sort(mapValues); 

당신의 값이 문자열 인 경우는 그나마 다음 나는 처음에는 OP가 가치에 따라 정렬하고 목록으로 돌아 가기를 원했습니다. 주석에 따라 OP는 값순으로 정렬하고 키를 목록으로 반환하려고합니다.

public static void main(String args[]) { 
     // readTempFile(); 
     HashMap<String,Integer> map = new HashMap<String,Integer>(); 
     map.put("C",2); 
     map.put("A",3); 
     map.put("B",1); 
     System.out.println(sortByValues(map)); 

    } 

    public static <K, V extends Comparable<V>> List<K> sortByValues(final Map<K, V> map) { 
    Comparator<K> valueComparator = new Comparator<K>() { 
     public int compare(K k1, K k2) { 
      int compare = map.get(k1).compareTo(map.get(k2)); 
      if (compare == 0) { 
       return 1; 
      } else { 
       return compare; 
      } 
     } 
    }; 
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
    sortedByValues.putAll(map); 
    return new ArrayList<K>(sortedByValues.keySet()); 
} 

그리고 결과

[B, C, A] 

Credit Goes tooooo

+0

키 값을 기준으로 정렬하고 키 정렬 된 목록을 반환해야합니다. –

+0

내 값은 정수입니다. 내 ** 키 **는 문자열입니다. 값으로 정렬해야하는 정렬 된 키를 반환해야합니다. –

0
final HashMap<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("abcd",50); 
    map.put("xyz",15); 
    map.put("pqr",10); 
    List list = new ArrayList<String>(map.keySet()); 

    System.out.println("before : "+ list); 
    Collections.sort(list, new Comparator<String>(){ 
     public int compare(String item1, String item2){ 
      return map.get(item1).compareTo(map.get(item2)); 
     } 
    }); 

    System.out.println("after : "+ list); 
    return list;