java之17天 Collections的使用 (一)

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);
	}
	
}

你可能感兴趣的:(sort(),replaceAll(),reverseOrder(),max(),binarySerach())