Java Spring TreeMap 的比较器
Java Spring Comparator for TreeMap
我试图在我的 spring 项目之一中使用带有自定义比较器的 SortedMap
。这是一个 SortedMap,我试图按字符串的后半部分(这是关键)进行排序。密钥示例 "A:123"。
我添加了一个自定义比较器以确保 SortedMap 是按整数顺序而不是字符串顺序进行的。
这是一个简化的示例代码,
我有 class 里面有 SortedMap:
class TestObject{
private SortedMap<String, String> myMap = new TreeMap<String, String>({
new Comparator<String>()
{
@Override
public int compare(String s1, String s2)
{
int m1 = Integer.parseInt(O1.split(":")[1]);
int m2 = Integer.parseInt(O2.split(":")[1]);
return m1- m2;
}
});
void setMap(SortedMap<String, String> maps){
myMap = maps;
}
void getMap(){ return myMaps; }
}
在我的主要功能中我做了:
class UpperClass{
@Autowired
TestObject object1;
public setNewMap(){
SortedMap<String, String> myInput = new TreeMap<String, String>({
//my comparator
});
myInput.put("A:10000", "XXX");
myInput.put("A:500","XXX");
myInput.put("A:200","XXX");
object1.setMap(myInput);
}
pubic getResult(){
SortedMap<String, String> result = object1.getMap();
}
}
所以我远程调试我的应用程序。 class 定义中的比较器似乎从未被调用过。我一行一行打印,myInput通过输出维护了字符串的顺序:
A:200
A:500
A:10000
然而,当我的应用程序调用 get Result 时,它打印出:
A:10000
A:200
A:500
这是字符顺序。所以我想知道我是否通过在 class 定义中放置一个比较器做错了什么。
您的语法不正确。使用 lambda 的方法:
new TreeMap<String, String>((a, b) -> a.length() - b.length());
使用 Comparator 的实用方法:
new TreeMap<String, String>(Comparator::comparingInt(String::length));
旧样式:
new TreeMap<String, String>(new Comparator<String>() {
public int compare(String a, String b) {
return a.length - b.length;
});
第二个(使用 Comparator 的实用程序)绝对是三个中最好的。注意你可以链接(表示:首先对这个东西排序,如果它们相同,然后对这个东西排序,但反过来:你可以这样做)。
我试图在我的 spring 项目之一中使用带有自定义比较器的 SortedMap
。这是一个 SortedMap,我试图按字符串的后半部分(这是关键)进行排序。密钥示例 "A:123"。
我添加了一个自定义比较器以确保 SortedMap 是按整数顺序而不是字符串顺序进行的。
这是一个简化的示例代码, 我有 class 里面有 SortedMap:
class TestObject{
private SortedMap<String, String> myMap = new TreeMap<String, String>({
new Comparator<String>()
{
@Override
public int compare(String s1, String s2)
{
int m1 = Integer.parseInt(O1.split(":")[1]);
int m2 = Integer.parseInt(O2.split(":")[1]);
return m1- m2;
}
});
void setMap(SortedMap<String, String> maps){
myMap = maps;
}
void getMap(){ return myMaps; }
}
在我的主要功能中我做了:
class UpperClass{
@Autowired
TestObject object1;
public setNewMap(){
SortedMap<String, String> myInput = new TreeMap<String, String>({
//my comparator
});
myInput.put("A:10000", "XXX");
myInput.put("A:500","XXX");
myInput.put("A:200","XXX");
object1.setMap(myInput);
}
pubic getResult(){
SortedMap<String, String> result = object1.getMap();
}
}
所以我远程调试我的应用程序。 class 定义中的比较器似乎从未被调用过。我一行一行打印,myInput通过输出维护了字符串的顺序:
A:200
A:500
A:10000
然而,当我的应用程序调用 get Result 时,它打印出:
A:10000
A:200
A:500
这是字符顺序。所以我想知道我是否通过在 class 定义中放置一个比较器做错了什么。
您的语法不正确。使用 lambda 的方法:
new TreeMap<String, String>((a, b) -> a.length() - b.length());
使用 Comparator 的实用方法:
new TreeMap<String, String>(Comparator::comparingInt(String::length));
旧样式:
new TreeMap<String, String>(new Comparator<String>() {
public int compare(String a, String b) {
return a.length - b.length;
});
第二个(使用 Comparator 的实用程序)绝对是三个中最好的。注意你可以链接(表示:首先对这个东西排序,如果它们相同,然后对这个东西排序,但反过来:你可以这样做)。