按地图值排序字符串列表

时间:2014-04-28 12:56:23

标签: java sorting comparable

我创建了一个地图,我希望按值对其进行排序,但我需要将输出作为字符串列表。我想我可以通过扩展可比较的方式对地图进行排序,然后将每个排序的键添加到列表中,但我不确定它是最好的方法。有什么想法吗?

//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;
}

3 个答案:

答案 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);

此代码使用内联比较器..如果值与我们考虑的词法顺序相同。这将打印在下面

  

之前:[pqr,abcd,xyz]

     

之后:[pqr,abcd,xyz]

答案 1 :(得分:0)

将您的地图值实施为可比较。

然后执行以下操作

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

如果您的值是String,则如果您对默认字符串排序机制感到满意,则不需要实现Comparable

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);

<强>更新

我最初认为,OP只想按值排序并返回List。根据评论,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

答案 2 :(得分: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;