`
Luob.
  • 浏览: 1585980 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之17天 Collections的使用 (一)

    博客分类:
  • Java
阅读更多
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);
	}
	
}

0
2
分享到:
评论

相关推荐

    21 天 学通 Java

    《21天学通Java》是一本专门为初学者设计的Java编程教材,旨在帮助读者在21天的学习周期内快速掌握Java编程基础。这不仅涵盖了Java语言的核心概念,还注重实践,让学习者通过实际操作加深理解。在这个过程中,读者将...

    Java后端面试题

    28. **获取当月最后一天**:使用`Calendar`或`LocalDate`类。 29. **格式化日期**:使用`SimpleDateFormat`或`DateTimeFormatter`类。 30. **编码转换**:使用`new String(byteArray, charsetName)`方法。 31. **...

    2014年Java最全面试题以及答案.

    27. 如何获取某个日期是当月的最后一天? 可以使用Calendar类或者LocalDate类结合withDayOfMonth方法来获取。 28. 如何格式化日期? 可以使用SimpleDateFormat类或者java.time包下的DateTimeFormatter类来格式化...

    Java企业面试题整理及答案

    可以使用 `java.time` 包下的 `MonthDay` 类或者 `Calendar` 类来判断某一天是否为当月的最后一天。 **29. 如何格式化日期?** 可以使用 `SimpleDateFormat` 类或者 `DateTimeFormatter` 类来格式化日期。 **30. ...

    Java面试宝典-经典

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

    JAVA面试题目

    要实现Comparable接口,或者在使用Collections.sort()时提供一个Comparator对象。 14. 如何将数值型字符转换为数字? 使用Integer.valueOf()或Double.valueOf()方法将字符串转换为数字。 15. 如何将数字转换为...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    java范例开发大全

    实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程...

    Java范例开发大全 (源程序)

     实例218 使用Collections类对List的排序操作 393  实例219 LinkedList的添加删除操作 395  实例220 运用Vector 397  实例221 改变Properties文件中的键值 399  第13章 多线程编程(教学视频:121分钟) ...

    java经典面试题.doc

    如何获取某个日期是当月的最后一天? 使用`Month`类的`length`方法结合`LocalDate`类的`plusMonths`和`minusDays`方法。 #### 29. 如何格式化日期? 使用`SimpleDateFormat`或`DateTimeFormatter`类。 #### 30....

    Java范例开发大全(全书源程序)

    实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 ...

    java面试题(尚学堂内部培训资源,绝对值得一看)

    如何获取某个日期是当月的最后一天? 使用`MonthDay`类或`Calendar`类的`getActualMaximum(Calendar.DAY_OF_MONTH)`方法。 #### 29. 如何格式化日期? 使用`SimpleDateFormat`或`DateTimeFormatter`类格式化日期...

    2010年Java最新笔试题大全

    18. **日期和时间处理**:Java的`java.util.Calendar`和`java.time`包提供了处理日期和时间的方法,可以用来获取前一天的当前时刻。 19. **文件读写与计数器**:Java的`FileInputStream`、`FileOutputStream`等类...

    Java面试题

    - 使用`java.time`包中的类,如`LocalDate`和`LocalDateTime`,获取前一天的日期和时间。 18. **文件读写计数器** - 可以使用`FileInputStream`或`BufferedReader`读取文件,`FileOutputStream`或`PrintWriter`...

    最新Java面试宝典pdf版

    18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...

    java范例开发大全(pdf&源码)

    实例218 使用Collections类对List的排序操作 393 实例219 LinkedList的添加删除操作 395 实例220 运用Vector 397 实例221 改变Properties文件中的键值 399 第13章 多线程编程(教学视频:121分钟) 405 13.1 多线程...

    Java面试题以及答案

    - **垃圾回收机制**:自动管理内存的一种机制,Java虚拟机会定期清理不再使用的对象占用的内存空间,以防止内存泄漏。 #### 5. 在JAVA中,如何跳出当前的多重嵌套循环? 可以使用标签化的break语句,即在最外层...

Global site tag (gtag.js) - Google Analytics