Lesson_for_java_day14--java中的工具类:Collections和Arrays

Collections:

package collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
	集合框架的工具类:
		collections:
 */
public 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("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
		
		Collections.sort(list);
		System.out.println(list);//
		int index = Collections.binarySearch(list, "aa");
		System.out.println("index:" + index);
		
		int index1 = halfSearch(list,"qq");
		System.out.println("index1:" + index1);
		
		Collections.sort(list,new strLengthSort());
		System.out.println(list);
		int index2 = halfSearch2(list,"qq",new strLengthSort());
		System.out.println("index2:" + index2);
	}
	
	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;
			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> cmp){
		int max,min,mid;
		max = list.size()-1;
		min = 0;
		while(min <= max){
			mid = (max + min)>>1;
			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("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
		
		String max = Collections.max(list);//调用工具,获取最大值
		System.out.println(max);
		
		String max1 = Collections.max(list,new strLengthSort());//特点比较(按长度)获取最大值
		System.out.println(max1);	
	}
	
	
	public static void sortDemo(){
		List<String> list = new ArrayList<String>();
		list.add("abcd");
		list.add("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
			
		System.out.println(list);//无排序
		//Collections.sort(list);//调用工具,自然排序
		Collections.swap(list, 1, 2);//置换集合内两元素。
		System.out.println(list);	
		
		Collections.sort(list,new strLengthSort());//特点排序(按照字符串长度排序)
		System.out.println(list);	
	}
}

//创建比较器,按照字符串长度比较
class strLengthSort implements Comparator<String>{

	public int compare(String o1, String o2) {
		// TODO Auto-generated method stub
		if(o1.length() == o2.length())
			return o1.compareTo(o1);
		else return o1.length() - o2.length();
	}
}

package collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

/*
	课下练习:
		fill方法可以将list集合中所有元素替换成指定元素。
			将list集合中部分元素替换成指定元素
 * 
 */
public 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("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
		
		System.out.println(list);
		Collections.shuffle(list);//将集合中的元素按照随机性进行再次排列
		System.out.println(list);
	}
	
	public static void orderDemo(){
		//两种方式将集合按自然顺序的反序排序
		//TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder()/*new StrComparator()*/);
		//自定义排序方式(按长度排序),将集合按照自定义排序的反序排序
		TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new strLengthSort()));
		
		ts.add("abced");
		ts.add("aa");
		ts.add("kkk");
		ts.add("c");
		
		Iterator<String> 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("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
		
		System.out.println(list);
		Collections.replaceAll(list, "ad", "kkk");//替换
		System.out.println(list);
		
		Collections.reverse(list);//反转
		System.out.println(list);
	}
	
	public static void fillDemo(){
		List<String> list = new ArrayList<String>();
		list.add("abcd");
		list.add("ad");
		list.add("a");
		list.add("qq");
		list.add("zzz");
		list.add("dsd");
		
		System.out.println(list);
		Collections.fill(list, "qq");//将集合中元素,全部替换成指定值
		System.out.println(list);
	}

}

//自定义反序排序
class StrComparator implements Comparator<String>{
	public int compare(String s1, String s2){
		return s2.compareTo(s1);
	}
}

Arrays:

1、ArraysDemo:

package arrays;

import java.util.Arrays;
import java.util.List;

/*
	Arrays:用于操作数组的工具类。里面都是静态方法
		
	asList:将数组变成list集合
 */
public class ArraysDemo {

	public static void main(String[] args) {
		int[] arr = {2,4,5};
		System.out.println(Arrays.toString(arr));

		
		String[] a = {"abc","cc","kkkk"};
		/*
		 * 把数组变成list集合
		 * 好处:可以使用集合的思想和方法来操作数组中的元素
		 * 注意:将数组变成集合,不可以使用集合的增删方法,因为数组的长度是固定的。
		 * 		可以用:contains();get();indexOf();subList();等。。
		 * 		如果增删了,那么会发生UnsupportedOperationException(不支持操作)异常
		 */
		List<String> list = Arrays.asList(a);
		//list.add("qq");//java.lang.UnsupportedOperationException
		System.out.println(list);
		
		
		/*
		 * 如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转换成集合中的元素
		 * 如果数组中的元素都是基本数据类型,那么会将数组作为集合中的元素存在
		 */
		int[] num = {2,4,5};//数组的元素是基本数据类型
		List<int[]> li = Arrays.asList(num);//注意泛型是int[]
		System.out.println(li);
		
		Integer[] num1 = {2,4,5};//数组的元素是对象
		List<Integer> li1 = Arrays.asList(num1);//注意泛型是Integer
		System.out.println(li1);
		
	}

}

