集合元素的排序

排序集合元素

排序集合使用的是集合的工具类Collection的静态方法sort。
排序仅能对List集合进行。因为Set部分实现类是无序的。
Collections.sort(list)

排序自定义类型元素的集合

eg:

/**
 * 该类用于作为集合的元素
 */
public class Point implements Comparable<Point> {
	private int x;
	private int y;
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = 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 String toString() {
		return "("+x+","+y+")";
	}
	/*
	 *当实现了Comparable接口后,需要重写下面的方法
	 *该方法的作用是定义当前对象与给定参数对象比较大小的规则。
	 *返回值为一个int值,该值表示大小关系。它不关注具体的取值是多少,而关注的是取值范围。
	 *当返回值>0时:当前对象比参数对象大
	 *当返回值<0时:当前对象比参数对象小
	 *当返回值=0时:两个对象相等。
	 */
	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;
	}                       
}
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);

	}

定义一个额外的比较器

eg:

public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("jerry");
		list.add("tom");
		list.add("merry");
		list.add("rose");
		list.add("jack");
		list.add("Bilibili");
		list.add("lady gaga");
		list.add("kobe");
		list.add("JACKSON");
		list.add("Karray");
		list.add("Roy");
		list.add("JAMES");
		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);
	}
/**
 * 定义一个额外的比较器
 */
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();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值