目录
1、打乱集合顺序shuffle方法(使用默认的随机源随机排列指定的列表)
1、第一种使用sort方法的方式是:Comparable 排序接口
一、Collections类概述
其实对于Collections类来说,是很好理解的,就是集合的工具类,和Arrays类似,但是有一些注意事项是值得我们注意的!
注意:
1、首先我们要注意的就是:Collections类和Collection接口的区分,他们两个之间只有一个字母的差别,但是一个是集合的父类接口一个是集合的工具类。要注意区分。
2、其次就是,Collections类并不是Collection的实现类,在api中它并没有实现Collection接口。
3、Colllections类它本身是存在构造方法的,但是它的构造方法是被private修饰的,所以我们不能通过new关键字来创建它的对象。
4、正是因为它的构造方法被private修饰了,所以在Collections类中,它的所有的方法都是静态方法,我们可以通过类名去直接调用它们!
下面我们就来看看Cllocetions中有哪些常用的方法!
二、Collections类的常用方法
1、打乱集合顺序shuffle方法(使用默认的随机源随机排列指定的列表)
此方法是Collections类中比较简单的一个方法,其作用就是将有序的list集合进行随机排序,也正是因为这样所以此方法不支持对本身就无序的Set集合使用。
代码实现如下:
public class Demo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A1");
list.add("A2");
list.add("A3");
list.add("A4");
list.add("A5");
System.out.println("list = " + list);
Collections.shuffle(list);
System.out.println("list = " + list);
//Set集合,
HashSet<String> set = new HashSet<>();
//Collections.shuffle(set);无法对Set集合进行乱序
}
}
2、将指定列表按升序排列sort方法
这就是Collections类中比较重要的一个方法了,Collections类中的sort方法,其本身其实就是Arrays类中的sort方法。我们去去源码中看一看就知道了
点开Collections.sort就会看到
再点进去,注意看:先转成object数组,然后利用Arrays.sort进行排序
了解了Collections类中的sort方法以后,我们来看一看怎么实现我们的sort方法
sort方法的实现
1、第一种使用sort方法的方式是:Comparable 排序接口
若一个类实现了Comparable接口,就意味着“该类支持排序”。
假设“有一个List列表(或数组),里面的元素是实现了Comparable接口的类”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
代码如下:
public static void main(String[] args){
List c = new ArrayList();
c.add("l");
c.add("o");
c.add("v");
c.add("e");
System.out.println(c);//-->love
Collections.sort(c);
System.out.println(c);//-->elov
}
所以这里又有一个很重要的注意事项!
如果想要使用sort方法进行排序,条件是:集合中的类型T必须是Comparable的子类型。 也就是说集合中所存储的数据类型的类必须要实现Comparable接口
这里我们可以去api中看一下,比如我们常用的String类就实现了Comparable接口
那么当集合中存储的数据是我们自己创建的类时,我们想要使用sort方法,那么我们也要将我们创建的类去实现Comparable接口,同时重写compareTo(T o);方法!
那么要如何重写compareTo(T o);方法呢?
代码如下:
public int compareTo(T o); //抽象方法
//子类实现后,需要进行重写
返回值int,只关心正负或者0,不需要关系具体值
原始排序:this【我】 o【他】
如果要升序排序:我减他
如果要降序排序:他-我
public class Kehu implements Comparable<Kehu> {
private String name;
private double assets;
@Override
public int compareTo(Kehu o) {
return (int) (o.assets-this.assets);//降序排列
//return (int) (this.assets-o.assets);//升序排列
}
}
那么当我们集合中存储的元素的类型没有实现我们的Comparable接口是,我们该怎么办呢,难道就没有办法使用sort方法了吗?肯定不是的,所以我们还有第二种使用sort方法的方式!
2、通过Comparator比较器接口来实现
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
Collections.sort(list, new PriceComparator())
这就创建了一个比较器,其中需要传入的两个参数分别是:
参数一:需要排序的list
参数二:比较器,实现Comparator接口的类,返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。
Comparator是个接口,可重写compare()及equals()这两个方法,用于比较功能;如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的。
compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
代码实现如下:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("beijing");
list.add("shanghai");
list.add("hangzhou");
Collections.sort(list, new Comparator<String>() {
public int compare(String str1, String str2) {
/**
* 升序排的话就是第一个参数.compareTo(第二个参数);
* 降序排的话就是第二个参数.compareTo(第一个参数);
*/
// 按首字母升序排
// return str1.compareTo(str2);
// 按第二个字母升序排
char c1 = str1.charAt(1);
char c2 = str2.charAt(1);
return c1 - c2; //c2 - c1则返回按第二个字母降序排序
}
});
System.out.println(list);
}
当然Collections类中还有很多的静态方法,这里就不一一赘述了,想要了解的话,我们可以去api中查看
三、Collections类中的其他方法
1.reverse()方法的使用:反转集合中元素的顺序
2.shuffle(Collection)方法的使用:对集合进行随机排序。
3.fill(List list, Object o)方法的使用(含义:用对象o替换集合list中的所有元素)
4.copy(List m, List n)方法的使用(含义:将集合n中的元素全部复制到m中,并且覆盖相应索引的元素)。
5.min(Collection),min(Collection, Comparator)方法的使用(前者采用Collection内含自然比较法,后者采用Comparator进行比较)。
6.max(Collection),max(Collection, Comparator)方法的使用(前者采用Collection内含自然比较法,后者采用Comparator进行比较)。
7.indexOfSubList(List list, List subList)方法的使用(含义:查找subList在list中首次出现位置的索引)。
8.lastIndexOfSubList(List source, List target)方法的使用与上例方法的使用相同
9.rotate(List list, int m)方法的使用(含义:集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来)。移动列表中的元素,负数向左移动,正数向右移动
10.swap(List list, int i, int j)方法的使用(含义:交换集合中指定元素索引的位置)
11.binarySearch(Collection, Object)方法的使用(含义:查找指定集合中的元素,返回所查找元素的索引)。
12.replaceAll(List list, Object old, Object new)方法的使用(含义:替换批定元素为某元素,若要替换的值存在刚返回true,反之返回false)。