在实习期间的一个项目中,经理叫我将查询结果(是一个对象数组,项目中是租约信息的列表)按照地理位置的远近排序,并且当结果含有自己时显示在第一个。其实这样的功能是很常见的,网上很多解决方法,大多都是要写一个实现一个comparator的接口的比较器,然后调用Collections类的排序方法。但并不能解决我这里的要求,就是让某个属性有最高级。我想了很久,逐步调试,发现解决问题的方法就在比较器的实现上,最终把问题解决了。现在总结写了一个demo,原理一样,代码如下:
<span style="font-size:18px;">package mytest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ObjectListTest {
//Map<String,Object>就相当于对象,创建3个对象
static List<Map<String,Object>> userList; //对象数组
Map<String, Object> user1,user2,user3;
String id;
public ObjectListTest(String myId){
userList = new ArrayList<Map<String,Object>> ();
user1 = new HashMap<String, Object>();
user2 = new HashMap<String, Object>();
user3 = new HashMap<String, Object>();
user1.put("id", 1001);
user1.put("name","张飞");
user1.put("age", 26);
user2.put("id", 1002);
user2.put("name","关羽");
user2.put("age", 30);
user3.put("id", 1003);
user3.put("name","刘备");
user3.put("age", 33);
userList.add(user1);
userList.add(user2);
userList.add(user3);
Comparator<Map<String,Object>> comparator = new ComparatorImpl(myId);
Collections.sort(userList, comparator); //调用系统的排序方法
}
//比较器实现类
class ComparatorImpl implements Comparator<Map<String,Object>>{
String user_id;
public ComparatorImpl(String userId){
this.user_id=userId;
}
//比较器的实现方法
public int compare(Map<String,Object> user1,Map<String,Object> user2){
if(user1!=null && user2!=null){
//显示自己的信息在第一位
if(user1.get("id").toString().equals(user_id)){
return -1;
}else if(user2.get("id").toString().equals(user_id)){
return 1;
}
//其他人按照年龄排序
if( Double.parseDouble(user1.get("age").toString()) > Double.parseDouble(user2.get("age").toString())){
return 1;
}else if(Double.parseDouble(user1.get("age").toString()) == Double.parseDouble(user2.get("age").toString())){
return 0;
}else
return -1;
}
return 1;
}
}
public static void main(String[] args) {
new ObjectListTest("1003"); //假设自己是关羽
System.out.println(userList);
}
}</span>