Как отсортировать HashMapпо строке в андроид - PullRequest
2 голосов
/ 13 декабря 2011

У меня есть этот код:

    HashMap<String, String[]> unsorted = new HashMap<String, String[]>();
    String[] values = new String[3];
    String key;

    //add data to hashmap
    key = "abc";
    values[0] = "a"; values[1]="b"; values[2]="c";
    unsorted.put(key, values);

    key = "abc";
    values[0] = "aa"; values[1]="bb"; values[2]="cb";
    unsorted.put(key, values);

    key = "def";
    values[0] = "d"; values[1]="e"; values[2]="f";
    unsorted.put(key, values);

    //sort hashmap
    /***********/

    //output should be:
    { abc-[a,b,c], abc-[aa,bb,cc], def-[d,e,f] }

    //or

    { abc-[aa,bb,cc], abc-[a,b,c], def-[d,e,f] }

Как я могу так отсортировать?Примечание. Я пытался использовать TreeMap и другие примеры, но они исключают элементы, в которых ключи равны.

Редактировать: Я решил свою проблему :) спасибоГийому.Вот что я использовал:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class test {

public static void main(String[] args) {

    ArrayList<CustomObject> objs = new ArrayList<CustomObject>();

    objs.add(new CustomObject("abc", new String[] {"a", "b", "c"}));
    objs.add(new CustomObject("def", new String[] {"d", "e", "f"}));
    objs.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"}));


    System.out.println(objs.isEmpty());

    Collections.sort(objs, new Comparator<CustomObject>() {
        @Override
        public int compare(CustomObject o1, CustomObject o2) {
            int i = o1.getKey().compareTo(o2.getKey());
            if(i == 0)
                return -1;
            return i;
        }
    });

    for(int i=0; i<objs.size(); i++)
        System.out.println("key/value pair:" + objs.get(i).getKey() + " - " + objs.get(i).getValues()[0]);
    }
}

И CustomObject:

public class CustomObject {

private String key;
private String[] values;

public CustomObject(String key, String[] values) {
    this.key = key;
    this.values = values;
}

public String getKey() {
    return key;
}

public String[] getValues() {
    return values;
}
}

Ответы [ 4 ]

5 голосов
/ 13 декабря 2011

Если вам нужно специальное упорядочение и возможность иметь несколько объектов с одинаковым «ключом», который кричит для List, с пользовательским Comparator.

1 - Определите классэлементы для хранения в вашем списке.В вашем случае это объект, который имеет 2 поля: «ключ» и массив строк.Давайте назовем это CustomObject (вы можете называть это как хотите)

2- Вставьте все свои объекты в список

Вот так:

list.add(new CustomObject("abc", new String[] {"a", "b", "c"});
list.add(new CustomObject("abc", new String[] {"aa", "bb", "cc"});
list.add(new CustomObject("def", new String[] {"d", "e", "f"});

3-Закажите свой список, используя пользовательский компаратор.

Чтобы заказать список, сделайте

Collections.sort(list, new Comparator<CustomObject>() {
        @Override
        public int compare(CustomObject o1, CustomObject o2) {
            return o1.getArray().compare(o2.getArray());
        }
    });

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


Альтернативой этому является добавление естественного порядка к вашему CustomObject (орудиям Comparable) и вставка их в TreeSet.

.
2 голосов
/ 13 декабря 2011

HashMap не может быть отсортирован (или содержать дубликаты ключей), он является частью того, как он реализован (см. Документацию) .

Этот класс не дает никаких гарантий относительно порядка карты; в В частности, это не гарантирует, что порядок останется постоянным со временем.

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

0 голосов
/ 18 октября 2016

Вы также можете отсортировать хэш-карту, используя следующий метод

private static HashMap sortByValues(HashMap map) {
        List list = new LinkedList(map.entrySet());
        // Defined Custom Comparator here
        Collections.sort(list, new Comparator() {
            public int compare(Object o1, Object o2) {
                return ((Comparable) ((Map.Entry) (o1)).getValue())
                        .compareTo(((Map.Entry) (o2)).getValue());
            }
        });

        // Here I am copying the sorted list in HashMap
        // using LinkedHashMap to preserve the insertion order
        HashMap sortedHashMap = new LinkedHashMap();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            sortedHashMap.put(entry.getKey(), entry.getValue());
        }
        return sortedHashMap;
    }

вызов метода как // смещаем вашу хэш-карту

 shift =sortByValues(shift)
0 голосов
/ 13 декабря 2011

Вам нужно использовать Карту, которая позволяет дублировать ключи, такой карты нет в JDK.Попробуйте использовать Multimap в Google guava.http://google -collections.googlecode.com / svn / trunk / javadoc / com / google / common / collect / Multimap.html

Реализация, которая имеет естественный порядок, представляет собой TreeMultiMap: http://google -collections.googlecode.com / svn / trunk / javadoc / com / google / common / collect / TreeMultimap.html

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...