代码记录(需求:根据店铺等级和店铺到某个点的距离进行排序,其中店铺等级由高到低,距离由近及远)

需要排序的对象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中的数据进行多条件排序的更多相关文章

  1. JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习

    JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...

  2. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...

  3. Springboot中使用自定义参数注解获取 token 中用户数据

    使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...

  4. SpringBoot整合freemarker中自定义标签获取字典表的数据

    因为在前端要根据字典表中的数据去将1.2这些值转换成对应的文字解释 1.首先要创建一个类去实现 TemplateDirectiveModel 类 @Component public class Dic ...

  5. JDK学习---深入理解Comparator、TreeSet、TreeMap为什么可以排序

    我本来打算仔细的去分析分析TreeSet和TreeMap排序规则,并且从底层实现和数据结构入手.当我去读完底层源码以后,我感觉我就的目标定的太大了,单单就是数据结构就够我自己写很久了,因此我决定先易后 ...

  6. 项目中通过Sorlj获取索引库中的数据

    在开发项目中通过使用Solr所提供的Solrj(java客户端)获取索引库中的数据,这才是真正对项目起实质性作用的功能,提升平台的检索性能及检索结果的精确性 第一步,引入相关依赖的jar包 第二步,根 ...

  7. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。

      SortedSet可自动为元素排序. SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序.   练习:自定义类用TreeSet排序. 与HashSet不同, ...

  8. geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言     ...

  9. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

随机推荐

  1. VIM--保存和退出等命令

    在 Linux 中使用 vim 时,输入 vim xxx.file 按 ESC,左下角就可以进行输入 :w 保存但不退出 :wq 保存并退出 :q 退出 :q! 强制退出,不保存 :e! 放弃所有修改 ...

  2. 学习了武沛齐讲的Day10-完

    int       整形 int     将字符串转换为数字 x.bit_length()  ===== 当前数字的二进制,至少用n位表示 str       字符串 x.capitalize()== ...

  3. <load-on-startup>1</load-on-startup>的作用

    1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法).2)它的值必须是一个整数,表示servlet应该被载入的顺序3)当值为0或者大 ...

  4. div与div之间有空隙

    当你使用HTML div块与块的中间不能紧密连接  怎么都解决不了时 使用前效果图 可以在<head></head>中间内容里加一个 * { margin:0; padding ...

  5. 一个milller_rabin模板

    #include <iostream> #include <cstdlib> #include <stdio.h> #include <algorithm&g ...

  6. hihoCoder 2 * problem

    1792 模拟,转化为二进制后逐位比较 1819 线段树维护区间加 维护每个数加了多少 每次弹出栈顶元素后栈顶位置注意清空 1792 #include <iostream> #includ ...

  7. 使用AwesomeWM作为Mate(Gnome相同) Desktop的窗口管理器

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/using_awesomewm_as_wm_of_mate_des ...

  8. cas系列-cas REST协议(三)

    cas的rest协议 cas还支持rest协议方式进行访问,格式和参数如下: 1. 获取TGT 请求方式,路径,http协议及请求参数: POST /cas/v1/tickets HTTP/1.0 u ...

  9. [PKUSC2018]最大前缀和——状压DP

    题目链接: [PKUSC2018]最大前缀和 设$f[S]$表示二进制状态为$S$的序列,任意前缀和都小于等于$0$的方案数. 设$g[S]$表示二进制状态为$S$的序列是整个序列的最大前缀和的方案数 ...

  10. l2_multi.py

    # Copyright 2012-2013 James McCauley # # Licensed under the Apache License, Version 2.0 (the "L ...