Java中的集合类——排序自定义类型元素的集合:重载的sort()方法与Comparable接口

版权声明:转载注明来源。Keep Learning and Coding. https://blog.csdn.net/a771581211/article/details/88413888

首先依旧创建一个自定义类型作为该集合的元素。

package day05;
/**
 * 该类用于作为集合的元素
 * @author kaixu
 *
 */
public class Point implements Comparable<Point>{
	private int x;
	private int y;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
	public Point(){
		
	}
	
	public Point(int x,int y){
		this.x = x;
		this.y = y;
	}
	
	public String toString(){
		return "("+x+","+y+")";
	}
	
	/**
	 * 当实现了Comparable接口后,需要重写下面的方法
	 * 该方法的作用是定义当前对象与给定参数对象比较大小的规则。
	 * 返回值为一个int值,该值表示大小关系。它不关注具体的取值是多少,而关注的是取值范围。
	 * 当返回值>0时:当前对象比参数对象大
	 * 当返回值<0时:当前对象比参数对象小
	 * 当返回值=0时:两个对象相等。
	 */
	@Override
	public int compareTo(Point o) {
		/*
		 * 比较规则:点到原点的绝对距离
		 */
		int len = this.x*this.x+this.y*this.y;
		int olen = o.x*o.x+o.y*o.y;
		return len-olen;
	}
}

在此基础上新建类SortListDemo1,建立测试方法

package day05;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import day05.Point;

/**
 * 排序自定义类型元素的集合
 * @author kaixu
 *
 */
public class SortListDemo1 {

	public static void main(String[] args) {
		List<Point> list = new ArrayList<Point>();
		list.add(new Point(4,2));
		list.add(new Point(2,3));
		list.add(new Point(1,4));
		list.add(new Point(6,7));
		list.add(new Point(9,3));
		list.add(new Point(8,1));
		
		System.out.println(list);
		/*
		 * sort方法要求集合元素必须实现Comparable接口
		 * 该接口用于规定实现类是可以比较的。
		 * 其有一个抽象方法是用来定义比较大小的规则。
		 * 
		 * 我们想使用sort方法排序集合,但是该方法要求我们的集合元素必须实现Comparable接口
		 * 并且自定义比较规则,这种我们想使用某个功能,而它要求我们修改程序的现象称为"侵入性"。
		 * 修改的代码越多,侵入性越强,越不利于程序的扩展。 
		 */
		Collections.sort(list);
		System.out.println(list);  //排序成功
	}

}

进一步扩展,若要实现自定义字符串类的自定义规则排序:

package day05;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortListDemo2 {

	public static void main(String[] args) {
		List<String> list =  new ArrayList<String>();
		
		list.add("凡弟弟弟弟");
		list.add("鹿弟弟弟");
		list.add("坤弟弟");
		
		System.out.println(list);
		//Collections.sort(list);
		//System.out.println(list);
		MyComparator com = new MyComparator();
		/*
		 * 重载的sort方法要求传入一个额外的比较器
		 * 该方法不再要求集合元素必须实现Comparable接口
		 * 并且也不再使用集合元素自身的比较规则排序
		 * 而是根据给定的这个额外的比较器的比较规则对集合元素进行排序。
		 * 实际开发中也推荐使用这种方式排序集合元素,若集合元素是自定义的
		 * 创建比较器时也推荐使用匿名内部类的形式。
		 */
		Collections.sort(list,com);
		System.out.println(list);
		//匿名内部类的形式创建
		Comparator<String> com1 = new Comparator<String>(){
			public int compare(String o1, String o2){
				/*
				 * 字符串中字符多的大
				 */
					return o2.length()-o1.length();  //换成字符串长度从大到小排列
			}

		};
		Collections.sort(list,com1);
		System.out.println(list);
	}
	
}

/**
 * 定义一个额外的比较器
 * @author kaixu
 *
 */
class MyComparator implements Comparator<String>{
	/**
	 * 该方法用来定义o1和o2的比较规则
	 * 若返回值>0:o1>o2
	 * 若返回值<0:o1<o2
	 * 若返回值=0:两个对象相等
	 */
	public int compare(String o1, String o2){
	/*
	 * 字符串中字符多的大
	 */
		return o1.length()-o2.length();
	}
}

猜你喜欢

转载自blog.csdn.net/a771581211/article/details/88413888
今日推荐