自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序。

  这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序。

  另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,在调用Arrays的sort()时将排序类对象作为参数传入:public static void sort(T[] a,Comparatorc),根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。优点是可以按照多种方式排序,你要按照什么方式排序,就创建一个实现Comparator接口的排序方式类,然后将该排序类的对象传入到Arrays.sort(待排序对象,该排序方式类的对象)

方式一:Comparable

  

 import java.util.Arrays;

 public class Hello {
public static void main(String[] args) {
Person p1=new Person("p1",25);
Person p2=new Person("p2",23);
Person p3=new Person("p3",27);
Person p4=new Person("p4",32);
Person p5=new Person("p5",18); Person[] arr=new Person[]{p1,p2,p3,p4,p5};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
return age-o.age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

输出结果:

[Person [name=p1, age=25], Person [name=p2, age=23], Person [name=p3, age=27], Person [name=p4, age=32], Person [name=p5, age=18]]
[Person [name=p5, age=18], Person [name=p2, age=23], Person [name=p1, age=25], Person [name=p3, age=27], Person [name=p4, age=32]]

方式二:Comparator

 import java.util.Arrays;
import java.util.Comparator; public class Hello {
public static void main(String[] args) {
Student s1=new Student("s1", 23, 89);
Student s2=new Student("s2", 33, 68);
Student s3=new Student("s3", 31, 75);
Student s4=new Student("s4", 17, 80);
Student[] arr=new Student[]{s1,s2,s3,s4}; System.out.println("未排序:"+Arrays.toString(arr));
Arrays.sort(arr, new SortByAge());
System.out.println("按年龄排序:"+Arrays.toString(arr));
Arrays.sort(arr, new SortByScore());
System.out.println("按分数排序:"+Arrays.toString(arr));
}
}
class Student {
private String name;
private int age;
private double score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Student(String name, int age, double score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "[name=" + name + ", age=" + age + ", score=" + score
+ "]";
} } class SortByAge implements Comparator<Student>{ @Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
}
} class SortByScore implements Comparator<Student>{ @Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.getScore()-o2.getScore()>0?1:-1;
}
}

输出结果:

未排序:[[name=s1, age=23, score=89.0], [name=s2, age=33, score=68.0], [name=s3, age=31, score=75.0], [name=s4, age=17, score=80.0]]
按年龄排序:[[name=s4, age=17, score=80.0], [name=s1, age=23, score=89.0], [name=s3, age=31, score=75.0], [name=s2, age=33, score=68.0]]
按分数排序:[[name=s2, age=33, score=68.0], [name=s3, age=31, score=75.0], [name=s4, age=17, score=80.0], [name=s1, age=23, score=89.0]]

对于临时使用的可以使用匿名类的方式:(按年龄降序排序)

Arrays.sort(arr,new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o2.getAge()-o1.getAge();
}
});

31、Arrays数组排序(续)——自定义排序的更多相关文章

  1. Arrays.sort(a) 自定义排序

     Arrays.sort(a) 自定义排序,(需实现接口:Comparable) package com.hd; import java.util.Arrays; class Person imple ...

  2. LeetCode242 有效的字母异位词(Java字符数组排序&自定义排序记录)

    题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.   示例 1: 输入: s = "anagram", t = "nagaram& ...

  3. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  4. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  5. php中usort自定义排序如何使用

    php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...

  6. LeetCode1029 两地调度(贪心+java自定义排序回顾)

    题目: 公司计划面试 2N 人.第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]. 返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵 ...

  7. 007_对go语言中的自定义排序sort的小练习

    在go语言基础知识中,有个知识点是go语言的自定义排序,我在学习完之后,自己做了一些小练习和总结. 首先按照惯例,还是呈上代码演示: package main import "fmt&quo ...

  8. DataTable自定义排序

    使用JQ DataTable 的时候,希望某列数据可以进行自定义排序,操作如下:(以中文排序和百分比排序为例) 1:定义排序类型: //百分率排序 jQuery.fn.dataTableExt.oSo ...

  9. 干货之UICollectionViewFlowLayout自定义排序和拖拽手势

    使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...

  10. DataGridView 绑定List集合后实现自定义排序

    这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...

随机推荐

  1. 【BZOJ】2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2900  Solved: 1031[Submit][Statu ...

  2. Vue组件深入了解(组件注册和Prop)

    一.组件名 自定义组件的名称强烈推荐遵循W3C规范中的方式:字母全小写且必须包含一个连字符. 二.全局注册和局部注册的区别 全局注册 Vue.component进行注册.全局注册的可以在任何创建的实例 ...

  3. bzoj1954 The xor-longest path

    Description  给定一棵n个点的带权树,求树上最长的异或和路径 Input The input contains several test cases. The first line of ...

  4. XPath教程

    XPath 简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery ...

  5. 解决WPF中重载Window.OnRender函数失效问题

    今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的. public partial class MainWindow : Window { public Main ...

  6. Transistor latch improves on/off circuitry

    Figure 1 shows an example of on/off circuitry commonly used in battery-operated devices. The p-chann ...

  7. Switch debouncer uses only one gate

    The circuit in Figure 1 produces a single debounced pulse each time you press S1. Moreover, the circ ...

  8. Apache服务器和tomcat服务器有什么区别?

    Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的 Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. ...

  9. hdu 1272 小希的迷宫(java实现)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  10. How to run WPF – XBAP as Full Trust Application

    Recently I work on WPF-XBAP application that will run from intranet website: This application must h ...