20.集合

比较器

比较器,其实就是在创建TreeSet集合的时候,在构造方法中指定具体的比较方式,Comparator是一个接口,

public class TreeSetDemo {

	public static void main(String[] args) {
		//按照姓名进行排序
//		Set set = new TreeSet(new ComparatorByName());
		ComparatorByName comparatorByName = new ComparatorByName();
		Set set = new TreeSet(comparatorByName);
		set.add(new Student("小一6",21));
		set.add(new Student("小一8",21));
		set.add(new Student("小一5",25));
		set.add(new Student("小一4",18));
		set.add(new Student("小一7",20));
		for (Iterator it = set.iterator(); it.hasNext();) {
			System.out.println(	it.next());
		}
	}
}
//创建比较器
class ComparatorByName extends Object implements Comparator/*比较器*/{
	@Override
	public int compare(Object o1, Object o2) {
//		1.因为要比较的是学生对象的姓名
		Student s1 = (Student)o1;
		Student s2 = (Student)o2;
//		System.out.println(s1.getName() +"====="+s2.getName());
//		2.比较主要条件
		int temp = s1.getName().compareTo(s2.getName());
		//如果主要条件相同,则比较次要条件
		return temp==0?s1.getAge()-s2.getAge():temp;
	}
	
}

ForEach

	//增强for循环
	
/*
 *  格式:
 *  	for(元素数据类型  变量:Collection或者数组){}
 * 
 * 
 * */
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("tanzhou1");
		list.add("tanzhou2");
		list.add("tanzhou3");
		list.add("tanzhou4");
		//只能遍历元素
//		注意:新的for循环必须有被遍历的目标,只能是集合或者数组
		for(Object str : list){
			System.out.println(str);
		}
		System.out.println("================");
		int[] arr = {1,2,3};
		
		for(int x=0;x<arr.length;x++){
			System.out.println(arr[x]);
		}
		System.out.println("================");
		for(int a:arr){
			System.out.println(a);
		}
		System.out.println("================");
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
			
		}
		
	}
}

泛型的使用

public static void main(String[] args) {
		
		List<String> list = new ArrayList<String>();
//		在创建集合的时候,直接在集合上明确要存储的元素的类型
//		泛型只能定义引用数据类型
		list.add("abc");
//		list.add(1);//让编写代码的时候就报错,只要不是指定类型的对象,编译器检查会报错
//		将运行时期出的问题提前转移到了编译时期,从类转换异常变成了编译失败
//		泛型
		list.add("zzz");
//		获取字符串的长度
		for (Iterator<String> it = list.iterator(); it.hasNext();) {
//			Object obj =  it.next();
//			String str = (String)obj;//java.lang.ClassCastException
//			System.out.println(str.length());//3
			String next = it.next();
		}
		/*
		  1.安全机制
		  2.将运行时期出的问题提前转移到了编译时期
		  3.泛型技术是给编译器使用的
		  4.避免了强转
		 */
		
//		Demo<Demo> d = new Demo<Demo>();
//		d.add(1);
	}
}
//class Demo<E>{//类泛型
//	
//	public void add(int x){}
//	
//}

例:

	public static void main(String[] args) {
		//想要按照字符串的长度进行排序
		Set<String> s = new TreeSet<String>(new Comparator<String>() {
			@Override
			public int compare(String s1, String s2) {
				//强转
//				String s1 = (String)o1;
//				String s2 = (String)o2;
//				字符串的长度
				int temp = s1.length() - s2.length();
				return temp==0?s1.compareTo(s2):temp;
			}
		});
		s.add("xi");
		s.add("abcd");
		s.add("zza");
		for(Iterator<String> it = s.iterator();it.hasNext();){
			String str = it.next();
			System.out.println(str);
		}
	}
	
}

例:

	public static void main(String[] args) {
//		Tool t = new Tool();
//		t.setObj("abc");
//		jdk1.5之前,为了提高工具的扩展性,用的就是Object来进行扩展,但是这种方式虽然提高了扩展,但是容易产生类转换异常
		
//		在jdk1.5之后,就有了泛型技术,在定义的时候将不确定的类型定义成参数
		
//		
//		t.setObj(1);
//		String str = (String)t.getObj();
//		System.out.println(str);
		
//		t.setObj(1);
		Tool1_6<String> t = new Tool1_6<String>();
		t.setObj("abc");
		String str = t.getObj();
		
		
		Tool1_6<Integer> t2 = new Tool1_6<Integer>();
		t2.setObj(1);
	}
}
//工具类

