我有一个TreeMap
,我想根据自己的规则对键进行排序。这就是我获得密钥的方式:
SharedPreferences pref = context.getSharedPreferences("myPrefs2",
MODE_PRIVATE);
TreeMap<String, ?> keys = new TreeMap<String, Object>(pref.getAll());
正如您所见,我从SharedPreferences
获取了密钥。密钥按以下顺序排列:Yesterday
,Older
,Today
。
我想要从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
进行排序?
答案 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
小于o1
,o2
方法应返回负数,如果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}}