以对象某属性为依据,为其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的初学者探索出来的方法。以后作者学会新方法后再将其他方法分享。欢迎读者朋友们一起讨论。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lgxo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值