工具类里封装了一些实现小功能的方法,在实现需求的时候,不需要自己去写功能,直接调用即可。
工具类是Collections 。
首先看一下API里工具类的方法大纲图。
工具类里所有的方法都是静态的。
下面将展示以下几个方法的实现原理代码
static
| sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。 |
static
| sort(List<T> list, Comparator<? super T> c) 根据指定比较器产生的顺序对指定列表进行排序。 |
static void | swap(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。 |
一、排序
package cn.itcast.p2.comparator;
import java.util.Comparator;
public class ComparatorByLength implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int temp = o1.length() - o2.length();
return temp==0?o1.compareTo(o2): temp;
}
}
package cn.itcast.p2.toolclass.collections.demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import cn.itcast.p2.comparator.ComparatorByLength;
public class CollectionsDemo {
/**
* @param args
*/
public static void main(String[] args) {
/*
* Collections:是集合框架的工具类。
* 里面的方法都是静态的。
*
*
*/
demo_4();
}
public static void demo_4() {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("zhangsan");
list.add("zhaoliu");
list.add("xiaoqiang");
System.out.println(list);
// Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");
Collections.shuffle(list);
// Collections.fill(list, "cc");
System.out.println(list);
}
public static void demo_3() {
/*
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int temp = o2.compareTo(o1);
return temp;
}
});
*/
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength()));
ts.add("abc");
ts.add("hahaha");
ts.add("zzz");
ts.add("aa");
ts.add("cba");
System.out.println(ts);
}
public static void demo_2(){
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
// Collections.sort(list);
System.out.println(list);
// int index = Collections.binarySearch(list, "cba");
// System.out.println("index="+index);
//获取最大值。
String max = Collections.max(list,new ComparatorByLength());
System.out.println("max="+max);
}
public static void demo_1(){
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("aa");
list.add("zzz");
list.add("cba");
list.add("nbaa");
System.out.println(list);
//对list集合进行指定顺序的排序。
// Collections.sort(list);
// mySort(list);
// mySort(list,new ComparatorByLength());
Collections.sort(list,new ComparatorByLength());//传入一个长度比较器。按照元素的长度进行比较排序。
System.out.println(list);
}
//Sort()方法的实现原理。
public static <T> void mySort(List<T> list,Comparator<? super T> comp){// 定义泛型<T>扩展传入类型的类型范围。
//同时也限制了传入的类型必须具备有比较方法。
for (int i = 0; i < list.size()-1; i++) {
for (int j = i+1; j < list.size(); j++) {
if(comp.compare(list.get(i), list.get(j))>0){
//swap()方法的实现原理
// T temp = list.get(i);
// list.set(i, list.get(j));
// list.set(j, temp);
Collections.swap(list, i, j);
}
}
}
}
public static <T extends Comparable<? super T>> void mySort(List<T> list){
for (int i = 0; i < list.size()-1; i++) {
for (int j = i+1; j < list.size(); j++) {
if(list.get(i).compareTo(list.get(j))>0){
// T temp = list.get(i);
// list.set(i, list.get(j));
// list.set(j, temp);
Collections.swap(list, i, j);
}
}
}
}
}
二、折半
static
| binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象。 |
折半使用二分法搜索,前提是该集合必须是有序的,所以先排序。代码在上面。
三、获取最大值
四、获取最长元素
传入一个长度比较器
五、 逆序
(一)、 首先按照自然顺序长度从小到大进行排序。
public static void demo_3() {
//逆序原理
/*
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int temp = o2.compareTo(o1);
return temp;
}
});
*/
TreeSet<String> ts = new TreeSet<String>(); //对指定的比较器进行顺序逆转
ts.add("abc");
ts.add("hahaha");
ts.add("zzz");
ts.add("aa");
ts.add("cba");
System.out.println(ts);
}
(二)、然后按照逆序排序长度从大到小
static
| reverseOrder() 返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。 |
public static void demo_3() {
//逆序原理
/*
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int temp = o2.compareTo(o1);
return temp;
}
});
*/
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder()); //对指定的比较器进行顺序逆转
ts.add("abc");
ts.add("hahaha");
ts.add("zzz");
ts.add("aa");
ts.add("cba");
System.out.println(ts);
}
(三)、将比较器的原有排序方式逆序排序
static
| reverseOrder(Comparator<T> cmp) 返回一个比较器,它强行逆转指定比较器的顺序。 |
public static void demo_3() {
//逆序原理
/*
TreeSet<String> ts = new TreeSet<String>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int temp = o2.compareTo(o1);
return temp;
}
});
*/
TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new ComparatorByLength())); //对指定的比较器进行顺序逆转
ts.add("abc");
ts.add("hahaha");
ts.add("zzz");
ts.add("aa");
ts.add("cba");
System.out.println(ts);
}
六、替换
(一)、 使用另一个值替换列表中出现的所有某一指定值。
static
| replaceAll(List<T> list, T oldVal, T newVal) 使用另一个值替换列表中出现的所有某一指定值。 |
public static void demo_4() {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("zhangsan");
list.add("zhaoliu");
list.add("xiaoqiang");
System.out.println(list);
Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");首先调用indexof查询“cba”的位置,然后把"nba"放到cba的位置
// Collections.shuffle(list);
// Collections.fill(list, "cc");
System.out.println(list);
}
(二)、 使用指定元素替换指定列表中的所有元素。
static
| fill(List<? super T> list, T obj) 使用指定元素替换指定列表中的所有元素。 |
public static void demo_4() {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("zhangsan");
list.add("zhaoliu");
list.add("xiaoqiang");
System.out.println(list);
// Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");首先调用indexof查询“cba”的位置,然后把"nba"放到cba的位置
// Collections.shuffle(list);//将集合中的元素随机安放在不同的位置上,每一次的顺序都是随机大乱斗
Collections.fill(list, "cc");//将指定集合中的元素全部替换成"cc"。
System.out.println(list);
}
(三)、 使用默认随机源对指定列表进行置换。
static void | shuffle(List<?> list) 使用默认随机源对指定列表进行置换。 |
public static void demo_4() {
List<String> list = new ArrayList<String>();
list.add("abcde");
list.add("cba");
list.add("zhangsan");
list.add("zhaoliu");
list.add("xiaoqiang");
System.out.println(list);
// Collections.replaceAll(list, "cba", "nba"); // set(indexOf("cba"),"nba");首先调用indexof查询“cba”的位置,然后把"nba"放到cba的位置
Collections.shuffle(list);//将集合中的元素随机安放在不同的位置上,每一次的顺序都是随机大乱斗
// Collections.fill(list, "cc");//将指定集合中的元素全部替换成"cc"。
System.out.println(list);
}
每一次出现的顺序都是不一样的。