排序双Double HashMap Java /处理

时间:2013-12-27 22:02:04

标签: java data-structures hashmap processing

我有这个浮动的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());
}

我认为我需要先对它进行排序。问题是,如何对它进行排序,并且排序后键仍然保持不变?当我说“相同”时,我的意思是排序值仍然具有原始密钥标识符?这对我想要完成的事情至关重要。

2 个答案:

答案 0 :(得分:2)

如果可能,请将HashMap替换为NavigableMap的实施,例如TreeMapHashMap的迭代顺序未定义。

使用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进行了测试:

https://gist.github.com/akhikhl/8258430