根据自己的规则对TreeMap进行排序

时间:2013-09-21 09:15:49

标签: java android sorting sharedpreferences treemap

我有一个TreeMap,我想根据自己的规则对键进行排序。这就是我获得密钥的方式:

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

正如您所见,我从SharedPreferences获取了密钥。密钥按以下顺序排列:YesterdayOlderToday

我想要从TodayOlder的以下订单。所以:TodayYesterdayOlder

我尝试过这样的事情:

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
    }
};

但我不知道如何定义该规则,我不确定我是否正确使用compare function

如上所述,是否可以对规则TreeMap进行排序?

4 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

没有

TreeMap不依赖于compare方法(它既没有实现Comparable)。

相反,定义一个Comparator<String>子类(它可以是一个匿名类)并在那里实现你的compare方法(RaptorDotCpp描述很好,但你也可以阅读JAVADOC来解释这个和很多其他事情)。

Comparator构造函数中传递TreeMap的实例。

答案 2 :(得分: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 );
}

答案 3 :(得分:0)

首先,请注意TreeMap没有compare方法。但是,您可以创建Comparator的子类并将其传递给地图的构造函数。

如果compare小于o1o2方法应返回负数,如果o1大于o2,则返回正数,如果public int compare (String o1, String o2) { if("Yesterday".equals(o1) && "Older".equals(o2)) { return 1; // o1 > o2 => positive number } // etcetera } 大于if,则返回0他们是平等的。

您可以这样编写方法:

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}}语句:请参阅以下示例。

{{1}}