Collections:集合框架工具类
Collections.sort();
Collections.max();
Collections.binarySerach() 的使用 以及 原理
package com.itheima.day17;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 集合框架工具类
* Collections
*
* 需求:
* 可排序 和 可放入重复元素 (这样就不能使用TreeSet TreeMap 了因为不允许保存重复元素)
*
*/
public class CollectionsDemo {
public static void main(String[] args) {
System.out.println("字符自然排序");
method();
System.out.println("====长度排序========");
method1();
System.out.println("=======max==========");
maxDemo();
System.out.println("=======binarySerach=============");
binarySearch();
}
//binarySerach 对于 有排序后的list
public static void binarySearch(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
list.add("z");
list.add("zz");
Collections.sort(list); //使用 sort先排序 然后才能使用binarySearch(binarySearch 中的集合必须是有序的)
sop(list); //[aaa, abcd, kkkk, qq, z, z, zz]
sop(Collections.binarySearch(list, "asdfsdfsda")); //-3: 首先插入: [aaa, abcd, asdfsdfsda,kkkk, qq, z, z, zz] 由于没有找到 所以返回 -2-1 =-3 :其中 -2: 表示插入点
sop(Collections.binarySearch(list, "kafd")); //-3
sop(Collections.binarySearch(list, "ks")); // -4
// 应该可以看到 上面为什么 为 -3 -4了
//使用自定义的binarySearch 对于那些默认有比较性的对象排序了的集合
sop(halfSerach(list, "ks"));
System.out.println("====默认没有比较性或者 不是所需的比较性的集合============");
//使用自定的binarySerach2 对于那些默认没有比较性 或者 不是我们所需的比较性的时候 比如: 字符串的长度排序来查找
Collections.sort(list,new StrLenComparator());
sop("字符长度排序:"+list); //字符长度排序:[z, z, qq, zz, aaa, abcd, kkkk]
sop(halfSearch(list,"aaa",new StrLenComparator())); //返回排序后的匹配到的索引
sop(halfSearch(list,"ks",new StrLenComparator()));// 字符长度排序:[z, z, qq,('ks'插入的位置) zz, aaa, abcd, kkkk]==> -2-1 ==>-3
}
//binarySerach 对于没有比较性的对象,或者 比较的方式 不是需要的比较方式
public static int halfSearch(List<String> list,String key,Comparator<String> comp){
int max,min,mid;
max=list.size()-1;
min=0;
while(min<=max){
mid=(max+min)>>1;
String str=list.get(mid);
int num=comp.compare(str, key);
if(num>0)
max=mid-1;
else if(num<0)
min=mid+1;
else
return mid;
}
return -min-1;
}
//binarySerach 的原理 折半查找 , list也必须是排序的
public static int halfSerach(List<String> list,String key){
int max,min,mid;
max=list.size()-1;
min=0;
while(min<=max){
mid=(max+min)>>1;
String str=list.get(mid);
int num=str.compareTo(key);
if(num>0){
max=mid-1;
}else if(num<0){
min=mid+1;
}else
return mid;
}
return -min-1;
}
//获取集合中最大值
public static void maxDemo(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
list.add("z");
list.add("zz");
Collections.sort(list);
sop("排序:"+list);
sop("最大:"+Collections.max(list));
sop("排序:"+list);
sop("长度最大:"+Collections.max(list,new StrLenComparator()));
}
//需求改变: 要使用字符串的长度进行排序
// 这样就不能使用 字符串默认的 CompareTo 方法了,使用自定义比较器
public static void method1(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
list.add("z");
sop(list);
Collections.sort(list,new StrLenComparator());
sop(list);
}
//需求: 对字符串进排序 sort 和 swap
public static void method(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
sop(list);
//Collections.sort(list);
//将角标1 和 2 的值互换下
Collections.swap(list, 1, 2);
sop(list);
}
//shuffle 随机排放集合中的元素 扑克牌 和 骰子 洗牌
public static void method_shuff(){
List<String> list=new ArrayList<String>();
}
public static void sop(Object obj){
System.out.println(obj);
}
}
//字符串的长度来排序
class StrLenComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
Collections.fill()
Collections.replaceAll()
Collections.reverse()
Collections.reverseOrder()
package com.itheima.day17;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
/**
* Collections的常用方法演示
*
* fill(List<? super T> list, T obj) 将集合中的所有元素 替换制定的元素
*
* 练习 .fill方法可以替换list集合中给所有元素替换成制定元素
* 将list集合中部分元素替换成制定元素
*/
class StrCompartator implements Comparator<String>{
public int compare(String s1,String s2){
return s2.compareTo(s1);
}
}
//字符串的长度来排序
class StrLenComparator1 implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if(o1.length()>o2.length())
return 1;
if(o1.length()<o2.length())
return -1;
return o1.compareTo(o2);
}
}
public class CollectionsDemo1 {
public static void main(String[] args) {
System.out.println("=====fill========");
fillDemo();
System.out.println("=====fillPart========");
method();
System.out.println("======replaceAll and Reverse========");
replaceAll();
System.out.println("======ReverseOrder========");
orderDemo();
}
//reverseOrder() 返回一个 逆向的比较器
//需求 将 字符串默认 排序方式 反转排序
public static void orderDemo(){
TreeSet<String> ts=new TreeSet<String>();
ts.add("hdsdf");
ts.add("aaa");
ts.add("kk");
ts.add("cc");
sop(ts);//[aaa, cc, hdsdf, kk]
//为了将上面的集合反转
//方法1.自定义一个比较器 然后 改变 比较顺序
TreeSet<String> ts1=new TreeSet<String>(new StrCompartator());
ts1.add("hdsdf");
ts1.add("aaa");
ts1.add("kk");
ts1.add("cc");
sop(ts1);//[kk, hdsdf, cc, aaa]
//方法2.使用 Collectins.reverseOrder();获取与当前元素比较器的 " 逆向比较器"
TreeSet<String> ts2=new TreeSet<String>(Collections.reverseOrder());
ts2.add("hdsdf");
ts2.add("aaa");
ts2.add("kk");
ts2.add("cc");
sop(ts2);//[kk, hdsdf, cc, aaa]
//练习1.将字符串按长度正向排序
TreeSet<String> ts3=new TreeSet<String>(new StrLenComparator1());
ts3.add("hdsdf");
ts3.add("aaaf");
ts3.add("kk3");
ts3.add("cc");
sop(ts3);//[cc, kk3, aaaf, hdsdf]
//练习1.将字符串按长度逆向排序
TreeSet<String> ts4=new TreeSet<String>(Collections.reverseOrder(new StrLenComparator1()));
ts4.add("hdsdf");
ts4.add("aaaf");
ts4.add("kk3");
ts4.add("cc");
sop(ts4);//[hdsdf, aaaf, kk3, cc]
}
//使用 replaceAll And Reverse
public static void replaceAll(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
sop("原集合:"+list);
Collections.replaceAll(list, "aaa", "cccc");
sop("目标集合:"+list);
Collections.reverse(list);
sop("反转集合:"+list);
}
public static void method(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
sop("原集合:"+list);
fileDemoPart(list,2,4,"pp");
sop("目标集合:"+list);
}
//替换集合中部分元素
public static void fileDemoPart(List list,int start,int end,Object dest){
List partList=list.subList(start, end);
Collections.fill(partList, dest);
}
//替换集合中所有的元素 成制定的元素
public static void fillDemo(){
List<String> list=new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("z");
list.add("kkkk");
list.add("qq");
sop(list);
Collections.fill(list, "pp");
sop(list);
}
public static void sop(Object obj){
System.out.println(obj);
}
}