как поменять ключ в карте? - PullRequest
1 голос
/ 06 января 2011

есть ли способ отсортировать эти числа, хранящиеся в строковой переменной?

TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>();

это карта с ключом:

27525-1813, 
27525-3989, 
27525-4083, 
27525-4670,
27525-4911, 
27526-558,  
27526-1303, 
27526-3641, 
27526-4102, 
27527-683,
27527-2411, 
27527-4342

это список ключей, и значение для каждого ключа является списком.
Теперь, как мне отсортировать этот ключ в порядке возрастания по номеру.

отл.если я хочу отсортировать: 1,2,11,20,31,3,10
я хочу получить в качестве вывода: 1,2,3,10,11,20,31
но когда я используюавтосортировка дерева карт выводит: 1,10,11,2,20,3,31

как я могу отсортировать его в порядке возрастания по числовому значению?

и язык java :) спасибо:)

Ответы [ 3 ]

2 голосов
/ 06 января 2011

Ключи на вашей карте - это не Integer, а String значения.Вот почему ключи сортируются так, как указано.

Либо измените карту на

TreeMap<Long,List<QBFElement>> qbfElementMap

, либо создайте ее со специализированным Comparator, который обеспечит ожидаемый числовой порядок для Stringключи типа.


Отображение значений String в Longs может быть выполнено следующим образом:

private Long convertToLongTypeKey(String key) {
  String[] parts = key.split("-");
  // next lines assumes, that the second part is in range 0...9999
  return Long.parseLong(parts[0]) * 10000 + Long.parseLong(parts[1]);
}

Реализация Comparator<String> может использовать то же отображение для создания числового значения.сравнение двух строковых ключей:

new TreeMap<String,List<QBFElement>>(new Comparator<String>(){
  @Override
  public int compare(String key1, String key2) {
    String[] parts1 = key1.split("-");
    Long long1 = Long.parseLong(parts1[0]) * 10000 + Long.parseLong(parts1[1]);
    String[] parts2 = key2.split("-");
    Long long2 = Long.parseLong(parts2[0]) * 10000 + Long.parseLong(parts2[1]);
    return long1.compareTo(long2);
  }
});
1 голос
/ 06 января 2011

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

Хотя лучше бы не использовать String s как ключи,Данные, которые вы используете в качестве ключей, явно не текстовые, а числовые, и вы можете определить собственный тип для их представления.Например:

public class KeyType implements Comparable<KeyType> {
    private final int first;
    private final int second;

    public KeyType(int first, int second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof KeyType)) return false;
        KeyType realOther = (KeyType) other;
        return realOther.first == first && realOther.second == second;
    }

    @Override
    public int hashCode() {
        return first + 31 * second;
    }

    public int compareTo(KeyType other) {
        if (first != other.first)
            return first - other.first;
        return second - other.second;
    }
}

Этот подход является наиболее выразительным и надежным.Это дает вам лучший доступ к отдельным полям используемых вами ключей, а также предотвращает добавление бессмысленных ключей на карту, например, строки «Lalalalala».Я настоятельно рекомендую использовать этот подход или хотя бы один такой.Система типов - ваш друг.

0 голосов
/ 06 января 2011

A TreeMap может взять пользовательский компаратор для пользовательской сортировки. Напишите компаратор, который сортирует ключи так, как вы хотите, и используйте его при создании древовидной карты

TreeMap<String,List<QBFElement>> qbfElementMap = new TreeMap<String, List<QBFElement>>(myComparator);
...