Реализация сортировки в векторе - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть коллекция как

Vector<HashMap<String, String>>

На самом деле я использую это как элементы списка представления списка в Android. Я использовал SortedMap, но я не получил правильный результат. Я думаю, это потому, что структура HashMap

hashMap.add("Name","value_of_name"); 
hashMap.add("Counts","value_of_counts");

Теперь я добавляю его в Vector.

Я хочу отсортировать элемент вектора по Name ключу hashMap. Я знаю о Collection.sort, и я могу отсортировать это, используя ArrayList и класс POJO. Но я не знаю, как использовать его с adapter моего ListView

Как я могу сортировать элементы. И есть ли лучшее решение (Что касается моей структуры данных сбора, которую можно легко использовать с адаптером)?

Ответы [ 5 ]

2 голосов
/ 18 апреля 2011

Вам необходимо внедрить Comparator<HashMap<String,String> > и поместить логику сортировки в методе compare.

1 голос
/ 18 апреля 2011

Вы никогда не думали взглянуть на коллекции в пакете java.util?

Вы бы тогда обнаружили, что Treemap уже реализует сбалансированную сортировку деревьев для Comparable элементов, например String.

Итак, чтобы отсортировать ваши предметы, просто поменяйте ваш HashMap на TreeMap, и вся работа будет выполнена.

Кстати, что здесь делает этот вектор? Они ооочень Java 1.1 (другими словами, пятнадцать лет)

1 голос
/ 18 апреля 2011

Не уверен, что я правильно понимаю. Это позволит отсортировать вектор по одному ключу карты.

Collections.sort(yourVector, new Comparator<HashMap<String,String>>() {
    public int compare(HashMap<String,String> a, HashMap<String,String> b) {
        return a.get(yourKey).compareTo(b.get(yourKey));
    }
});
0 голосов
/ 18 апреля 2011

Если вы хотите отсортировать карты в массиве, используйте реализацию SortedMap , например TreeMap или ConcurrentSkipListMap .Это берет вектор HashMaps и возвращает ArrayList (несинхронизированная и более быстрая коллекция, чем Vector) SortedMaps.

public ArrayList<SortedMap<String, String>> sortMaps(Vector<HashMap<String, String> maps) {
    ArrayList<TreeMap<String, String>> returnMaps = new ArrayList<TreeMap<String, String>>();
    for(HashMap<String, String> theMap : maps) {
        // TreeMap is a sorted map and this will use the default String.compareTo
        TreeMap<String, String> newMap = new TreeMap<String, String>();
        // put all the items from the HashMap into the TreeMap, which will autosort
        newMap.putAll(theMap);
        returnMaps.add(newMap);
    }
    return returnMaps;
}

Для сортировки вектора по первым ключам (самые низкие ключи(сначала в алфавитном порядке) хэш-карты, попробуйте следующее перед обратной строкой:

    // this sorts the vector by first keys
    Collections.sort(returnMaps, new Comparator<SortedMap<String,String>>() {
        public int compare(SortedMap<String,String> a, HashMap<String,String> b) {
            return a.firstKey().compareTo(b.firstKey());
        }
    });

Или, если вы хотите отсортировать по последнему ключу (самые высокие ключи, последний по алфавиту):

    // this sorts the vector by first keys
    Collections.sort(returnMaps, new Comparator<SortedMap<String,String>>() {
        public int compare(SortedMap<String,String> a, HashMap<String,String> b) {
            return a.lastKey().compareTo(b.lastKey());
        }
    });

Чтобы вернуть одну отсортированную карту всех ключей (растоптать любые дубликаты):

public SortedMap<String, String> singledSortedMap(Vector<HashMap<String, String> maps) {
    // this will end up with all the values, sorted by natural string ordering
    SortedMap<String, String> returnMap = new TreeMap<String, String>();
    for(HashMap<String, String> theMap : maps) {
        returnMap.putAll(theMap);
    }
    return returnMap;
}
0 голосов
/ 18 апреля 2011

Лучший (самый быстрый) способ использовать TreeMap вместо этого. Если вы предоставите ему правильный Компаратор, все элементы в TreeMap будут отсортированы.

Важный вопрос: почему у вас есть Vector of HashMaps?

...