我想让以下代码在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!
答案 0 :(得分:4)
你得到的代码并不是有效的J2ME,它是全脂(J2SE)java; J2ME目前没有泛型,或者Collections类或Comparable接口 - 检查J2D的组件MIDP 2和CLDC 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
与列表一起使用的方法。