一个简单的按距离排序的例子,算法是 计算两点之间的距离,并将这个距离按照从小到大(即从近到远)排序。运用Collections的sort方法实现按距离排序。
创建一个简单的实体类:
/**
* 主键Id
*/
private String id;
/**
* 专题编号
*/
private String specialId;
/**
* 专题名称
*/
private String specialName;
/**
* X坐标
*/
private String XCoordinate;
/**
* Y坐标
*/
private String YCoordinate;
/**
* 更新时间
*/
private Date updateTime;
/**
* 两点之间距离
*/
private Double distance;
其余代码省略,只显示属性
将数据查询出来并封装在list集合之中,然后调用Collections的sort方法进行排序:
specialList = dao.findSpecialList(param);
if(specialList != null && specialList.size() > 0){
//遍历集合,并根据已知的坐标求出距离
for (int i = 0; i < specialList.size(); i++) {
specialInfo info = new specialInfo();
info.setId(specialList.get(i).getId());
info.setLabelId(specialList.get(i).getLabelId());
info.setSpecialName(specialList.get(i).getSpecialName());
info.setSpeciaType(specialList.get(i).getSpeciaType());
info.setSpecialContent(specialList.get(i).getSpecialContent());
info.setSmallImg(specialList.get(i).getSmallImg());
info.setXCoordinate(specialList.get(i).getXCoordinate());
info.setYCoordinate(specialList.get(i).getYCoordinate());
info.setUpdateTime(specialList.get(i).getUpdateTime());
//计算两点间的距离并赋给实体中的distance属性,并使用该字段排序
info.setDistance(getDistance(XCoordinate,YCoordinate,Double.parseDouble(specialList.get(i).getXCoordinate()),Double.parseDouble(specialList.get(i).getYCoordinate())));
sortList.add(info);
}
//使用Distance最为排序字段对集合中的数据进行按距离排序
Collections.sort(sortList,new Comparator<specialInfo>(){
public int compare(specialInfo info1, specialInfo info2) {
return info1.getDistance().compareTo(info2.getDistance());
}
});
}
/**
* 求两点之间的距离
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
public static double getDistance(double x1,double y1,double x2,double y2){
double d = (x2-x1)*(x2-x1) - (y2-y1)*(y2-y1);
//绝对值
double number = Math.abs(d);
return Math.sqrt(number);
}
运行结果:
可以看出json中的数据已经按照距离由小到大完成排序。
总结:Collections.sort 默认按照从小到大的顺序排序。如果需要按照从大到小的顺序,只需将return info1.getDistance().compareTo(info2.getDistance() 修改为
return info2.getDistance().compareTo(info1.getDistance())即可。