Arrays.sort()
基本数据类型数组的排序:一般按升序排,可指定排序的范围
static void sort(int[] a)
对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex)
对指定 int 型数组的指定范围按数字升序进行排序。
对象数组的排序1:按元素的自然顺序,需要参与排序的元素自身具备比较性,即实现 Comparable 接口,复写compareTo方法,也就是按compareTo方法中指定的顺序排序。
static void sort(Object[] a)
根据元素的自然顺序对指定对象数组按升序进行排序。
static void sort(Object[] a, int fromIndex, int toIndex)
根据元素的自然顺序对指定对象数组的指定范围按升序进行排序。
对象数组的排序2:按指定的顺序排序:在比较器中定义怎么排法
static < T> void sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组进行排序。
static < T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。
总结:基本数据类型的升序排序近似第二种自然顺序排序,也就是说,数组的sort方法就定义了两种排序方式:一种是按数据结构内部定义好规则的排序,另一种把排序的规则抽离,算法与数据结构分家后,单独封装,降低耦合性,提高自由度。
Collections.sort()
如上所述,Collections工具类中排序方法就提供这两种,都是对List进行的排序。
static <T extends Comparable<? super T>> void sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
TreeSet
该集合底层用二叉树而实现了其内元素的排序功能。
构造方法如下:
可以自己add元素,可以由其他集合转换过来,也可以自己定义比较器
TreeSet()
构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c)
构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
还有一个获得比较器的方法:
Comparator<? super E> comparator()
返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null。
Comparable与Comparator的比较
由上可见,要对对象进行排序,
-
要么对象本身要有比较性:比如基本数据类型,String类型等,或者自定义的类实现Comparable接口并复写compareTo方法;
或者针对要排序的对象专门定义一个比较器:自定义一个类并实现Comparator,复写compare方法
自定义比较器
代码演示1:实现Comparable接口
- 注意compareTo方法:
int compareTo(T o)
比较此对象与指定对象的顺序。
参数:
o - 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
class User implements Comparable<User>//采用泛型
{
private String name;
private int age;
public User(String name , int age)
{
this.name = name ;
this.age = age;
}
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 int compareTo(User u) //按年龄倒序排序,如果年龄相同则按名字的自然顺序排序
{
if(this.age==u.getAge())
return(this.name.compareTo(u.getName()));//this(本对象)在前,表示按升序排序
else
return (u.getAge()-this.age);//this在后,表示按降序
}
}
代码演示2:自定义比较器:
有两个方法:compare、equals,但只重写compare方法。
int compare(T o1, T o2)
比较用来排序的两个参数。
参数:
o1 - 要比较的第一个对象。
o2 - 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。
class MyCompare implements Comparator<User>
{
public int compare(User u1,User u2)
{
if(u1.getName().equals(u2.getName()))
return (u1.getAge()-u2.getAge());
else
return (u1.getName().compareTo(u2.getName()));
}
}
TreeSet<User> ts = new TreeSet<User>(new MyCompare());//让TreeSet按MyCompare中顺序排序
//或者,原先User对象加入了List中,且内部没有定义比较方法,那么可使用
ArrayList<User> al = new ArrayList<User>();
Collections.sort(al,new MyCompare());
思考:HashSet怎么排序?
内部元素本身是否有比较性?
本身有的话,那好办,用TreeSet来接收即可。
元素本身没有定义比较性的话,就自定义一个比较器,再用将HashSet中元素存入到TreeSet或List集合中。
总之,要将元素放到另一个集合中,HashSet集合本身是无法排序的。