我有这个浮动的Hashmap,我想从中得到前五大值:
import java.util.Map;
HashMap<Float,Float> hm = new HashMap<Float,Float>();
// Putting key-value pairs in the HashMap
for (int i = 0; i < 100; i++) {
float pos = random(-50, 50);
float time = random(0, 50);
hm.put(time, pos);
}
// Using an enhanced loop to interate over each entry
for (Map.Entry me : hm.entrySet()) {
print("key is " + me.getKey());
println(" value is " + me.getValue());
}
我认为我需要先对它进行排序。问题是,如何对它进行排序,并且排序后键仍然保持不变?当我说“相同”时,我的意思是排序值仍然具有原始密钥标识符?这对我想要完成的事情至关重要。
答案 0 :(得分:2)
如果可能,请将HashMap
替换为NavigableMap的实施,例如TreeMap
。 HashMap
的迭代顺序未定义。
使用NavigableMap
,您可以通过;
for (Map.Entry me : tm.descendingMap().entrySet() ()) {
System.out.print("key is " + me.getKey());
System.out.println(" value is " + me.getValue());
}
值得注意的是descendingMap()
实际上并没有对地图的内容进行排序(因为TreeMap
已经排序了),但只返回反向视图原始地图。
答案 1 :(得分:2)
此代码可以完成您的工作。我在Processing IDE中开发并测试了它。
import java.util.Comparator;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.List;
class FloatEntryComparator implements Comparator<Map.Entry> {
public int compare(Map.Entry e1, Map.Entry e2) {
return ((Float)e2.getValue()).intValue() - ((Float)e1.getValue()).intValue();
}
}
void setup() {
Map<Float,Float> hm = new HashMap<Float,Float>();
// Putting key-value pairs in the HashMap
for (int i = 0; i < 100; i++) {
float pos = random(-50, 50);
float time = random(0, 50);
hm.put(time, pos);
}
println("ALL ENTRIES, UNSORTED:");
for (Map.Entry me : hm.entrySet()) {
print("key is " + me.getKey());
println(" value is " + me.getValue());
}
List<Map.Entry> entries = new ArrayList<Map.Entry>(hm.entrySet());
java.util.Collections.sort(entries, new FloatEntryComparator());
hm = new LinkedHashMap<Float, Float>();
for(Map.Entry e : entries)
hm.put((Float)e.getKey(), (Float)e.getValue());
println("5 LARGEST ENTRIES:");
int shownCount = 0;
for (Map.Entry me : hm.entrySet()) {
if(shownCount == 5)
break;
print("key is " + me.getKey());
println(" value is " + me.getValue());
++shownCount;
}
}
<强>解释强>
class FloatEntryComparator implements Comparator<Map.Entry> { ... }
〜这里我们声明所谓的比较器,一个用于按特定顺序排序列表的类。
void setup() { ... }
〜如果我理解正确,这是Processing脚本的入口点之一。由于我们没有绘制任何东西,我们没有实现绘制功能(还),只设置。
Map<Float,Float> hm = new HashMap<Float,Float>();
for(...) ...
〜这是初始化部分,与代码中的相同。
List<Map.Entry> entries = new ArrayList<Map.Entry>(hm.entrySet());
〜这里将hashmap转换为条目列表
java.util.Collections.sort(entries, new FloatEntryComparator());
〜这里的条目列表按降序排列
hm = new LinkedHashMap<Float, Float>();
for(Map.Entry e : entries)
hm.put((Float)e.getKey(), (Float)e.getValue());
〜这里的条目列表被转换为hashmap。生成的hashmap按降序排序。
这是完整的Processing脚本,针对Processing 2.1进行了测试: