Сортировка хеш-таблицы по значению записи (не ключу) - PullRequest
2 голосов
/ 24 января 2010

Я хочу, чтобы следующий код работал в среде 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 $ Запись не может быть приведена к java.lang.Comparable Это указывает на строку, которую я указал комментарием в коде.

Пожалуйста, помогите, и имейте в виду, что я использую j2me!

Ответы [ 2 ]

4 голосов
/ 24 января 2010

Код, который вы получили, совсем не похож на действительный J2ME, это полный жирный (J2SE) Java; В настоящее время J2ME не имеет обобщений, классов Collections или Comparable - проверьте наличие JavaDoc для MIDP 2 и CLDC 1.1 , компонентов J2ME. Ваша ошибка упоминает о них, поэтому определенно не пришла от 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!

0 голосов
/ 24 января 2010

Метод entrySet не возвращает значения в хеш-таблице, он возвращает пары ключ-значение. Если вы хотите значения, вы должны использовать метод values.

Если вам нужны пары ключ-значение, но вы сортируете их только по значению, вы должны реализовать Comparator для пар ключ-значение, который сравнивает значения двух пар, и использовать перегрузку sort метод, который принимает Comparator вместе со списком.

...