package demo.assemble;
import java.util.*;
class 集合框架工具_Collections排序_自定义比较器排序 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("zfe");
list.add("af");
list.add("af");
list.add("taxa");
list.add("uzsa");
System.out.println("初始化:" + list);
Collections.sort(list);//自然排序
//Collections.sort(list, new CompareToByStringLength());//对List集合元素进行排序 比较器,根据字符串长度排序
//比较器逆转 长度反向排序(也可以在构造Tree时,传入 new CompareToByStringLength() 实现反转 )
// Collections.sort(list, Collections.reverseOrder(new CompareToByStringLength()));
//mySort(list);//自定义方法的对List集合元素进行自然排序
//mySort2(list, new CompareToByStringLength());//自定义方法的对List集合元素进行长度排序
System.out.println("已排序:" + list);
Collections.reverse(list);//反转顺序
System.out.println("已反转:" + list);
System.out.println("二分法查找指定元素下标(已排序):" + Collections.binarySearch(list, "af"));
//按什么排序,就加上对应比较器(上面的是默认自然顺序排序)
System.out.println("二分法查找指定元素下标(已排序):" + Collections.binarySearch(list, "af", new CompareToByStringLength()));
System.out.println("最大值:" + Collections.max(list));
System.out.println("最大长度:" + Collections.max(list, new CompareToByStringLength()));
System.out.println("最小值:" + Collections.min(list));
Collections.replaceAll(list, "af", "aaaaaf");//将所有的af 替换为 aaaaaf
// list.set(list.indexOf("af"), "aaaaaf");//其实是,通过多次此方法实现replaceAll()方法
System.out.println("修改元素:" + list);
Collections.shuffle(list);
System.out.println("打乱序列:" + list);
Collections.fill(list, "cc");
System.out.println("将所有元素使用指定同一元素填充:" + list);
list = Collections.synchronizedList(list);//返回一个同步的Collection,List,Map,Set
//将集合元素用枚举返回,并遍历
for (Enumeration<String> en = Collections.enumeration(list); en.hasMoreElements(); ) {
System.out.println(en.nextElement());
}
}
//自定义的对List集合元素进行排序 前提:该对象的类已实现Comparable接口
private static <T extends Comparable<? super T>> void mySort(List<T> list) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = i; j < list.size() - i - 1; j++) {
if (list.get(j).compareTo(list.get(j + 1)) > 0) {//如果前一个元素大于后一个(自然比较)
Collections.swap(list, j, j + 1);//交换list中,j和j+1位置元素
}
}
}
}
//利用比较器排序
private static <T> void mySort2(List<T> list, Comparator<? super T> comp) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = i; j < list.size() - i - 1; j++) {
if (comp.compare(list.get(j), list.get(j + 1)) > 0) {//如果前一个元素大于后一个(比较方法是看传入比较器是已上门方法进行比较的)
Collections.swap(list, j, j + 1);//交换list中,j和j+1位置元素
}
}
}
}
//比较器 根据字符串长度排序
private static class CompareToByStringLength implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length() == 0 ? o1.compareTo(o2) : o1.length() - o2.length();
}
}
}
//比较器逆转; 只要有传入比较器的位置,就可以使用比较器逆转