一、集合的排序

1.1 集合的排序

集合的工具类java.util.Collections提供了一个静态方法sort,可以对List集合

  • 进行自然排序,即:从小到大
  • 除了自然排序之外还有反转、乱序方法
List<Integer>list = new ArrayList<>();
		
		Random random = new Random();
		for(int i =0;i<10;i++){
			list.add(random.nextInt(100));
		}
		System.out.println(list);
		//对集合进行排序,使其中的元素从小到大排列
		Collections.sort(list);
		System.out.println(list);
		//反转集合,如果是排序后的集合,则变为从大到小
		Collections.reverse(list);
		System.out.println(list);
		//乱序操作,打乱集合
		Collections.shuffle(list);
		System.out.println(list);

1.2 排序自定义元素的集合

sort方法要求集合必须实现Comparable,否则编译不通过。
当我们调用某一个API时,该API要求我名为其修改其他额外的代码时,这样的操作称为侵入性
修改的代码越多,侵入性越强。侵入性不利于系统框架的健康,不利于程序的维护,应当尽量避免。
此时可以应对一个lambda重构一个匿名内部类

List<Point>list = new ArrayList<>();
		list.add(new Point(1,2));
		list.add(new Point(9,5));
		list.add(new Point(4,6));
		list.add(new Point(8,3));
		System.out.println(list);
		/*
		 * 该sort方法要求集合必须实现Comparable,否则编译不通过
		 * 当我们调用某一个API时,该API要求我名为其修改其他额外的代码时,
		 * 这样的操作称为侵入性。修改的代码越多,侵入性越强。侵入性不利于
		 * 系统框架的健康,不利于程序的维护,应当尽量避免。
		 */
		 //		Collections.sort(list,new Comparator<Point>(){
//			public int compare(Point o1,Point o2){
//				int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//				int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//				return len1-len2;
//			}
//		});
//		Collections.sort(list,(o1,o2)->{
//				int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//				int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//				return len1-len2;
//		});
		Collections.sort(list,(o1,o2)->
			o1.getX()*o1.getX()+o1.getY()*o1.getY()-
			o2.getX()*o2.getX()-o2.getY()*o2.getY()
			);
		System.out.println(list);

1.3 排序字符串

String本身实现了Comparable接口,比较规这为按照字符的Unicode编码的大小对比,先看首字符,如果一样再看第二个字符。对于中文而言,几乎没有规律可言

List<String>list = new ArrayList<>();
		list.add("jack");
		list.add("rose");
		list.add("tom");
		list.add("woold");
		list.add("jomes");
		System.out.println(list);
		/*
		 * String本身实现了Comparable接口,比较规这为按照字符的Unicode编码的
		 * 大小对比,先看首字符,如果一样再看第二个字符。
		 * 对于中文而言,几乎没有规律可言
		 */
//		Collections.sort(list);
		/*
		 * 自定义一个比较器,比较规则为按照字符多少排序,字少的在前,字多的在后
		 */
		Collections.sort(list,(l1,l2)->
		l1.length()-l2.length()
				);
		System.out.println(list);

二、队列

2.1 单端队列

队列是经典的数据结构,可以保存一组元素,但是存取元素必须遵循先进先出原则
java.util.Queue接口,队列接口,继承自Collection。
常用实现类:java.util.LinkedList

2.2 双端队列

java.util.Deque 接口 双端队列。Deque接口继承自Queue接口。双端队列的
特点是队列的两端都可以进行入队操作。
实现类:java.util.LinkedList

三、栈结构

栈结构,栈是数据经典的结构之一,可以保存一组元素,但是存取元素必须遵循先进后出原则

  • 使用栈一般是为了实现:后退、前进这样的功能
Deque<String> stack = new LinkedList<>();
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		System.out.println(stack);
		
		String str = stack.pop();
		System.out.println(str);
		System.out.println(stack);
