Map排序:
Map<String, BigInteger> resMap = getMap();
//排序:
TreeMap<String, BigInteger> sortedMap = new TreeMap<>(resMap);//有序集合
LinkedHashMap是按照插入顺序排序,而TreeMap是按照Key的自然顺序或者Comprator的顺序进行排序。
分组后排序:
List排序(Comparator):
@Test
void getCache(){
String keyOfRedis = "LifeCycleAutoCall_1";
Object obj = redisUtil.get(keyOfRedis);
if(obj == null ){
return;
}
List<Long> longs = (List<Long>)obj;
System.err.println("longs="+longs.toString());
//查询key是否已存在,存在间隔小于最小时间间隔的发送记录跳过本次发送
//不存在记录key,有效期1天
if(!CollectionUtils.isEmpty(longs)) {
Collections.sort(longs, new Comparator<Long>() {
@Override
public int compare(Long o1, Long o2) {
//升序
if (o1 < o2) {
return -1;
} else {
return 1;
}
/*//降序
if (o1 < o2) {
return 1;
} else {
return -1;
}*/
}
});
System.out.println("longs1=" + longs.toString());
longs.sort(new Comparator<Long>() {
@Override
public int compare(Long o1, Long o2) {
/*return o1.compareTo(o2);//升序*/
return o2.compareTo(o1);//降序
}
});
System.out.println("longs2=" + longs.toString());
Long MaxDate = longs.get(0);
System.out.println("MaxDate=" + MaxDate.toString());
}
}
activityIdList.sort((a, b) -> a.compareTo(b));//升序【简写】
//List集合按照(日期-对象的属性)进行排序 Collections.sort(list, new Comparator<HighPerformanceCouponResultDTO>() { @Override public int compare(HighPerformanceCouponResultDTO o1, HighPerformanceCouponResultDTO o2) { //比较规则:compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 if (isBefore(o1.getDate(), o2.getDate(), "yyyy-MM-dd")) { return -1; } return 1; } });
去重(并保持原先顺序):
//Set去重并保持原先顺序的两种方法
public static void delRepeat(List<String> list) {
//方法一
List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
//方法二
List<String> listNew2 = new ArrayList<String>(new LinkedHashSet<String>(list));
}
new的都是深拷贝,引用和引用强转赋值的都是浅拷贝 :
@Test void run () { List<String> list = new ArrayList(); list.add("毛茸茸"); //List<Object> deepList = new ArrayList<>(list);//深拷贝 List<Object> deepList = new ArrayList<>(); deepList.addAll(list);//深拷贝 List<Object> shallowList = (List<Object>)(List)list;//浅拷贝 /*System.out.println(list == deepList); System.out.println(list == shallowList);*/ System.out.println("deepList="+deepList); System.out.println("shallowList="+shallowList); list.set(0,"冷冰冰"); System.out.println("deepList="+deepList); System.out.println("shallowList="+shallowList); }
map的forEach()方法:
Comparable和Comparator区别:
一、相同点:
两者都是用作对象之间的比较和排序,都可以自定义比较规则。
两者都是返回一个描述对象之间关系的int。
二、区别:
- Comparable是java.lang包下的,Comparator是java.util包的。
- 实现Comparable接口必须重写compareTo(T o)方法,实现Comparator接口必须重写compare(T o1,T o2)方法。.
- Comparable是内在比较器,实现这个接口的类的对象可以直接比较:this.compareTo(this),这个类也支持排序,由该类对象组成的集合可以直接使用Collections.sort方法排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。Comparator是外在比较器,如果想比较两个类又没有实现Comparable或者想实现自定义排序的,可以用Comparator。
- Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
- 使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是实现一个新的比较器是不用修改原先的类的 。Comparator实际应用广。
通俗来说,如果一个实体类实现了Comparable接口来实现排序规则,使用一段时间后,如果想去改变这个排序规则,基于“开闭原则”对修改关闭对扩展开放,我们提倡通过实现Comparator接口来定义新的排序规则让实体类去采纳,使用一段时间后,如果还想改变,再通过Comparator接口实现一个新的排序规则即可(Comparator符合行为型设计模式中的--策略模式)。不影响类的封装性,易于扩展。