java常用的排序方法

java常用的排序方法

一、数组排序

1.1数组从小到大排序

可以使用java.util包下Arrays类里的静态方法sort

代码示例:

public class ArraysSort {
    public static void main(String[] args) {
        Integer[] a = {9, 8, 5, 13, 76, 34};
        Arrays.sort(a);
        for (Integer i : a) {
            System.out.println(i);
        }
    }
}
1.2数据从大到小排序

Arrays.sort()有很多重载方法,通过看源码或api文档可知,其中有一个sort方法传入的2参数分别是一个数组和一个Comparator泛型接口,这个接口就是实现逆序排序的关键了。由于参数都是实例的,而接口是不能直接实例的,所以我们可以写一个实现这个接口的类,然后重写比较大小的规则即可。

public class ArraysSort {
    public static void main(String[] args) {
        Integer[] a = {9, 8, 5, 13, 76, 34};
        Arrays.sort(a, new MyComparator());
        for (Integer i : a) {
            System.out.println(i);
        }
    }
}

class MyComparator implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
      // 从大到小是o2 - o1,从小到大是o1 - o2
      // 返回值是负数,会把数字往左移,等于0不变,正数右移
        return o2 - o1;
    }
}
1.3指定数组局部位置排序
public class ArraysSort {
    public static void main(String[] args) {
        Integer[] a = {9, 8, 5, 13, 76, 34};
        // 0是开始位置,2是结束位置+1(所以索引的范围是前闭后开)
        Arrays.sort(a, 0, 2);
        for (Integer i : a) {
            System.out.println(i);
        }
    }
}

二、List对象排序

2.1List从小到大排序

可以使用java.util包下Collections类里的静态方法sort

public class ListSort {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(9);
        list1.add(4);
        list1.add(2 );
        list1.add(13);
        Collections.sort(list1);
        System.out.println(list1);
    }
}
2.2List从大到小排序

方法1:实现Comparator接口

public class ListSort {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(9);
        list1.add(4);
        list1.add(2 );
        list1.add(13);
        Collections.sort(list1, new MyComparator());
        System.out.println(list1);
    }
}

class MyComparator implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}

方法2:

使用Collections.reverse()方法可以反转List

先从小到大排序,然后反转List

public class ListSort {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(9);
        list1.add(4);
        list1.add(2 );
        list1.add(13);
        Collections.sort(list1);
        Collections.reverse(list1);
        System.out.println(list1);
    }
}
2.3给List里的自定义对象排序

自定义对象需要实现Comparable接口并重写compareTo方法,Integer类也实现了Comparable接口,所以参考源码改改参数即可实现。学会这个技术对特殊的数据结构进行排序就非常方便了,比如对一个链表进行排序。

class Student implements Comparable<Student> {
  	// 定义了一个简单的pojo类,然后定义构造函数,get,set,toString方法,并重写compareTo方法
    private Integer id;
    private String name;

    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {
      	// 这里两个数比较也有三种情况,和上述的Comparator接口的方法差不多
        return (this.id < o.id) ? -1 : ((this.id == o.id) ? 0 : 1);
    }
}
public class ListSort {
    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<>();
        list1.add(new Student(89, "李四"));
        list1.add(new Student(45, "张三"));
        list1.add(new Student(101, "王五"));
        Collections.sort(list1);
        System.out.println(list1);
    }
}
2.4打乱List里的数据顺序(随机)

可以使用 Collections.shuffle方法,随机这个场景也是比较多的,比如扑克牌的发牌。就可以不用自己造轮子了。

public class ListSort {
    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<>();
        list1.add(new Student(89, "李四"));
        list1.add(new Student(45, "张三"));
        list1.add(new Student(101, "王五"));
        Collections.shuffle(list1);
        System.out.println(list1);
    }
}
  • 7
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值