2、CollectionToArray:

package arrays;

import java.util.ArrayList;
import java.util.Arrays;

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

3、ForEachDemo:

package arrays;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
	高级for循环:
		格式:
			for(数据类型 变量名:被遍历的集合(collection)或者数组){
			}
			
		对集合进行遍历:
			只能获取元素,但是不能对集合进行操作。
			而迭代器除了遍历还可以进行remove集合中元素的动作。
			如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。
			
		传统for和高级for有什么区别?
			高级for有一个局限性。必须有被遍历的目标。
			建议:在遍历数组的时候,还是希望使用传统for。因为传统for可以定义角标。     
 */
public class ForEachDemo {
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<String>();
		al.add("abd--1");
		al.add("abd--2");
		al.add("abd--3");
		
		//1、高级for循环,用迭代的都可以用高级for循环
		for(String s :al){//简化书写
			//s = "kk";
			System.out.println(s);
		}
		System.out.println(al);
		
		/*
		Iterator<String> it = al.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		*/
		
		//2、遍历数组中元素
		int[] arr = {3,5,1};
		for(int i : arr){
			System.out.println("i:" + i);
		}
		
		
		//3、遍历集合中元素
		HashMap<Integer,String> hm = new HashMap<Integer,String>();
		hm.put(1, "a");
		hm.put(2, "b");
		hm.put(3, "c");
		
		//第一种方式:
		Set<Integer> keySet = hm.keySet();
		for(Integer i : keySet){
			System.out.println(i + "--" + hm.get(i));	
		}
		
		//第二种方式:
		//Set<Map.Entry<Integer,String>> entrySet = hm.entrySet();
		//for(Map.Entry<Integer,String> me : entrySet)
		for(Map.Entry<Integer,String> me : hm.entrySet())
		{
			System.out.println(me.getKey() + "======" + me.getValue());
		}
	}
}

4、ParamMethodDemo:

package arrays;

import java.util.Arrays;

/*
	JDK1.5版本出现的新特性:
		方法的可变参数新特性:
			注意:在使用时,可变参数一定要定义在参数列表的最后面。
		
 */
public class ParamMethodDemo {
	public static void main(String[] args) {
		//方式一:
//		show(2,3);
//		show(2,3,4);
		
		//方式二:虽然少定义了多个方法。但是每次都有定义一个数组,作为实际参数
//		int[] arr = {3,4};
//		show(arr);
//		System.out.println();
//		int[] arr1 = {3,4,5};
//		show(arr1);
		
		
		//方式三:可变参数,其实就是上一种数组参数的简写形式。不用每次都手动建立数组对象。
		//	只要将要操作的元素作为参数传递即可,隐式将这些参数封装成数组。
		show(1);
		System.out.println();
		show(1,2,3);
		System.out.println();
		show("hehehe",2,3);
	}
	
	
	//方式三:
	public static void show(int... arr){
		for(int i : arr){
			System.out.print(i + ", ");
		}
	}
	//注意:在使用时,可变参数一定要定义在参数列表的最后面。
	public static void show(String s, int... arr){
		System.out.print(s + " ");
		System.out.println(Arrays.toString(arr));
	}
	
	
	//方式二:
	/*
	public static void show(int[] arr){
		for(int i : arr){
			System.out.print(i + ", ");
		}
	}
	*/
	
	//方式一:
	/*
	public static void show(int a ,int b){
		System.out.println(a + ":" + b);
	}
	public static void show(int a ,int b, int c){
		System.out.println(a + ":" + b + ":" + c);
	}
	*/

}

5、StaticImport:

package arrays;

/*
	StaticImport:静态导入:
		当类名重名时,需要指定具体的包名。
		当方法重名时,需要指定所属的对象或者类。
 */
import java.util.Arrays;
import static java.util.Arrays.*;//导入的是Arrays这个类中的所有静态成员。
import static java.lang.System.*;//导入System类中的所有静态成员

public class StaticImport {
	public static void main(String[] args) {
		//未静态导入时的操作
		int[] arr = {3,1,5};
		Arrays.sort(arr);
		int index = Arrays.binarySearch(arr, 3);
		System.out.println(Arrays.toString(arr));
		System.out.println("Index:" + index);
		
		//静态导入后的操作
		int[] arr1 = {4,7,3,1,5};
		sort(arr1);//省略Arrays.
		int index1 = binarySearch(arr1, 3);//省略Arrays.
		System.out.println(Arrays.toString(arr1));//不能省略Arrays.因为toString重名。
		out.println("Index1:" + index1);//省略System

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值