学习任务:

视频学习

Comparator测试

基本类型排序测试

下边分别实现Comparator接口测试排序效果:

1)编写一个排序方法保留集合元素的原始位置。

2)编写一个排序方法交换集合元素的原始位置。

package com.pbteach.javase.oop.arraylist.test2;

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

/**
 * Comparator测试
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class ArrayListSortTest1 {
	
	//顺序不变
	public static void testSort1() {
		System.out.println("=========排序测试 顺序不变==========");
		//创建一个ArrayList集合
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(5);
		list.add(13);
		list.add(6);
		list.add(5);
		list.add(20);
		
		list.sort(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return 1;
			}
			
		});
		
		list.forEach(System.out::println);
		
	}
	
	//交换位置
	public static void testSort2() {
		System.out.println("=========排序测试 交换位置==========");
		//创建一个ArrayList集合
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(5);
		list.add(13);
		list.add(6);
		list.add(5);
		list.add(20);
//		list.sort(new Comparator<Integer>() {
//			@Override
//			public int compare(Integer o1, Integer o2) {
//				return -1;
//			}
//
//		});
		//使用Lambda
		list.sort((o1,o2)->-1);
		
		list.forEach(System.out::println);
		
	}
	
	public static void main(String[] args) {
		testSort1();
		testSort2();
	}

}

输出:

=========排序测试 顺序不变==========
10
5
13
6
5
20
=========排序测试 交换位置==========
20
5
6
13
5
10

testSort1()方法中向list.sort方法传入Comparator的匿名内部类,其中compare方法固定返回1,1大于0表示保留元素原始位置不变,输出结果还是原来集合的元素顺序。

testSort2()方法中向list.sort方法传入Lambda,compare方法固定返回-1,-1小于0表示交换元素原始位置,输出结果是集合原来元素的倒序。

通过测试Comparator接口我们掌握了compare方法返回值的特点,在实际使用时需要比较两个数的大小决定返回值的大小。

假设集合的元素为:10、5、13、6、5、20

第一次将5传给compare方法的o1,将10传给compare方法的o2

第二次将13传给compare方法的o1,将5传给compare方法的o2

...

总是将后一个数传给o1,可以比较o1和前一个数o2的大小,通过返回值决定是升序还是降序:

1)升序排序

如果o1大于o2表示后一个数大于前一个数,正好符合升序顺序,此时返回大于0的数。

如果o1小于o2表示后一个数小于前一个数,此时需要交换顺序,需要返回小于0的数。

如果o1等于o2则返回0。

2)降序排序

如果o1大于o2表示后一个数大于前一个数,不符合降序顺序,需要交换位置,此时返回小于0的数。

如果o1小于o2表示后一个数小于前一个数,正好符合降序顺序,此时返回大于0的数。

如果o1等于o2则返回0。

代码如下:

package com.pbteach.javase.oop.arraylist.test2;

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

/**
 * Comparator测试
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class ArrayListSortTest2 {
	
	//升序
	public static void testSort1() {
		System.out.println("=========升序测试==========");
		//创建一个ArrayList集合
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(5);
		list.add(13);
		list.add(6);
		list.add(5);
		list.add(20);
		
		list.sort((o1,o2)->{
			if(o1>o2) {
				return 1;
			}else if(o1<o2) {
				return -1;
			}else {
				return 0;
			}
		});
		
		list.forEach(System.out::println);
		
	}
	
	//降序
	public static void testSort2() {
		System.out.println("========= 降序测试 ==========");
		//创建一个ArrayList集合
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(5);
		list.add(13);
		list.add(6);
		list.add(5);
		list.add(20);
		
		list.sort((o1,o2)->{
			if(o1>o2) {
				return -1;
			}else if(o1<o2) {
				return 1;
			}else {
				return 0;
			}
		});
		
		list.forEach(System.out::println);
		
	}
	
	public static void main(String[] args) {
		testSort1();
		testSort2();
	}

}

输出:

=========升序测试==========
5
5
6
10
13
20
========= 降序测试 ==========
20
13
10
6
5
5
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题