//泛型类
class Tool1_6<Q>{//形式参数  Tool1_6<String> t = new Tool1_6<String>(); 
	
	private Q obj;

	public Q getObj() {
		return obj;
	}

	public void setObj(Q obj) {//Object obj = "abc";
		this.obj = obj;
	}
	
}

public static void main(String[] args) {
		Util<String> s = new Util<String>();
		s.show("abc");
		Util<Integer> i = new Util<Integer>();
//		不依赖于对象的泛型来确定方法的类型
		i.print(1);
		i.show("String");
		i.show(new Exception());
	}
	
}
class Util<W>{
	//显示
//	当方法操作的类型不确定和类上的泛型一致,可以将泛型定义在方法上
//	泛型方法
//	可以是静态方法,也可以是非静态方法
	public static <Q> void show(Q q){
		System.out.println(q);
	}
	
	//打印
//	如果方法是静态的,就不可以使用类泛型,如果需要使用泛型,那么就必须要将方法设置为泛型方法
	public /*static*/ void print(W w){
		System.out.println(w);
	}
	//泛型类中不一定所有的方法都使用泛型,一般只是这个方法操作的类型在不确定的情况下,才使用范围
	public void test(String s){
		
	}

接口定义泛型

public static void main(String[] args) {
		
		InterImpl2<String> t = new InterImpl2<String>();
		t.show("abc");
		
	}
}
//想要操作对象,但是对象不知道是什么类型
interface Inter<E>{//只有在定义的时候才会写这种形式参数泛型
	//显示
	public void show(E e);
//	public void show(String e);
}
//实现类
class InterImpl implements Inter<String>{//使用的时候传递对应的泛型参数
	@Override //重写的方法
	public void show(String e) {
		
	}
	//重载方法
	public void show(Integer e) {
		
	}
}
//实现类要操作的元素类型不确定
class InterImpl2<T> implements Inter<T>{

	@Override
	public void show(T e) {
		
		
	}
	
}


泛型中问号的作用

**
 * 泛型的高级内容:
 * 	 上限
 *   下限
 *  public TreeSet(Comparator<? super E> comparator) 
 *  public TreeSet(Collection<? extends E> c) 
 *
 */
public class GenericDemo {

	
	//coco 18 工作....---->描述对象并且封装 
	//如果有很多个对象 全部都存到集合
	
	public static void main(String[] args) {
		//存储学生对象
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("小明",18));
		list.add(new Student("小红",18));
		
		printList(list);
		
		//存储学生对象
		List<Student> list2 = new ArrayList<Student>();
		list2.add(new Student("小白",18));
		list2.add(new Student("小黑",18));
		
		printList(list2);
		
		Set<Student> set = new HashSet<Student>();
		set.add(new Student("小美",18));
		set.add(new Student("小王",18));
//		printList(set); 因为方法的参数需要是一个List集合,传入set报错
		printList(set);
		
		
		List<String> list3 = new ArrayList<String>();
		list3.add("小白");
		list3.add("小黑");
		printList(list3);
		
	}
	//打印不同list集合的迭代器
//	public static void printList(List<Student> list) {
//		for (Iterator<Student> it = list.iterator(); it.hasNext();) {
//			Student student = it.next();
//			System.out.println(student);
//		}
//	}
	//泛型:定义的时候就是形参 ,在使用的时候就是实参
//	通配符
	public static void printList(Collection<?> list) {//?代表的是实参
		for (Iterator<?> it = list.iterator(); it.hasNext();) {
			 
		}
	}

}
class Student  extends Person {
	
	public Student(String name, int age) {
		super(name,age);
	}
	public Student() {
		super();
	}
	
}
class Worker extends Person{
	
	
	public Worker(String name, int age) {
		super(name,age);
	}
	public Worker() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
}

泛型的上限

public class GenericDemo2 {

	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("小明",18));
		list.add(new Student("小红",18));
		printList(list);
		
		
		List<Worker> list2 = new ArrayList<Worker>();
		list2.add(new Worker("小明",18));
		list2.add(new Worker("小红",18));
		printList(list2);
		
		Set<Student> set = new HashSet<Student>();
		set.add(new Student("小美",18));
		set.add(new Student("小王",18));
		printList(set);
		
	}
//	需求:除了学生就是工人
//	上限: <? extends E> :可以接收E类型或者E的子类型 
//	下限:<? super E>:可以接收E类型或者E的父类型
	public static void printList(Collection<? extends Person> list) {
		for (Iterator<? extends Person> it = list.iterator(); it.hasNext();) {
			  Person p = it.next();
			  System.out.println(p.getName());
		}
	}
}

