以对象某属性为依据,为其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)的实现方式的主要内容,如果未能解决你的问题,请参考以下文章

JS对象数组多条件排序

Java中List对象集合按照对象某一属性字段排序

sort方法根据数组中对象的某一个属性值进行排序

js sort方法根据数组中对象的某一个属性值进行排序

js sort方法根据数组中对象的某一个属性值进行排序

python中sorted方法和列表的sort方法