zoukankan      html  css  js  c++  java
  • Collections类常用方法总结

    1. sort

    对集合进行排序

    1 public static <T extends Comparable<? super T>> void sort(List<T> list)
    2 
    3 public static <T> void sort(List<T> list,
    4                             Comparator<? super T> c)

      在使用List时想根据List中存储对象的某一字段进行排序,那么我们要用到Collections.sort方法对list排序,用Collections.sort方法对list排序有两种方法:

    • 第一种是list中的对象实现Comparable接口;
    • 第二种方法是根据Collections.sort重载方法来实现。

    示例如下:

    复制代码
      1 public class SortTest {
      2     public static void main(String[] args) {
      3         List<String> listS = new ArrayList<String>();
      4         List<Employer1> list1 = new ArrayList<Employer1>();
      5         List<Employer2> list2 = new ArrayList<Employer2>();
      6         List<Employer3> list3 = new ArrayList<Employer3>();
      7         
      8         //一.将String类型的变量插入到listS中并排序
      9         //listS中的对象String 本身含有compareTo方法,所以可以直接调用sort方法,按自然顺序排序,即升序排序
     10         listS.add("5");
     11         listS.add("2");
     12         listS.add("9");
     13         Collections.sort(listS);
     14         
     15         //二.将Employer1类的对象插入到list1中并排序
     16         //将已创建的实现了Comparator接口的比较类MyCompare传入Collections的sort方法中即可实现依照MyCompare类中的比较规则。
     17         Employer1 a1 = new Employer1();
     18         Employer1 b1 = new Employer1();
     19         Employer1 c1 = new Employer1();
     20         a1.setName("a1");   a1.setAge(44);
     21         b1.setName("b1");   b1.setAge(55);
     22         c1.setName("b1");   c1.setAge(33);
     23         list1.add(a1);
     24         list1.add(b1);
     25         list1.add(c1);//Collections类的sort方法要求传入的第二个参数是一个已实现Comparator接口的比较器
     26         Collections.sort(list1, new MyCompare());
     27 
     28         //三.将Employer2类的对象插入到list2中并排序
     29         //其实原理和上面的二类似,只是没有单独创建MyCompare类,而是用匿名内部类来实现Comparator接口里面的具体比较。
     30         Employer2 a2 = new Employer2();
     31         Employer2 b2 = new Employer2();
     32         Employer2 c2 = new Employer2();
     33         a2.setName("a2");   a2.setAge(66);
     34         b2.setName("b2");   b2.setAge(33);
     35         c2.setName("b2");   c2.setAge(22);
     36         list2.add(a2);
     37         list2.add(b2);
     38         list2.add(c2); //Collections类的sort方法要求传入的第二个参数是一个已实现Comparator接口的比较器
     39         Collections.sort(list2,new Comparator<Employer2>(){
     40             @Override
     41             public int compare(Employer2 a2, Employer2 b2) {
     42                 return a2.getOrder().compareTo(b2.getOrder());
     43             }
     44 
     45         });
     46 
     47         //四.将Employer3类的对象插入到list3中并排序
     48         //被排序的类Employer3实现了Comparable接口,在类Employer3中通过重载compareTo方法来实现具体的比较。
     49         Employer3 a3 = new Employer3();
     50         Employer3 b3 = new Employer3();
     51         Employer3 c3 = new Employer3();
     52         a3.setName("a3");   a3.setAge(77);
     53         b3.setName("b3");   b3.setAge(55);
     54         c3.setName("b3");   c3.setAge(99);
     55         list3.add(a3);
     56         list3.add(b3);
     57         list3.add(c3);
     58         Collections.sort(list3);//Collections类的sort方法要求传入的List中的对象是已实现Comparable接口的对象
     59 
     60         System.out.println(listS);
     61         System.out.println(list1);
     62         System.out.println(list3);
     63         System.out.println(list2);
     64     }
     65 }
     66 class Employer1{
     67     private String name;
     68     private Integer age;
     69     public void setName(String name) {
     70         this.name = name;
     71     }
     72     public Integer getAge() {
     73         return age;
     74     }
     75     public void setAge(Integer age) {
     76         this.age = age;
     77     }
     78     @Override//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
     79     public String toString() {
     80         return "name is "+name+" age is "+ age;
     81     }
     82 }
     83 class MyCompare implements Comparator<Employer1> {
     84     @Override//重载了Comparator接口里面的compare方法实现具体的比较
     85     public int compare(Employer1 o1, Employer1 o2) {
     86         return o1.getAge().compareTo(o2.getAge());
     87     }
     88 }
     89 class Employer2{
     90     private String name;
     91     private Integer age;
     92     public void setName(String name) {
     93         this.name = name;
     94     }
     95     public Integer getOrder() {
     96         return age;
     97     }
     98     public void setAge(Integer age) {
     99         this.age = age;
    100     }
    101     @Override//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
    102     public String toString() {
    103         return "name is "+name+" age is "+age;
    104     }
    105 }
    106 class Employer3 implements Comparable<Employer3>{
    107     private String name;
    108     private Integer age;
    109     public void setName(String name) {
    110         this.name = name;
    111     }
    112     public Integer getAge() {
    113         return age;
    114     }
    115     public void setAge(Integer age) {
    116         this.age = age;
    117     }
    118     @Override//重载了Object类里的toString方法,使之可以按照我们要求的格式打印
    119     public String toString() {
    120         return "name is "+name+" age is "+age;
    121     }
    122     @Override//重载了Comparable接口里的compareTo方法来实现具体的比较
    123     public int compareTo(Employer3 a) {
    124         return this.age.compareTo(a.getAge());
    125     }
    126 }
    复制代码

    打印的结果为:

    [2, 5, 9]
    [name is b1 age is 33, name is a1 age is 44, name is b1 age is 55]
    [name is b3 age is 55, name is a3 age is 77, name is b3 age is 99]
    [name is b2 age is 22, name is b2 age is 33, name is a2 age is 66]

    ★compareTo()小结

      由上面的程序我们可以看出,无论是实现了Comparable接口的方法还是实现了Comparator接口的方法,最终比较的返回值都是通过compareTo方法实现的,故就把compareTo方法单独拿出来做个小结。

      compareTo()的返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。例如:

    复制代码
    1 String s1 = "abc"; 
    2 String s2 = "abcd"; 
    3 String s3 = "abcdfg"; 
    4 String s4 = "1bcdfg"; 
    5 String s5 = "cdfg"; 
    6 System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1) 
    7 System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3) 
    8 System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48) 
    9 System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)
    复制代码

    2. shuffle

    对集合进行随机排序

    1 public static void shuffle(List<?> list)
    2 
    3 public static void shuffle(List<?> list, Random rnd)

    示例:

    复制代码
     1 public class Practice {
     2     public static void main(String[] args){
     3         List c = new ArrayList();
     4         c.add("w");
     5         c.add("o");
     6         c.add("r");
     7         c.add("l");
     8         c.add("d");
     9         System.out.println(c);
    10         Collections.shuffle(c);
    11         System.out.println(c);
    12         Collections.shuffle(c);
    13         System.out.println(c);
    14     }
    15 }
    复制代码

    运行结果为:

    [w, o, r, l, d]
    [l, d, w, o, r]
    [o, r, d, l, w]

    3. binarySearch

    查找指定集合中的元素,返回所查找元素的索引

    复制代码
    1 public static <T> int binarySearch(List<? extends Comparable<? super T>> list,
    2                                    T key)
    3 
    4 public static <T> int binarySearch(List<? extends T> list,
    5                                    T key,
    6                                    Comparator<? super T> c)
    复制代码

    示例:

    复制代码
     1 public class Practice {
     2     public static void main(String[] args){
     3         List c = new ArrayList();
     4         c.add("w");
     5         c.add("o");
     6         c.add("r");
     7         c.add("l");
     8         c.add("d");
     9         System.out.println(c);
    10         int m = Collections.binarySearch(c, "o");
    11         System.out.println(m);
    12     }
    13 }
    复制代码

    运行结果为:[w, o, r, l, d]
    注意:若查找的元素不存在,示例中的n即表示该元素最有可能存在的位置的索引。

    4. max

    1 public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
    2 
    3 public static <T> T max(Collection<? extends T> coll,
    4                         Comparator<? super T> comp)

    前者采用Collection内含自然比较法,后者采用Comparator进行比较.

    5. min

    1 public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
    2 
    3 public static <T> T min(Collection<? extends T> coll,
    4                         Comparator<? super T> comp)

    前者采用Collection内含自然比较法,后者采用Comparator进行比较。

    6. indexOfSubList

    查找subList在list中首次出现位置的索引

    1 public static int indexOfSubList(List<?> source,
    2                                  List<?> target)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List list = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(list);
    5     List subList = Arrays.asList("three four five six".split(" "));
    6     System.out.println(Collections.indexOfSubList(list, subList));
    7   }
    8 }
    复制代码

    运行结果为:[one, two, three, four, five, six, siven]

    7. lastIndexOfSubList

    使用与上例方法的使用相同,在此就不做介绍了。

    8. replaceAll

    替换批定元素为某元素,若要替换的值存在刚返回true,反之返回false

    1 public static <T> boolean replaceAll(List<T> list,
    2                                      T oldVal,
    3                                      T newVal)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List list = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(list);
    5     List subList = Arrays.asList("three four five six".split(" "));
    6     System.out.println(Collections.replaceAll(list, "siven", "siven eight"));
    7     System.out.println(list);
    8   }
    9 }
    复制代码

    运行结果为:
    [one, two, three, four, five, six, siven]
    true
    [one, two, three, four, five, six, siven eight]

    9. reverse()

    反转集合中元素的顺序

    public static void reverse(List<?> list)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List list = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(list);
    5     Collections.reverse(list);
    6     System.out.println(list);
    7   }
    8 }
    复制代码

    运行结果为:
    [one, two, three, four, five, six, siven]
    [siven, six, five, four, three, two, one]

    10. rotate

    集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来

    1 public static void rotate(List<?> list,
    2                           int distance)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List list = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(list);
    5     Collections.rotate(list, 1);
    6     System.out.println(list);
    7   }
    8 }
    复制代码

    运行结果为:
    [one, two, three, four, five, six, siven]
    [siven, one, two, three, four, five, six]

    11. copy

    将集合n中的元素全部复制到m中,并且覆盖相应索引的元素

    1 public static <T> void copy(List<? super T> dest,
    2                             List<? extends T> src)

    示例:

    复制代码
     1 public class Practice {
     2   public static void main(String[] args){
     3     List m = Arrays.asList("one two three four five six siven".split(" "));
     4     System.out.println(m);
     5     List n = Arrays.asList("我 是 复制过来的哈".split(" "));
     6     System.out.println(n);
     7     Collections.copy(m,n);
     8     System.out.println(m);
     9   }
    10 }
    复制代码

    运行结果为:

    [one, two, three, four, five, six, siven]
    [我, 是, 复制过来的哈]
    [我, 是, 复制过来的哈, four, five, six, siven]

    12. swap

    交换集合中指定元素索引的位置

    1 public static void swap(List<?> list,
    2                         int i,
    3                         int j)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List m = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(m);
    5     Collections.swap(m, 2, 3);
    6     System.out.println(m);
    7   }
    8 }
    复制代码

    运行结果为:
    [one, two, three, four, five, six, siven]
    [one, two, four, three, five, six, siven]

    13. fill

    用对象o替换集合list中的所有元素

    1 public static <T> void fill(List<? super T> list,
    2                             T obj)

    示例:

    复制代码
    1 public class Practice {
    2   public static void main(String[] args){
    3     List m = Arrays.asList("one two three four five six siven".split(" "));
    4     System.out.println(m);
    5     Collections.fill(m, "haha52T25xixi");
    6     System.out.println(m);
    7   }
    8 }
    复制代码

    运行结果为:
    [one, two, three, four, five, six, siven]
    [haha52T25xixi, haha52T25xixi, haha52T25xixi, haha52T25xixi, haha52T25xixi, haha52T25xixi, haha52T25xixi]

    14. nCopies

    返回大小为n的List,List不可改变,其中的所有引用都指向o

    1 public static <T> List<T> nCopies(int n,
    2                                   T o)

    示例:

    1 public class Practice {
    2   public static void main(String[] args){
    3     System.out.println(Collections.nCopies(5, "haha"));
    4   }
    5 }

    运行结果为:
    [haha, haha, haha, haha, haha]

  • 相关阅读:
    CS Academy Round #65 Count Arrays (DP)
    Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)
    Codeforces 915F Imbalance Value of a Tree(并查集)
    HDU 4866 Shooting (主席树)
    玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)
    Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)
    第十三届北航程序设计竞赛决赛网络同步赛 B题 校赛签到(建树 + 打标记)
    TopCoder SRM 722 Div1 Problem 600 DominoTiling(简单插头DP)
    Codeforces 901C Bipartite Segments(Tarjan + 二分)
    supervisor安装与使用
  • 原文地址:https://www.cnblogs.com/feiwu666-888/p/11275032.html
Copyright © 2011-2022 走看看