2013-08-08 2 views
1

Я бы хотел сортировать список (список) по значению (счету) и по ключу (позиция). Asu - ArrayList of String;Сортировка списка по карте, сортировка по количеству

System.out.println(asu); 
[3100, 3100, 3100, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 100, 100, 100, 100, 100, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 400, 400, 400, 400, 202, 202, 10] 

List<String> list = ArrayList<>(); 
Map<String, Integer> counts = new HashMap<>(); 
// Fill list with values.... 

for (String item:list) { 
    Integer count = counts.get(item); 
    if (count == null) { 
     // This is the first time we have seen item, so the count should be one. 
     count = 1; 
    } else { 
     // Increment the count by one. 
     count = count + 1; 
    } 
    counts.put(item, count); 
} 

     Collections.sort(asu, new Comparator<String>() { 
        @Override 
        public int compare(String left, String right) { 

         return Integer.compare(counts.get(left), counts.get(right)); 
        } 
       }); 
System.out.println(asu); 
[10, 202, 202, 3100, 3100, 3100, 400, 400, 400, 400, 100, 100, 100, 100, 100, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 2005, 2005, 2005, 2005, 2005, 2005, 2005,] 

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

System.out.println(asu); 
    [10, 202, 202, 3100, 3100, 3100, 400, 400, 400, 400, 100, 100, 100, 100, 100, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 1029, 1029, 1029, 1029, 1029, 1029, 1029] 

И пожалуйста, не советую «TreeMap»

+0

Что ваш вопрос? – Santosh

+0

Возможный дубликат [Дальше Сортировка уже отсортированного списка] (http://stackoverflow.com/questions/15646900/further-sort-an-already-sorted-list) –

+0

duplicate? Это мой вопрос, ребята. Моя карта содержит String и Integer) – Eldar

ответ

2

Просто измените компаратор использовать счетчики сначала, а затем сам ключ:

Collections.sort(asu, new Comparator<String>() { 

    @Override 
    public int compare(String left, String right) { 
     int countCompare = counts.get(left).compareTo(counts.get(right))); 
     if(countCompare != 0) { 
      return countCompare; 
     } 
     return left.compareTo(right); 
    } 
}); 

Я предполагаю, что вы сортируете список без нулевого значения v alues ​​

1

код анс: результат после сортировки [10, 12, 11, 11, 22, 22, 7, 7, 7]

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Sorting { 

    public static void main(final String[] args) { 
    final List<String> asu = new ArrayList<String>(); 
    asu.add("22"); 
    asu.add("11"); 
    asu.add("7"); 
    asu.add("10"); 
    asu.add("7"); 
    asu.add("12"); 
    asu.add("22"); 
    asu.add("11"); 
    asu.add("7"); 

    final List<String> list = new ArrayList<String>(); 
    final Map<String, Integer> counts = new HashMap<String, Integer>(); 

    list.addAll(asu); 

    for (final String item : list) { 
     Integer count = counts.get(item); 
     if (count == null) { 
      count = 1; 
     } else { 
      count = count + 1; 
     } 
     counts.put(item, count); 
    } 

    Collections.sort(asu, new Comparator<String>() { 

     @Override 
     public int compare(final String left, final String right) { 

      int result = counts.get(left).compareTo(counts.get(right)); 

      if (result == 0) { 
       result = left.compareTo(right); 
      } 
      return result; 
     } 
     }); 
    System.out.println(asu); 
    } 
    } 

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