使用LinkedHashMap和Comparator排序器对Map的排序抛砖引玉

liuzyl liuzyl 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我现在有一个需求,我需要一个map存放 一组person类的信息,包括name,level和age,并且我需要排序,排序之后我可能还要根据name来修改任意person的值,我想过用arrayList,但是arrayList取任意值不方便,需要循环取值,map也不行,map不能排序,
maptree我试过,好像只能按照key值排序,我的key值是用来存放name的,我需要的排序方式是level和age

在网上找了几个小时资料后,我整理出一个方法,使用Map赋值,然后map转成arraylist,arraylist通过Comparator排序,然后再循环给到LinkedHashMap.

网上还有一种方法是用treemap, 先把key和value值反过来,用Preson类做key值,使用key值排序之后再反转treemap

求哪个方法靠谱些,或者高手们给我个好解决方法。

这是Person


public class Person {
/**等级*/
private int level;
/**姓名*/
private String name;
/**年龄*/
private int age;

public Person(int type,String name,int age) {
this.name = name;
this.level = type;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}

}




这是转换



public static LinkedHashMap<String, Person> getOrder(Map<String, Person> map){
List<Map.Entry<String, Person>> infoIds =new ArrayList<Map.Entry<String, Person>>(map.entrySet());

//排序
Collections.sort(infoIds, new Comparator<Map.Entry<String, Person>>() {
public int compare(Map.Entry<String, Person> o1, Map.Entry<String, Person> o2) {
Person p1 = (Person) o1.getValue();
Person p2 = (Person) o2.getValue();;

if (p1.getLevel() == p2.getLevel()){
return p1.getAge() -p2.getAge();
}else{
return p1.getLevel() - p2.getLevel();
}
}
});

/*转换成新map输出*/
LinkedHashMap<String, Person> newMap = new LinkedHashMap <String, Person>();

for(Map.Entry<String,Person> entity : infoIds){
newMap.put(entity.getKey(), entity.getValue());
}

return newMap;
}




测试:


public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Person> map = new HashMap<String, Person>();
map.put("Json", new Person(1,"Json", 20));
map.put("Peter", new Person( 2,"Peter",22));
map.put("Divid", new Person(1,"Divid", 25));
map.put("Aglia", new Person(3,"Aglia", 27));
map.put("Alex", new Person(3,"Alex", 23));
map.put("Molic", new Person(3,"Molic", 22));


LinkedHashMap<String, Person> newMap = getOrder(map);

Iterator<Entry<String, Person>> iter = newMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Person> entry = (Map.Entry<String, Person>) iter.next();

System.out.println( entry.getValue().getName() + "|" + entry.getValue().getLevel() + "|"
+ entry.getValue().getAge()+ "|");
}
}




测试的结果是:
Json|1|20|
Divid|1|25|
Peter|2|22|
Molic|3|22|
Alex|3|23|
Aglia|3|27|
...全文

相关推荐

评论 16
收藏 已收藏
分享
返回顶部
liuzyl
Java SE 62,620 成员 307,251 内容