2014-09-05 4 views
-4

Я видел эту тему sorting a List of Map<String, String>, и я знаю, что моя может звучать дубликат, но она немного отличается.Сортировка списка карт <String, String>

Мой пример:

List<Map<String, String>> myList = new ArrayList<Map<String, String>>(); 

... 
for(MyClass1 c1 : c1) 
{ 
    ... 
    for(MyClass2 c2 : c12) 
    { 
    SimpleBindings myBindindings= new SimpleBindings(); 
    myBindindings.put(c1.getName(), c2.getName()); 

    myList.add(myBindindings); 
    } 
} 
... 

Конкретно я могу

{ 
(John, Mike) 
(John, Jack) 
(Sam, Jack) 
(Gloria, Anna) 
(Jane, Carla) 
... 
} 

и хотел бы, чтобы мой список отсортирован по ключу карты:

{ 
    (Gloria, Anna) 
    (Jane, Carla) 
    (John, Mike) 
    (John, Jack) 
    (Sam, Jack) 
    ... 
} 
+2

Как это отличается? Вы пытались написать Компаратор, как предлагаемые ответы? Что вы пробовали? – forgivenson

+1

Что вы точно сортируете? У вас есть «Список» (коллекция) «Карта» (другая коллекция). Как вы определяете, больше ли одна «Карта» больше другой? Кроме того, вы добавляете 'SimpleBindings' не' Map' - если этот класс 'extends Map' считает _not_ тем, что лучше всего избегать расширения элементов в структуре коллекций Java. –

+2

Итак, ваша 'Карта' всего одна пара ключей по каждому из них? Почему бы просто не использовать «TreeMap » для всего этого? – Mena

ответ

1

Вы уверены, что

List<Map<String, String>> 

является типом данных вывоза мебели вы хотите?

Для меня это выглядит, как будто вы на самом деле ищет упростить для

TreeMap<String, String> 

т.е. отсортированного ключом карты -> значения?

Или вы хотите использовать List<StringPair> (для этого, пожалуйста, выберите более подходящее имя, чем StringPair, и примените этот класс к вашим потребностям)? У меня сложилось впечатление, что из-за отсутствия очевидного класса Pair<String, String> в Java вы были , злоупотребляяSimpleBinding как класс пары. Правильный способ иметь пары в Java - это реализовать новый класс с правильным именем класса - «пара» является техническим, а не семантическим.

Вы также могли бы сделать

List<String[]> 

и реализовать Comparator<String[]> для сортировки. Но это не спасает вас от работы над внедрением класса NamePair и делает его сопоставимым.

+0

В случае TreeMap вы удалите дубликаты. –

+0

Это может быть желательно. Если он этого не хочет, он может использовать «TreeMultimap» из Guava, например.(Просто понял, что у него есть случай в его примере - но, возможно, не преднамеренный). –

+0

OP использует тип '' SimpleBindings' '(http://docs.oracle.com/javase/7/docs/api/javax/script/SimpleBindings.html), который 'extends Map'. Я предполагаю, что этот тип требуется по какой-то причине - возможно, как вход в другой метод. –

0

Вам необходимо осуществить Компаратор для этого ...

Collections.sort(myList, new Comparator<ObjectBeingCompared>() { 

      @Override 
      public int compare(ObjectBeingCompared obj1, ObjectBeingCompared obj2) { 

       //Of course you will want to return 1, 0, -1 based on whatever you like 
       //this is just a simple example 
       //return 1 if obj1 should be ordered first 
       //return 0 if obj1 and obj2 are the same 
       //return -1 if obj1 should be ordered after obj2 
       return obj1.compareTo(obj2); 
      } 
     }); 
-1

Структура данных HashMap используется для обеспечения доступа к ее элементам в O (1) раз.

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

В вашем примере вы сопоставляете две строки и создаете пару данных, называемую SimpleBindings.

В случае вашего простого примера вы не должны использовать структуру данных Map<String,String> для представления данных Pair.

Если вы SimpleBindings действительно состоит из двух строки, все, что вы должны сделать, это реализовать только Comparable в классе SimpleBindings так:

class SimpleBinding implements Comparable<SimpleBinding> { 

    private final String key; 
    private final String value; 

    public SimpleBinding(String key, String value) { 
     Objects.nonNull(key); 
     Objects.nonNull(value); 
     this.key = key; 
     this.value = value; 

    } 

    @Override 
    public int compareTo(SimpleBinding that) { 
     return this.key.compareTo(that.key); 
    } 
} 

И вы просто использовать Collections.sort(bindings) иметь отсортированный результат.

В случае, если вы не имеете доступ к классу, вы должны использовать интерфейс Comparator как этого

enum SimpleBindingComparator implements Comparator<SimpleBinding> { 
    DEFUALT { 
     @Override 
     public int compare(SimpleBinding fist, SimpleBinding second) { 
      return fist.key.compareTo(second.key); 
     } 
    }; 

Тогда вы сортировать привязки, как этот Collections.sort(bindings ,SimpleBindingComparator.DEFAULT);

Но если ваш случай является более сложным, чем это и в вашем магазине Карта в списке вы должны определить логику, представляющую заказ. В вашем случае может быть грустно, что заказ должен поддерживаться c1.getName()

Один из вариантов заключается в том, что вы не должны создавать список, а карту списка Map<String>,List<String>> Это так называемая многокамерная карта, где один ключ соответствует нескольким значениям. См MultiMap из гуавы, и если вы хотите, чтобы быть отсортированы, то я предлагаю, чтобы прочитать о TreeMultiMap

+0

Это создает копию ключей в« Карте »и сортирует _the copy_. Это не сортирует «Map» и не отвечает на вопрос OP о сортировке «List >». –

+0

Ответ больше относится к выходу, а не к коду OP. И действительно с этой точки зрения. В общем, вы не можете сортировать карту. Карта - это контейнер данных. То, что я сделал, создано и индексируется на карте. (Я не скопировал данные только в ссылки), и использовал его для отображения результата в требуемом порядке. –

+0

Конечно, вы можете сортировать «карту». Вам нужны две вещи: 1) «LinkedHashMap» и 2) «Компаратор». Но это не относится к делу. OP говорит, что сортировка 'List >' требуется не сортировать 'Map' _in_ 'List'. –

Смежные вопросы