练习
/*5*/
		List<Integer>l5 = new ArrayList<>();
		Random r5 = new Random();
		for(int i=0;i<10;i++){
			l5.add(r5.nextInt(100));
		}
		System.out.println(l5);
		Collections.sort(l5);
		System.out.println(l5);
		Collections.reverse(l5);
		System.out.println(l5);
		Collections.shuffle(l5);
		System.out.println(l5);
		/*4*/
		List<Integer>l4 = new ArrayList<>();
		Random r4 = new Random();
		for(int i=0;i<10;i++){
			l4.add(r4.nextInt(100));
		}
		System.out.println(l4);
		Collections.sort(l4);
		System.out.println(l4);
		Collections.reverse(l4);
		System.out.println(l4);
		Collections.shuffle(l4);
		System.out.println(l4);
		/*3*/
		List<Integer>l3 = new ArrayList<>();
		Random r3 = new Random();
		for(int i=0;i<10;i++){
			l3.add(r3.nextInt(100));
		}
		System.out.println(l3);
		Collections.sort(l3);
		System.out.println(l3);
		Collections.reverse(l3);
		System.out.println(l3);
		Collections.shuffle(l3);
		System.out.println(l3);
		/*2*/
		List<Integer>l2 = new ArrayList<>();
		Random r2 = new Random();
		for(int i=0;i<10;i++){
			l2.add(r2.nextInt(100));
		}
		System.out.println(l2);
		Collections.sort(l2);
		System.out.println(l2);
		Collections.reverse(l2);
		System.out.println(l2);
		Collections.shuffle(l2);
		System.out.println(l2);
		/*1*/
		List<Integer>l1 = new ArrayList<>();
		Random r1 = new Random();
		for(int i=0;i<10;i++){
			l1.add(r1.nextInt(100));
		}
		System.out.println(l1);
		Collections.sort(l1);
		System.out.println(l1);
		Collections.reverse(l1);
		System.out.println(l1);
		Collections.shuffle(l1);
		System.out.println(l1);
/*5*/
		List<Point>l5 = new ArrayList<>();
		l5.add(new Point(1,2));
		l5.add(new Point(9,5));
		l5.add(new Point(4,6));
		l5.add(new Point(8,3));
		System.out.println(l5);
		Collections.sort(l5,(o1,o2)->
		o1.getX()*o1.getX()+o1.getY()*o1.getY()-
		o2.getX()*o2.getX()-o2.getY()*o2.getY()
		);
		System.out.println(l5);
		/*4*/
		List<Point>l4 = new ArrayList<>();
		l4.add(new Point(1,2));
		l4.add(new Point(3,7));
		l4.add(new Point(5,23));
		l4.add(new Point(6,2));
		l4.add(new Point(2,3));
		System.out.println(l4);
		Collections.sort(l4,(o1,o2)->
		o1.getX()*o1.getX()+o1.getY()*o1.getY()-
		o2.getX()*o2.getX()-o2.getY()*o2.getY()
				);
		System.out.println(l4);
		/*3*/
		List<Point>l3 = new ArrayList<>();
		l3.add(new Point(2,4));
		l3.add(new Point(4,7));
		l3.add(new Point(6,9));
		l3.add(new Point(2,6));
		System.out.println(l3);
		Collections.sort((l3),(o1,o2)->
		o1.getX()*o1.getX()+o1.getY()*o1.getY()-
		o2.getX()*o2.getX()-o2.getY()*o2.getY()
		);
		System.out.println(l3);
		/*2*/
		List<Point>l2 = new ArrayList<>();
		l2.add(new Point(1,3));
		l2.add(new Point(5,33));
		l2.add(new Point(55,5));
		l2.add(new Point(1,7));
		System.out.println(l2);
		Collections.sort(l2,(o1,o2)->
		o1.getX()*o1.getX()+o1.getY()*o1.getY()-
		o2.getX()*o2.getX()-o2.getY()*o2.getY()	
				);
		System.out.println(l2);
		/*1*/
		List<Point>l1 = new ArrayList<>();
		l1.add(new Point(1,3));
		l1.add(new Point(5,13));
		l1.add(new Point(15,6));
		l1.add(new Point(8,7));
		System.out.println(l1);
		Collections.sort(l1,(o1,o2)->
		o1.getX()*o1.getX()+o1.getY()*o1.getY()-
		o2.getX()*o2.getX()-o2.getY()*o2.getY()	
				);
		System.out.println(l1);
