2013-09-21 2 views
2

У меня есть TreeMap, и я хочу сортировать ключи на основе собственного правила. Это, как я получить ключи:Сортировка TreeMap на основе собственного правила

SharedPreferences pref = context.getSharedPreferences("myPrefs2", 
        MODE_PRIVATE); 
TreeMap<String, ?> keys = new TreeMap<String, Object>(pref.getAll()); 

Как вы можете видеть, что я получить ключи от SharedPreferences. Клавиши поставляются в следующем порядке: Yesterday, Older, Today.

Я хочу выполнить следующие действия от Today до Older. So: Today, Yesterday, Older.

Я пытался что-то вроде этого:

SharedPreferences pref = context.getSharedPreferences("myPrefs2", 
       MODE_PRIVATE); 
TreeMap<String, ?> keys = new TreeMap<String, Object>(pref.getAll()) { 
    public int compare(String o1, String o2) { 
     // Here the return based on our own rule 
    } 
}; 

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

Есть ли возможность сортировать TreeMap по правилу, как я описал выше?

ответ

3

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

Comparator<String> sortByPreferenceKey = new Comparator<String>(){ 
    public int compare(String o1, String o2) { 
     // Put your comparison logic here 
    } 
}; 
SharedPreferences pref = context.getSharedPreferences("myPrefs2", MODE_PRIVATE); 
TreeMap<String, Object> keys = new TreeMap<String, Object>(sortByPreferenceKey); 
keys.putAll(pref.getAll()); 
+0

Я получаю эту ошибку: 'Конструктор TreeMap < String, Object> (Карта , Comparator ) не определена' в строке, где вызывается 'new TreeMap'. – user2784435

+0

Приношу свои извинения.По какой-то причине я думал, что у TreeMap есть конструктор, которого нет. Я отредактировал свой ответ; пожалуйста, попробуйте снова. –

+1

Спасибо! Для сравнения я использую это: 'final List definedOrder = Arrays.asList (« Сегодня »,« Вчера »,« Старые »);' и в функции сравнения: 'return Integer.valueOf (определеноOrder.indexOf (o1)) .compareTo (Integer.valueOf (definedOrder.indexOf (о2))); ' – user2784435

0

Во-первых, обратите внимание, что TreeMap не имеет метода compare. Однако вы можете создать подкласс Comparator и передать его конструктору вашей карты.

compare Метод должен возвращать отрицательное число, если o1 меньше, чем o2, положительное число, если o1 больше o2 и 0, если они равны.

Вы можете написать метод как таковой:

public int compare (String o1, String o2) { 
    if("Yesterday".equals(o1) && "Older".equals(o2)) { 
     return 1; // o1 > o2 => positive number 
    } 
    // etcetera 
} 

Обратите внимание, что вам не нужно писать if заявление для каждой возможности: следующий пример.

if("Today".equals(o1) && !"Today".equals(o2)) { 
    // The first String equals "Today" (the greatest possible value 
    // And the second doesn't. This means the second must be smaller. 
    return 1; 
} 
1

Номер

TreeMap не полагается в методе compare (ни он не делает реализацию Comparable).

Вместо определения Comparator<String> подкласс (это может быть анонимный класс) и реализовать метод compare есть (описание RaptorDotCpp хорошо, но вы также можете прочитать JavaDoc, который объясняет это и много других вещей).

Пройдите экземпляр вашего Comparator в конструкторе TreeMap.

1

Вы можете использовать таблицу поиска в вашем компараторе.

Map<String,Integer> values = new HashMap<>(); 
values.put("Today", 1); 
// etc 

public int compare(String o1, String o2) { 
    Integer q1 = values.get(o1); 
    Integer q2 = values.get(o2); 
    return q1.compareTo(q2); 
} 
Смежные вопросы