2012-06-18 3 views
0

Это мой HashMap:Как отсортировать hasmap в java?

Map<String,String> unsortMap = new HashMap<String,String>() эта карта содержит такие значения, как следует

unsortMap.put("18/06/2012", "18/06/2012"); 
unsortMap.put("19/06/2012", "19/06/2012"); 
unsortMap.put("20/06/2012", "20/06/2012"); 
unsortMap.put("26/06/2012", "26/06/2012"); 
unsortMap.put("27/06/2012", "27/06/2012"); 
unsortMap.put("04/07/2012", "04/07/2012"); 
unsortMap.put("13/07/2012", "13/07/2012"); 
unsortMap.put("29/06/2012", "29/06/2012"); 

код, который я использую для сортировки эта карта выглядит следующим образом:

package samples; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 

public class SortMapExample{ 

    public static void main(String[] args) { 

    System.out.println("Unsort Map......"); 
    Map<String,String> unsortMap = new HashMap<String,String>(); 

    unsortMap.put("18/06/2012", "18/06/2012"); 
    unsortMap.put("19/06/2012", "19/06/2012"); 
    unsortMap.put("20/06/2012", "20/06/2012"); 
    unsortMap.put("26/06/2012", "26/06/2012"); 
    unsortMap.put("27/06/2012", "27/06/2012"); 
    unsortMap.put("04/07/2012", "04/07/2012"); 
    unsortMap.put("13/07/2012", "13/07/2012"); 
    unsortMap.put("29/06/2012", "29/06/2012"); 

    Iterator iterator=unsortMap.entrySet().iterator(); 

     for (Map.Entry entry : unsortMap.entrySet()) { 
      System.out.println("Key : " + entry.getKey() 
       + " Value : " + entry.getValue()); 
     } 

     System.out.println("Sorted Map......"); 
     Map<String,String> sortedMap = sortByComparator(unsortMap); 

     for (Map.Entry entry : sortedMap.entrySet()) { 
      System.out.println("Key : " + entry.getKey() 
       + " Value : " + entry.getValue()); 
     } 
    } 

    private static Map sortByComparator(Map unsortMap) { 

     List list = new LinkedList(unsortMap.entrySet()); 

     //sort list based on comparator 
     Collections.sort(list, new Comparator() { 
      public int compare(Object o1, Object o2) { 
       return ((Comparable) ((Map.Entry) (o1)).getValue()) 
       .compareTo(((Map.Entry) (o2)).getValue()); 
      } 
    }); 

     //put sorted list into map again 
    Map sortedMap = new LinkedHashMap(); 
    for (Iterator it = list.iterator(); it.hasNext();) { 
     Map.Entry entry = (Map.Entry)it.next(); 
     sortedMap.put(entry.getKey(), entry.getValue()); 
    } 
    return sortedMap; 
    }  
} 

В результате я получаю это:

Sorted Map...... 
Key : 04/07/2012 Value : 04/07/2012 
Key : 13/07/2012 Value : 13/07/2012 
Key : 18/06/2012 Value : 18/06/2012 
Key : 19/06/2012 Value : 19/06/2012 
Key : 20/06/2012 Value : 20/06/2012 
Key : 26/06/2012 Value : 26/06/2012 
Key : 27/06/2012 Value : 27/06/2012 
Key : 29/06/2012 Value : 29/06/2012 

Я хочу, чтобы результат был l икэ следующее: (карта должна быть отсортирована на основе месяца также)

18/06/2012 
19/06/2012 
20/06/2012 
26/06/2012 
27/06/2012 
29/06/2012 
04/07/2012 
13/07/2012 

Просьбы помочь мне, как об этом?

+1

Любая причина, по которой вы не работаете с java.util.Date вместо String? –

+0

Возможно, это не то, что вы хотите услышать, но я не мог устоять: если вы сортируете строки, вы должны использовать [ISO 8601] (http://en.wikipedia.org/wiki/ISO_8601), маленький конец Очень плохой. –

ответ

2

Преобразование данных в SortedMap, в частности экземпляр TreeMap.

Используйте конструктор, который принимает компаратор и внутри этого, выполните свою логику сравнения.

4

String к Date, а затем сравнить два даты экземпляра вместо String

См this example конвертировать String в Date, теперь когда у вас есть экземпляр даты, она уже implmentes компаратор вы могли бы просто использовать

return dateInstance1.compare(dateInstance2) 

в вашем компараторе

Примечание: если вы читаете эти даты как String из базы данных, тогда please see this

+0

@Tony Что нужно объяснить? Разберите дату, сравните дату. В противном случае напишите пользовательский многополевой компаратор. –

+0

добавлено больше информации –

+0

с вашим текущим подходом просто сравнить String в хронологическом порядке, что не является фактическим сравнением для даты –

4

С HashMap неуместен. Вы должны использовать TreeMap вместо HashMap. И вам также нужно разобрать String на Date для сравнения.

деталь: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html

+0

даты хранятся в базе данных, как описано выше. (String) – SAR

+0

с использованием специального компилятора TreeMap –

+0

@JigarJoshi Это также необходимо сделать. – plucury

3

Вы сортировка строк и поведение по умолчанию для строк для сортировки в порядке ASCIIbetical.

Если вы хотите, чтобы отсортировать ключи каким-либо другим способом, вам нужно преобразовать их к типу вы действительно хотите, чтобы они были (в данном случае даты)

Использование SimpleDateFormat для преобразования ключи Дата объекта и сравнить те.

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