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);
}
}