根据哈希表的入口值(不是密钥)对哈希表进行排序

时间:2010-01-24 16:16:30

标签: sorting java-me hashtable

我想让以下代码在Java ME / J2ME环境中工作。请帮忙:

Hashtable <Activity, Float>scores = new Hashtable<Activity, Float>();
    scores.put(act1, 0.3);
    scores.put(act2, 0.5);
    scores.put(act3, 0.4);
    scores.put(act5, 0.3);


    Vector v = new Vector(scores.entrySet());
    Collections.sort(v);  //error is related to this line
    Iterator it = v.iterator();

    int cnt = 0;
    Activity key;
    Float value;

    while(it.hasNext()){

        cnt++;
        Map.Entry e=(Map.Entry)it.next();

        key = (Activity)e.getKey();
        value = (Float)e.getValue();

        System.out.println(key+", "+value);
    } 

它不起作用,我收到错误:

  

线程“main”中的异常java.lang.ClassCastException:java.util.Hashtable $ Entry无法强制转换为java.lang.Comparable   这指向我在代码中用注释表示的那一行。

请帮助,并记住我正在使用j2me!

2 个答案:

答案 0 :(得分:4)

你得到的代码并不是有效的J2ME,它是全脂(J2SE)java; J2ME目前没有泛型,或者Collections类或Comparable接口 - 检查J2D的组件MIDP 2CLDC 1.1的JavaDoc。你的错误提到了那些,所以绝对没有来自J2ME,这表明你可能在项目设置中做了一些根本性的错误?

如果你想在J2ME中这样做,你需要自己编写一个排序函数,因为据我所知,不存在这样的事情。 Bubblesort最容易编写,因为您可以轻松访问哈希表的顺序成员的唯一方法是通过Enumerations(通过scores.keys()和scores.values())。假设您希望根据与之关联的分数(浮点数)按升序对活动进行排序,您需要以下内容:

boolean fixedPoint = false;
while (!fixedPoint)
{
  fixedPoint = true;

  Enumeration e = scores.keys();    
  if (!e.hasMoreElements()) return;
  Object previousKey = e.nextElement();

  while (e.hasMoreElements()) {
    Object currentKey = e.nextElement();
    if ((Float) scores.get(currentKey) > (Float) scores.get(previousKey)) {
      swap(currentKey, previousKey);
      fixedPoint = false;
    }
    previousKey = currentKey;
  }
}

此外,在某个地方你需要编写一个交换函数,当给出它们的键时,它会交换哈希表的两个元素。值得注意的是,这并不是最快的实施方式 - 如果您希望拥有大型的大型列表,那么冒泡排序就不会很好。另一方面,使用J2ME为您提供的有限工具非常容易!

答案 1 :(得分:0)

entrySet方法不返回哈希表中的值,它返回键值对。如果您想要这些值,则应使用values方法。

如果您想要键值对,但只对值进行排序,则必须为比较两对值的键值对实现Comparator,并使用{的重载{1}}将sort与列表一起使用的方法。