2

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

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

如您所见,我从SharedPreferences. 密钥按以下顺序排列:YesterdayOlderToday

Today我想要从到的以下顺序Older。所以: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
    }
};

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

是否可以按照我上面描述的规则对规则进行排序TreeMap

4

4 回答 4

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());
于 2013-09-21T09:51:22.977 回答
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 );
}
于 2013-09-21T09:41:02.957 回答
1

不。

TreeMap不依赖于compare方法(也不实现Comparable)。

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

ComparatorTreeMap构造函数中传递你的实例。

于 2013-09-21T09:25:28.300 回答
0

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

如果小于,则该compare方法应返回负数,如果大于则返回正数,如果相等则返回 0。o1o2o1o2

您可以这样编写方法:

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;
}
于 2013-09-21T09:20:24.717 回答