/*5*/
		Queue<String> q5 = new LinkedList<>();
		q5.offer("1");
		q5.offer("2");
		System.out.println(q5);
		String s5 = q5.poll();
		System.out.println(s5);
		System.out.println(q5);
		s5 = q5.peek();
		System.out.println(s5);
		System.out.println(q5);
		/*4*/
		Queue<String>q4 = new LinkedList<>();
		q4.offer("1");
		q4.offer("#");
		System.out.println(q4);
		String s4 = q4.poll();
		System.out.println(s4);
		System.out.println(q4);
		s4 = q4.peek();
		System.out.println(s4);
		System.out.println(q4);
		/*3*/
		Queue<String>q3 = new LinkedList<>();
		q3.offer("2");
		q3.offer("@");
		System.out.println(q3);
		String s3 = q3.poll();
		System.out.println(s3);
		System.out.println(q3);
		s3 = q3.peek();
		System.out.println(s3);
		System.out.println(q3);
		/*2*/
		Queue<String>q2 = new LinkedList<>();
		q2.offer("1");
		q2.offer("@");
		System.out.println(q2);
		String s2 = q2.poll();
		System.out.println(s2);
		System.out.println(q2);
		s2 = q2.peek();
		System.out.println(s2);
		System.out.println(q2);
		/*1*/
		Queue<String>q1 = new LinkedList<>();
		q1.offer("1");
		q1.offer("@");
		System.out.println(q1);
		String s1 = q1.poll();
		System.out.println(s1);
		System.out.println(q1);
		s1 = q1.peek();
		System.out.println(s1);
		System.out.println(q1);
/*5*/
		Deque<String> d5 = new LinkedList<>();
		d5.offer("one");
		System.out.println(d5);
		d5.offerFirst("four");
		System.out.println(d5);
		d5.offerLast("five");
		System.out.println(d5);
		String s5 = d5.poll();
		System.out.println(s5);
		System.out.println(d5);
		/*4*/
		Deque<String>d4 = new LinkedList<>();
		d4.offer("1");
		System.out.println(d4);
		d4.offerFirst("2");
		System.out.println(d4);
		d4.offerLast("3");
		System.out.println(d4);
		String s4 = d4.poll();
		System.out.println(s4);
		System.out.println(d4);
		/*3*/
		Deque<String>d3 = new LinkedList<>();
		d3.offer("1");
		System.out.println(d3);
		d3.offerFirst("#");
		System.out.println(d3);
		d3.offerLast("$");
		System.out.println();
		String s3 = d3.poll();
		System.out.println(s3);
		System.out.println(d3);
		/*2*/
		Deque<String>d2 = new LinkedList<>();
		d2.offer("@");
		System.out.println(d2);
		d2.offerFirst("W");
		System.out.println(d2);
		d2.offerLast("1");
		System.out.println(d2);
		String s2 = d2.poll();
		System.out.println(s2);
		System.out.println(d2);
		/*1*/
		Deque<String>d1 = new LinkedList<>();
		d1.offer("@");
		System.out.println(d1);
		d1.offerFirst("W");
		System.out.println(d1);
		d1.offerLast("1");
		System.out.println(d1);
		String s1 = d1.poll();
		System.out.println(s1);
		System.out.println(d1);
/*5*/
		Deque<String>s5 = new LinkedList<>();
		s5.push("1");
		s5.push("@");
		System.out.println(s5);
		String str5 = s5.pop();
		System.out.println(str5);
		System.out.println(s5);
		/*4*/
		Deque<String>s4 = new LinkedList<>();
		s4.push("Q");
		s4.push("A");
		System.out.println(s4);
		String str4 = s4.pop();
		System.out.println(str4);
		System.out.println(s4);
		/*3*/
		Deque<String>s3 = new LinkedList<>();
		s3.push("1");
		System.out.println(s3);
		String str3 = s3.pop();
		System.out.println(str3);
		System.out.println(s3);
		/*2*/
		Deque<String>s2 = new LinkedList<>();
		s3.push("2");
		System.out.println(s2);
		String str2 = s2.pop();
		System.out.println(str2);
		System.out.println(s2);
		/*1*/
		Deque<String>s1 = new LinkedList<>();
		s3.push("55");
		System.out.println(s1);
		String str1 = s1.pop();
		System.out.println(str1);
		System.out.println(s1);