java中Collection集合元素的排序:自定义Comparator接口作为匿名内部类,重写compare()方法进行排序

前言

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)]
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值