Мне нужно найти ключи topN.
У меня есть ввод в виде HashMap в виде (ключ: значение):
Banana : 13
Apple: 12
Mango : 32
Orange : 12
Grape : 18
Pear : 12
Peach : 18
Я создал связанную HapMap, отсортированную по значениям:
private static <K extends Comparable, V extends Comparable> Map<K, V> sortByValues(Map<K, V> map) {
List<Map.Entry<K, V>> entries = new LinkedList<Map.Entry<K, V>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
Map<K, V> sortedMap = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : entries) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
это дало мне вывод как:
Mango : 32
Grape : 18
Peach : 18
Banana : 13
Apple: 12
Orange : 12
Pear : 12
Теперь, если я хочу получить 4 лучших плода, как мне подойти, если я хочу, чтобы результат был:
Mango :32
Grape, Peach : 18
Banana :13
Apple, Orange, Pear: 12
Я попытался выполнить итерацию по отсортированному hashMap и сравнил значения последующих элементов, выполнив
int sizeOfMap = myValueSortedMap.size();
ArrayList<String> keyArr = new ArrayList<String>();
int cnt=0,keyVal=0;
while(cnt<(sizeOfMap-1)){
if(myValueSortedMap.values().toArray()[cnt] == myValueSortedMap.values().toArray()[cnt+1]){
keyArr.add((String) myValueSortedMap.keySet().toArray()[cnt]+ " , " +(String) myValueSortedMap.keySet().toArray()[cnt+1]);
}
else{
keyArr.add((String) myValueSortedMap.keySet().toArray()[cnt]);
keyVal = (int) myValueSortedMap.values().toArray()[cnt];
}
cnt++;
}
но это не всегда работает.
Я не могу придумать способ обойти это. Может кто-нибудь, пожалуйста, дайте мне руководство?
number
значениями из первой карты, а новые значения карты будутlist
первых ключей карты, имеющих это значение. - person tfosra   schedule 04.07.2016