前言
Collection,一个由单独元素组成的序列,而且这些元素要符合一条或多条规则。List必须按元素插入顺序来保存它们;Set中不能存在重复元素;而Queue则要按照排队规则来输出元素(通常与元素插入的顺序相同)。
因为有时java中Collection集合中的对象不是数字或者简单比较ASCII字符串,可以直接排序。所以我们有必要学习自定义Comparator,重写compare()方法进行排序。
- **建议使用重载的public static void sort(List list,Comparator<? super T> )方法灵活的完成集合的排序操作,这个里面就涉及到了Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性!
举例如下:
public class CollectionSortDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("13wwdkn xmcadla");
list.add("13wwdkn");
list.add("xmcadla");
System.out.println(list);//[13wwdkn xmcadla, 13wwdkn, xmcadla]
Collections.sort(list , new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println(list);//[13wwdkn, xmcadla, 13wwdkn xmcadla]
}
}
其中创建了匿名内部类、重写compare()方法如下。
Collections.sort(list , new Comparator<String>() {
/**
返回值实现的要求:------不用纠结,去记下面的结论即可
1)如果返回值 > 0,则表达式o1 > o2
2) 如果返回值 < 0,则表达式o1 < o2
3) 如果返回值 = 0,则表达式 o1 = o2
结论:
1)前面的(o1)-后面的(o2)----------升序
2)后面的(o2)-前面的(o1)----------降序
**/
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
案例分析:设置坐标内点的集合,并对坐标内的点根据其x或y值进行升序或降序排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 排序point类型
*/
public class ListSortPointDemo {
public static void main(String[] args){
List<Point> list = new ArrayList<>();
list.add(new Point(1,2));
list.add(new Point(3,4));
list.add(new Point(111,411));
list.add(new Point(311111,411111));
list.add(new Point(3000000,4000000));
System.out.println("list原始数据" + list);
//list原始数据[(1, 2), (3, 4), (111, 411), (311111, 411111), (3000000, 4000000)]
//因为Point没有Comparator接口,所以
Collections.sort(list, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2){
//return o1.getX() - o2.getX();//根据x坐标升序
return o2.getX() - o1.getX();//根据x坐标降序
}
});
System.out.println("list排序后数据" + list);
//list排序后数据[(3000000, 4000000), (311111, 411111), (111, 411), (3, 4), (1, 2)]
//根据点距离原点的距离,从大到小排序
Collections.sort(list, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2){
int len1 = o1.getX() * o1.getX() + o1.getY()* o1.getY();
int len2 = o2.getX() * o2.getX() + o2.getY()* o2.getY();
//return len1 - len2;//升序
return len2 - len1;//降序
}
});
System.out.println("list根据点距离原点的距离降序排序后数据" + list);
System.out.println(2*2*2);
//list根据点距离原点的距离排序后数据[(-1000000, -2000000), (111, 411), (31, 41), (30, 40), (3, 4)]
//list内部提供了sort()方法进行排序,sort()方法依然需要传入Comparator进行排序
list.sort(new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2){
int len1 = o1.getX() * o1.getX() + o1.getY()* o1.getY();
int len2 = o2.getX() * o2.getX() + o2.getY()* o2.getY();
return len1 - len2;//升序排序
}
});
System.out.println("list根据点距离原点的距离升序排序后数据" + list);
//list根据点距离原点的距离升序排序后数据[(3, 4), (30, 40), (31, 41), (111, 411), (-1000000, -2000000)]
}
}