Java学习笔记(32)-Comparable接口

package day03;
/**
 * 可比较的点
 * 若我们定义的类想在数组或集合中可以排序,我们需要将当前类实现
 * Comparable接口,并定义比较规则
 * @author Administrator
 *
 */
public class ComparablePoint
	implements Comparable<ComparablePoint>{
	/**
	 * 属性定义
	 */
	private int x;
	private int y;
	public ComparablePoint(int x,int y){
		this.x = x;
		this.y = y;
	}
	/**
	 * 比较方法,该方法由Comparable接口定义
	 * 所有子类均需要实现该方法来定义比较规则
	 * 比较规则:
	 * 比较点到原点的距离,谁的距离长谁大
	 */
	public int compareTo(ComparablePoint o) {
		//自身点到原点的距离
		int r = x*x+y*y;
		//参数点到原点的距离
		int other = o.x*o.x+o.y*o.y;
		/**
		 * 返回结果大于0,自身比参数大
		 * 小于0,自身比参数小
		 * 等于0,自身和参数相等
		 * 需要注意:
		 * equals返回true的时候,
		 * comparaTo的返回值应该为0
		 * 反过来也一样
		 */
		return r - other;
	}
	public String toString(){
		return "x="+x+",y"+y;
	}

}

Collection与Collections的区别?

Collection是集合的接口

Collection类

集合的工具类。提供了对集合操作的若干方法

sort():该方法可以对集合中的元素做自然排序


package day03;

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

/**
 * 测试集合工具类对集合元素进行的自然排序
 * 要确保集合中的元素是Comparable的子类!
 * @author Administrator
 *
 */
public class DemoComparable {
	public static void main(String[] args) {
		List<ComparablePoint> list  = new ArrayList<ComparablePoint>();
		//向集合中存放3个对象
		list.add(new ComparablePoint(1,5));
		list.add(new ComparablePoint(3,4));
		list.add(new ComparablePoint(2,2));
		
		System.out.println(list);//输出顺序与存放时一致
		/**
		 * 使用集合工具类对集合进行自然排序
		 * 该方法会一次调用集合中每个元素的compareTo方法进行比较
		 */
		Collections.sort(list);
		System.out.println(list);
	}
}

Comparator比较器

它是一个接口。实现该接口的类需要实现一个抽象方法int compareTo(E o1,E o2)

该方法返回值大于0:o1比o2大

该方法返回值小于o: o1比o2小

该方法返回值等于o: o1与o2相等

比较器可以用于比较集合中的元素。

Collections提供了sort的重载方法,支持传入一个比较器对集合进行比较 。

如何用eclipse自动公开属性值?

空白处右键source->generator getters and setters

package day03;
/**
 * 可比较的点
 * 若我们定义的类想在数组或集合中可以排序,我们需要将当前类实现
 * Comparable接口,并定义比较规则
 * @author Administrator
 *
 */
public class ComparablePoint
	implements Comparable<ComparablePoint>{
	/**
	 * 属性定义
	 */
	private int x;
	private int y;
	public ComparablePoint(int x,int y){
		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;
	}

	/**
	 * 比较方法,该方法由Comparable接口定义
	 * 所有子类均需要实现该方法来定义比较规则
	 * 比较规则:
	 * 比较点到原点的距离,谁的距离长谁大
	 */
	public int compareTo(ComparablePoint o) {
		//自身点到原点的距离
		int r = x*x+y*y;
		//参数点到原点的距离
		int other = o.x*o.x+o.y*o.y;
		/**
		 * 返回结果大于0,自身比参数大
		 * 小于0,自身比参数小
		 * 等于0,自身和参数相等
		 * 需要注意:
		 * equals返回true的时候,
		 * comparaTo的返回值应该为0
		 * 反过来也一样
		 */
		return r - other;
	}
	public String toString(){
		return "x="+x+",y"+y;
	}

}
package day03;

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

/**
 * 测试集合工具类对集合元素进行的自然排序
 * 要确保集合中的元素是Comparable的子类!
 * @author Administrator
 *
 */
public class DemoComparable {
	public static void main(String[] args) {
		List<ComparablePoint> list  = new ArrayList<ComparablePoint>();
		//向集合中存放3个对象
		list.add(new ComparablePoint(1,5));
		list.add(new ComparablePoint(3,4));
		list.add(new ComparablePoint(2,2));
		
		System.out.println(list);//输出顺序与存放时一致
		/**
		 * 使用集合工具类对集合进行自然排序
		 * 该方法会一次调用集合中每个元素的compareTo方法进行比较
		 */
		Collections.sort(list);
		System.out.println(list);
		/**
		 * 在排序集合元素时,我们不想根据元素的比较规则来进行
		 * 排序:按照x值自小至大的顺序排序集合元素
		 * 自定义的比较规则实现需要以下步骤:
		 * 1:定义一个类并实现Comparator接口
		 * 2:实现接口中的抽象方法compareTo(E o1,E o2)
		 * 3:实例化这个比较器
		 * 4:调用Collections的重载方法
		 * sort(Collection c,Comparator comparator)
		 * 进行排序
		 * 
		 * 使用匿名类方式创建一个实例来定义比较器
		 */
		Comparator<ComparablePoint> c = new Comparator<ComparablePoint>(){
			/**
			 * 自定义的比较规则
			 * o1
			 * o2
			 * 
			 * return 大于0:o1>o2,小于0:o1<o2 等于0:o1==o2
			 */
			public int compare(ComparablePoint o1,ComparablePoint o2){
				//两个点的x值大的大
				return -(o1.getX() - o2.getX());
			}
		};
		Collections.sort(list,c);
		System.out.println(list);
	}
}
package day03;

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

/**
 * 自定义比较器练习
 * @author Administrator
 *
 */
public class DemoComaparator {
	public static void main(String[] args) {
		/**
		 * 定义一个字符串集合
		 * 集合中存放:"Tom","Jerry","Boss","Killer","Kack","Clark"
		 * 使用自然排序查看排序结果
		 * 自定义排序规则:字母长的在后面,进行排序
		 */
		List<String> list = new ArrayList<String>();
		list.add("Tom");
		list.add("Jerry");
		list.add("Boss");
		list.add("Killer");
		list.add("Kack");
		list.add("Clark");
		System.out.println(list);
		/**
		 * 使用String自定义的排序规则做自然排序
		 */
		Collections.sort(list);
		
		System.out.println(list);
		
		Comparator<String> comparator = 
				new Comparator<String>(){
			/**
			 * 字符串字符多的在后面
			 * o1
			 * o2
			 * return 
			 */
			public int compare(String o1,String o2){
				return o1.length() - o2.length();
			}
		};
		Collections.sort(list,comparator);
		
		System.out.println(list);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值