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