使用自定义Comparator对TreeSet中的数据进行多条件排序
代码记录(需求:根据店铺等级和店铺到某个点的距离进行排序,其中店铺等级由高到低,距离由近及远)
需要排序的对象Store,Store.java
package com.zhipengs.work.test; import java.io.Serializable; /**
* 实体类或DTO
*
* @author zhipengs
*/
public class Store implements Serializable { private static final long serialVersionUID = -1947476757586351017L; private double distance;// 店铺到某个经纬度(点)的距离--距离某个固定的点越近,排序优先级越高
private int sgrade;// 店铺等级--等级越高,排序优先级越高 public Store(double distance, int sgrade) {
super();
this.distance = distance;
this.sgrade = sgrade;
} public double getDistance() {
return distance;
} public void setDistance(double distance) {
this.distance = distance;
} public int getSgrade() {
return sgrade;
} public void setSgrade(int sgrade) {
this.sgrade = sgrade;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(distance);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + sgrade;
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Store other = (Store) obj;
if (Double.doubleToLongBits(distance) != Double
.doubleToLongBits(other.distance))
return false;
if (sgrade != other.sgrade)
return false;
return true;
} @Override
public String toString() {
return "Store [distance=" + distance + ", sgrade=" + sgrade + "]";
} }
自定义Comparator,StoreComparator.java
package com.zhipengs.work.test; import java.util.Comparator; /**
* 自定义StoreComparator,实现Comparator接口,重写compare方法
*
* @author zhipengs
*/
public class StoreComparator implements Comparator<Store> { @Override
public int compare(Store o1, Store o2) {
int ret = 0;
// 店铺等级由高到低
int sg = o2.getSgrade() - o1.getSgrade();
if (sg != 0) {
ret = sg > 0 ? 1 : -1;
} else {
// 店铺距离由近及远
sg = (o1.getDistance() - o2.getDistance()) > 0 ? 1 : -1;
if (sg != 0) {
ret = sg > 0 ? 1 : -1;
}
}
return ret;
} }
测试类Main.java
package com.zhipengs.work.test; import java.util.Set;
import java.util.TreeSet; /**
* 测试多条件排序TreeSet--Comparator
*
* @author zhipengs
*/
public class Main { public static void main(String[] args) {
// 先用TreeSet按自定义排序规则排序并控制size大小,再转为有序List遍历进行其它操作或处理
Set<Store> storeSet = new TreeSet<Store>(new StoreComparator());
storeSet.add(new Store(1, 0));
storeSet.add(new Store(2, 1));
storeSet.add(new Store(5, 1));
storeSet.add(new Store(9, 2));
storeSet.add(new Store(3, 0));
storeSet.add(new Store(6, 0));
storeSet.add(new Store(4, 1));
storeSet.add(new Store(7, 2));
storeSet.add(new Store(0, 0));
storeSet.add(new Store(8, 1));
int sgrade = -1;
// 打印排序后的结果
for (Store s : storeSet) {
if (sgrade != s.getSgrade() && -1 != sgrade) {
System.out.println("------------------------------");
}
System.out.println(s);
sgrade = s.getSgrade();
}
}
}
测试结果:
Store [distance=7.0, sgrade=2]
Store [distance=9.0, sgrade=2]
------------------------------
Store [distance=2.0, sgrade=1]
Store [distance=4.0, sgrade=1]
Store [distance=5.0, sgrade=1]
Store [distance=8.0, sgrade=1]
------------------------------
Store [distance=0.0, sgrade=0]
Store [distance=1.0, sgrade=0]
Store [distance=3.0, sgrade=0]
Store [distance=6.0, sgrade=0]
使用自定义Comparator对TreeSet中的数据进行多条件排序的更多相关文章
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...
- android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题
android 在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...
- Springboot中使用自定义参数注解获取 token 中用户数据
使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...
- SpringBoot整合freemarker中自定义标签获取字典表的数据
因为在前端要根据字典表中的数据去将1.2这些值转换成对应的文字解释 1.首先要创建一个类去实现 TemplateDirectiveModel 类 @Component public class Dic ...
- JDK学习---深入理解Comparator、TreeSet、TreeMap为什么可以排序
我本来打算仔细的去分析分析TreeSet和TreeMap排序规则,并且从底层实现和数据结构入手.当我去读完底层源码以后,我感觉我就的目标定的太大了,单单就是数据结构就够我自己写很久了,因此我决定先易后 ...
- 项目中通过Sorlj获取索引库中的数据
在开发项目中通过使用Solr所提供的Solrj(java客户端)获取索引库中的数据,这才是真正对项目起实质性作用的功能,提升平台的检索性能及检索结果的精确性 第一步,引入相关依赖的jar包 第二步,根 ...
- SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。
SortedSet可自动为元素排序. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序. 练习:自定义类用TreeSet排序. 与HashSet不同, ...
- geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言 ...
- EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载
之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...
随机推荐
- neo4j查询语句
一:查询 比较操作: = <> < > <= >= 布尔操作: AND OR NOT XOR 1.把节点的前两个字为"提示"的节点去除" ...
- svn diff 只显示文件名
svn diff --summarize
- am335x system upgrade kernel emmc(十八)
1 Scope of Document This document describes EMMC hardware design 2 Requiremen 2.1 Func ...
- Spring Cloud Gateway(八):其它路由谓词工厂
本文基于 spring cloud gateway 2.0.1 6.基于Cookie的谓词工厂 CookieRoutePredicateFactory 是 Cookie 类型的路由断言工厂,接收两个参 ...
- 微信小程序入门与实战 常用组件API开发技巧项目实战*全
第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...
- Java基础系列 - 接口(功能,用途和优势)
package com.test1; /** * 接口的使用 */ public class test1 { public static void main(String[] args) { //创建 ...
- js 返回两数(包含这两数)之间的随机数函数
function selectFrom( lowerValue, upperValue ){ var choices = upperValue - lowerValue + 1; return Mat ...
- pl/sql test Window 参数为date
好久没写笔记了,感觉颓废了,原因是工作忙,休息时间人也变懒了,好了不说了:今天需要记录一下plsql打开测试窗口测试存储过程时,入参为date格式时报的异常 本以为和sql一样处理就可以,但是报异常, ...
- XMind 快捷键完整命令
XMind 快捷键完整命令 快捷键(Windows) 快捷键(Mac) 描述 + + 展开当前分支 - - 收缩当前分支 * * 展开所有分支 / / 收缩所有分支 Alt+- Alt+- 显示系 ...
- Tosca Connection Validation error:40 - Could not open a connection to SQL Server (不知道怎么解决)
谁知道下面这个错怎么解决,请给我留言,谢谢. 数据库能正常链接,服务也是 normal running