集合—Collections、Arrays

本文介绍了Java集合框架中Collections和Arrays工具类的多种实用方法,包括排序、查找、替换及集合与数组之间的转换等,帮助开发者高效操作集合与数组。

 

/*
集合框架的工具类:
Collections:
*/
import java.util.*;
class CollectionsDemo
{
	public static void main(String[] args)
	{
		//sortDemo();
		//maxDemo();
		binarySearchDemo();
	}
	
	public static void binarySearchDemo()//折半查找,必须是有序集合
	{
		List<String>	list = new ArrayList<String>();
		
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		list.add("qq");
		list.add("z");
		
		Collections.sort(list);//按照自然顺序排序
		sop(list);//打印
		
//		int index = Collections.binarySearch(list,"aaa");//折半查找
//		sop("index="+index);

			int index = halfSearch(list,"aaaa");
			sop("index="+index);
	}
	
	public static int halfSearch(List<String> list,String key)//折半查找原理
	{
		int max, min, mid;
		max = list.size()-1;
		min = 0;
		
		while(min<=max)
		{
			mid = (max+min)>>1;//右移,即除以2
			
			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 int halfSearch2(List<String> list,String key,Comparator<String>)//折半查找,当添加的元素不具备比较性,自定义比较器原理
	{
		int max, min, mid;
		max = list.size()-1;
		min = 0;
		
		while(min<=max)
		{
			mid = (max+min)>>1;//右移,即除以2
			
			String str = list.get(mid);
			
			int num = cmp.compare(str,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("zz");
		list.add("kkkkk");
		list.add("qq");
		list.add("z");
		
		Collections.sort(list);//按照自然顺序排序
		sop(list);//打印
		
		//String max = Collections.max(list);//取出最大元素
		//sop("max= "+max);
		
		String max = Collections.max(list,new StrLenComparator());//取出最长元素
		sop("max= "+max);
			
	}
	
	public static void sortDemo()
	{
		List<String>	list = new ArrayList<String>();
		
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		list.add("qq");
		list.add("z");
		
		sop(list);//打印原集合
		
		//Collections.sort(list);
		Collections.sort(list,new StrLenComparator());//用集合工具进行排序,自定义比较器要传入集合工具中
		
		sop(list);//打印比较后
	}
	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

class StrLenComparator implements Comparator<String>//自定义比较器
{
	public int compare(String s1, String s2)
	{
		if(s1.length()>s2.length())
			return 1;
		if(s1.length()<s2.length())
			return -1;
		return s1.compareTo(s2);	//长度相等,按照自然顺序排序
	}	
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

import java.util.*;
class StrCompatator implements Comparator<String>
{
	public int compare(String s1, String s2)
	{
		return s2.compareTo(s1);	
	}	
}
class CollectionsDemo2
{
	public static void main(String[] args)
	{
		//fillDemo();
		//replaceAllDemo();
		//orderDemo();
		shuffleDemo();
	}
	
	public static void shuffleDemo()
	{
		List<String>	list = new ArrayList<String>();

		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		
		sop(list);
		Collections.shuffle(list);对集合随机排序
		sop(list);
	}
	
	public static void orderDemo()//反转
	{
		//TreeSet<String> ts = new TreeSet<String>(new StrCompatator());
		
		TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder());

		ts.add("abcde");
		ts.add("aaa");
		ts.add("kkk");
		ts.add("ccc");
		
		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());	
		}	
	}
	
	public static void replaceAllDemo()
	{
		List<String>	list = new ArrayList<String>();
		
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		
		sop(list);
		Collections.replaceAll(list,"aaa","pp");//替换成指定元素
		Collections.reverse(list);//反转
		sop(list);
	}
	
	/*
	练习:fill方法可以将list集合中所有元素替换成指定元素。
	将list集合中部分元素替换成指定元素。
	*/
	
	public static void fillDemo()
	{
		List<String>	list = new ArrayList<String>();
		
		list.add("abcd");
		list.add("aaa");
		list.add("zz");
		list.add("kkkkk");
		
		sop(list);
		Collections.fill(list,"pp");//把集合元素全部替换成pp
		sop(list);
	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*
Arrays: 用于操作数组的工具类
里面都是静态方法。

asList: 将数组变成list集合

数组变集合
*/
import java.util.*;
class ArraysDemo
{
	public static void main(String[] args)
	{
		//int[] arr = {2,4,5};
		
		//System.out.println(Arrays.toString(arr));	
		
		/*
		把数组变成list集合有什么好处?
		可以使用集合的思想和方法来操作数组中的元素。
		
		注意:将数组变成集合,不可以使用集合的增删方法。
		因为数组的长度是固定的。
		如果增删了,就会发生UnsupportedOperationException异常
		*/
		String[] arr = {"abc","cc","kkkk"};
		List<String> list = Arrays.asList(arr);
		sop("contains: "+list.contains("cc"));//判断是否包含
		//list.add("cc");不可以增删
		
		sop(list);
		
		/*如果数组中的元素都是对象,那么变成集合时,数组中的元素
			就直接转成集合中的元素。
			如果数组中元素都是基本数据类型,那么会将该数组作为集合
			中的元素存在。
		int[] nums = {2,4,5};
		List<int[]> li = Arrays.asList(nums);
		sop(li);
		*/
		
		Integer[] nums = {2,4,5};
		List<Integer> li = Arrays.asList(nums);
		sop(li);
	}	
	public static void sop(Object obj)
	{
		System.out.println(obj);	
	}
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*
集合变数组
Colletion接口中的toArray()方法
*/
import java.util.*;
class CollectionToArray
{
	public static void main(String[] args)
	{
		ArrayList<String> al = new ArrayList<String>();
		
		al.add("abc1");
		al.add("abc2");
		al.add("abc3");
		
		/*
		1,指定类型的数组到底要定义多长呢?
		当指定类型的数组长度小于了集合的size,那么该方法
		内部会创建一个新的数组,长度为集合的size。
		当指定类型的数组长度大于集合的size,就不会新创建的
		数组。而是使用传递进来的数组。
		所以,创建一个刚刚好的数组最优。
		
		2,为什么要将集合变数组?
		为了限定对元素的操作。不需要进行增删了。
		*/
		
		String[] arr = al.toArray(new String[al.size()]);//传递刚刚好长度的数组
		System.out.println(Arrays.toString(arr));//转换成字符串输出
	}
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

个人总结:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值