【问题标题】:Sorting a hashtable based on its entry value (not the key)根据其条目值(而不是键)对哈希表进行排序
【发布时间】:2011-01-08 19:43:05
【问题描述】:

我想让以下代码在 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!

【问题讨论】:

    标签: sorting java-me hashtable


    【解决方案1】:

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

    如果您确实想在 J2ME 中执行此操作,您需要自己编写一个排序函数,因为据我所知不存在这样的东西。冒泡排序是最容易编写的,因为您可以轻松访问哈希表的顺序成员的唯一方法是通过枚举(通过 score.keys() 和 score.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 提供的有限工具非常容易!

    【讨论】:

      【解决方案2】:

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

      如果您想要键值对但仅按值对它们进行排序,则必须为比较两对值的键值对实现Comparator,并使用sort 的重载采用Comparator 和列表的方法。

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 2018-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 2023-04-01
        • 2015-04-08
        相关资源
        最近更新 更多