上限在Java中的定义

public class Person implements  Comparable<Person>{
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return getClass()+" [name=" + name + ", age=" + age + "]";
	}

	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int compareTo(Person o) {
		int temp = this.age - o.age;
		return temp==0?this.name.compareTo(o.name):temp;
	}
	
}

public class GenericDemo3 {

	public static void main(String[] args) {
		Collection<Student> p = new ArrayList<Student>();
		p.add(new Student("小红1",21));
		p.add(new Student("小红2",20));
	
//		把p集合添加到set集合中
		TreeSet<Person> set = new TreeSet<Person>(p);
		set.add(new Person("小红3",19));
		//student 继承 person 里面的所有方法都可以被继承 
/*
 * 模拟
 * class TreeSet<E>{
 * 
 * 	  public TreeSet(Collection<? extends Person> c){}
 * 
 * }
 * 
 * 
 * 
 * */		
		
		for (Iterator<Person> it = set.iterator(); it.hasNext();) {
			Person person = it.next();
			System.out.println(person);
		}
	}
}

泛型的下限

public static void main(String[] args) {

		TreeSet<Student> set = new TreeSet<Student>(new ComparatorByWorkerName());
		set.add(new Student("小红1",19));
		set.add(new Student("小红3",0));
		set.add(new Student("小红2",1));
		set.add(new Student("小红4",9));
		
		
		TreeSet<Worker> set2 = new TreeSet<Worker>(new ComparatorByWorkerName());
		set2.add(new Worker("小红1",19));
		set2.add(new Worker("小红3",0));
		set2.add(new Worker("小红2",1));
		set2.add(new Worker("小红4",9));
	/*
	 * class TreeSet<E>{//Student 
	 * 
	 *   public TreeSet(Comparator<? super E > c){} //Person
	 * 
	 * }
	 * 
	 * 
	 * */	
		for (Iterator<Student> it = set.iterator(); it.hasNext();) {
			Student person = it.next();
			System.out.println(person);
		}
	}
}

//class ComparatorByName implements Comparator<Student>{
按照姓名进行排序
//	@Override
//	public int compare(Student o1, Student o2) {
//		int temp = o1.getName().compareTo(o2.getName());
//		return temp==0?o1.getAge()-o2.getAge():temp;
//	}
//	
//	
//}
//都是比较器,并且都是比较姓名。只是类型不同
// Student和Worker虽然是不同的类型,但是他们有共性,就是Person
class ComparatorByWorkerName implements Comparator<Person>{
	//按照姓名进行排序
		@Override
		public int compare(Person o1, Person o2) {//Person o1 = new Student("小红4",9)
//			Person o1 = new Worker("小红1",19);o1.getName();
			int temp = o1.getName().compareTo(o2.getName());
			return temp==0?o1.getAge()-o2.getAge():temp;
		}
		
		
	}

集合和数组的工具类

//是用操作集合的工具类,这里面方法都是静态的,直接由类名调用
	public static void main(String[] args) {
		//获取最值
//		Collection<String> c = new ArrayList<String>();
		List<String> c = new ArrayList<String>();
		c.add("abc");
		c.add("coco");
		c.add("zz");
		c.add("tanzhou");
		
		
		String max = Collections.max(c);
		System.out.println(max);
		
		String min = Collections.min(c);
		System.out.println(min);
//		对list集合进行排序
//		Collections.sort(c);
//		System.out.println(c);
//	不想按照默认的方式排序
		Collections.sort(c, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				int temp = o2.length()-o1.length();
				return temp==0?o2.compareTo(o1):temp;
			}
		});
//		打印
		System.out.println(c);
	}
}

数组的工具类


/**
 * 数组的工具类
 * @author xq
 *
 *
 */
public class ArraysTool {

	public static void main(String[] args) {
		Integer[] arr = {12,55,11,8,59};
//		排序:冒泡或者选择
		
//		快速排序
		Arrays.sort(arr);//默认是从小到大排
		//遍历
//		for (int i = 0; i < arr.length; i++) {
//			System.out.println(arr[i]);
//		}
		Arrays.sort(arr,new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				//Integer在设计的时候就实现了自然排序,重写了比较方法
				return o2.compareTo(o1);
			}
		});
//		打印
		System.out.println(Arrays.toString(arr));
		
//		数组转集合?扩展
		
//		集合转数组?限制

		
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值