以对象某属性为依据,为其List使用sort方法进行排序的一种基于委托(delegation)的实现方式
Posted lgxo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以对象某属性为依据,为其List使用sort方法进行排序的一种基于委托(delegation)的实现方式相关的知识,希望对你有一定的参考价值。
前言
在写代码时,需要对这样一种List进行排序,它的组成元素为我们构建的一种数据类型,而排序依据为这个数据类型的某个属性。
之前再查阅博客时,发现大多数作者写的都很冗余,很难静心看下去。在自己摸索出来一种方法后,写出了这篇博客希望可以帮助一些需要使用这种排序的朋友们。
实现方法(举例)
“纸上得来终觉浅,绝知此事要躬行",空说方法太过浮躁,下面我们用一个实例来讲述这种基于委托的实现方式。
读者可以根据需要自行安排
“元素”数据类型ADT(可跳过这节)
构造一个简单的Boy类
,具有姓名
和年龄
两种属性,代码如下,
/**
* 表示一个男孩,姓名为name, 年龄为age
* immutable
* @author 晓龙
*
*/
public class Boy {
private final String name;
private final int age;
//AF:
// name 表示男孩的姓名
// age 表示男孩的年龄
//RI:
// name 一个大写字母加上小写的字符串构成
// age > 0
//Safy from rep exposure:
// 所有域都是private和final修饰的
// name, age 分别为String, int类型,它们都是immutable的
//Check that the rep invariant is true
//*** Warning: this does nothing unless you turn on assertion checking
//by passing -enableassertions to Java
private void checkRep() {
assert age > 0;
assert name.matches("\\\\p{Upper}\\\\p{Lower}+");
}
/**
* 构造一个新的Boy对象
* @param name 男孩的姓名
* @param age 男孩的年龄
*/
public Boy(String name, int age) {
super();
this.name = name;
this.age = age;
checkRep();
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
@Override
public String toString() {
return "[" + String.format("%-11s", "name=" + name)
+ ", "
+ String.format("%8s", "age=" + age) + "]";
}
}
委托使用的实现类myCampartor(重要)
接着,编写一个实现Campartor接口的实现类myCampartor, 之后排序时的依据,如以哪个属性为依据、按什么顺序(从小到大等),这些依据都是在这个类中用代码体现的。我规定的是按Boy的age从小到大排序。代码如下:
class myComparator implements Comparator<Boy> {
@Override
public int compare(Boy o1, Boy o2) {
if(o1.getAge() < o2.getAge()) {
return -1;
}
if(o1.getAge() > o2.getAge()){
return 1;
}
return 0;
}
}
使用委托实现(重要)
此时我们便可以基于委托而sort方法了,我写的类中第26、27行
是委托与sort方法的使用,代码如下:
public class Impl {
public static void main(String[] args) {
List<Boy> boys = new ArrayList<>();
Boy lgxo = new Boy("Lgxo", 21);
Boy tom = new Boy("Tom", 18);
Boy helen = new Boy("Helen", 19);
Boy jack = new Boy("Jack", 25);
Boy jan = new Boy("Jan", 23);
//加入List
boys.add(lgxo);
boys.add(tom);
boys.add(helen);
boys.add(jack);
boys.add(jan);
//排序前
System.out.println("*****before sort*****");
for(int i = 0; i < boys.size(); i++) {
System.out.println(boys.get(i).toString());
}
//---------------排序---------------
Comparator<Boy> myOrder = new myComparator();
boys.sort(myOrder);
System.out.println();
//排序后
System.out.println("*****after sort*****");
for(int i = 0; i < boys.size(); i++) {
System.out.println(boys.get(i).toString());
}
}
}
输入效果如下,可以看到排序成功.
结语
当然实现这种排序还有更多的方法,这里只是作者作为一个java的初学者探索出来的方法。以后作者学会新方法后再将其他方法分享。欢迎读者朋友们一起讨论。
以上是关于以对象某属性为依据,为其List使用sort方法进行排序的一种基于委托(delegation)的实现方式的主要内容,如果未能解决你的问题,请参考以下文章