天天看点

Java集合框架篇-63-TreeSet集合练习题

       这篇,我们通过前面学习的TreeSet集合和比较器的知识,我们来做几个练习题。在完成练习过程中,我们重点放在问题分析这个步骤上面,只有分析的思路的正确性,才能写出正确的代码,完成编程练习题。

第一题

在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典排序)还不能去除重复的元素输出。

分析过程:

1)定义一个List集合,并存储重复的字符串元素

2)定义方法,对其排序,保留重复的元素

3)打印List集合

     大的思路和步骤就是以上三点,很明显,重点在第二个定义方法的实现过程。第一点,需要存储重复和无序的元素,所以,这个可以是ArrayList或者LinkedList,而并不可能是TreeSet,和HashSet。下面,我们再来细化分析如何定义这么一个方法,进行排序并保留重复的元素。

1)新建TreeSet集合对象,因为String本身具备比较功能,但是重复元素不会保留,所以我们需要用自定义的比较器实现

2)将list集合全部元素添加到TreeSet集合,进行排序,保留重复元素

3)清空list集合

4)将TreeSet集合中排序好的元素添加到List集合。

完整代码如下:

package treeset;

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

public class Demo5_TreeSet {

	public static void main(String[] args) {
		
		//1.定义list集合,添加重元素
		ArrayList<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("aaa");
		list.add("ccc");
		list.add("ccc");
		list.add("ffffffff");
		list.add("dddd");
		list.add("ccc");
		list.add("bbb");
		list.add("aaa");
		//2.调用方法,排序
		sort(list);
		//3.打印list
		System.out.println(list);
	}

	/*
	 *  1)新建TreeSet集合对象,因为String本身具备比较功能,但是重复元素不会保留,所以我们需要用自定义的比较器实现
		2)将list集合全部元素添加到TreeSet集合,进行排序,保留重复元素
		3)清空list集合
		4)将TreeSet集合中排序好的元素添加到List集合。
	 */
	public static void sort(List<String> list) {
		
		//1)新建TreeSet集合对象,因为String本身具备比较功能,但是重复元素不会保留,所以我们需要用自定义的比较器实现
		TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {

			@Override
			public int compare(String s1, String s2) {
				int num = s1.compareTo(s2);  // 如果两个字符串比较一样,那就保留
				return num==0 ? 1 : num; //如果等于0,返回一个非0的就可以实现重复元素存储进集合
			}
				
		});     //上面使用匿名类代码实现
		
		//2.将list集合全部元素添加到TreeSet集合,进行排序,保留重复元素
		ts.addAll(list);
		//3.list清空
		list.clear();
		//4.把排好序ts集合全部元素添加进list集合
		list.addAll(ts);
	}

}
           

运行结果:

[aaa, aaa, aaa, bbb, ccc, ccc, ccc, dddd, ffffffff]

题目2

程序启动之后,可以从键盘输入接收多个整数,直到输入quit的时结束输入,把输入过的整数倒序排序输出。

分析过程:

1)键盘输出,需要Scanner类

2)创建TreeSet集合对象,传入比较器

3)无线循环不断接收整数,遇到quit退出,键盘录入都以字符串形式接收

4)判断是quit就退出,不是就将其转换Integer并添加到集合中

5)遍历treeset集合,并打印每一个元素。

代码如下:

package treeset;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

public class Demo6_TreeSet {

	public static void main(String[] args) {
		
		//1.创建Scanner对象,键盘录入
		Scanner sc = new Scanner(System.in);
		//2创建TreeSet集合对象,传入比较器
		TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer i1, Integer i2) {
				//int num = i2 - i1; //自动拆箱,或者以下代码
				int num = i1.compareTo(i2);
				return num == 0 ? 1 : num;
			}
			
		});
		
		//3)无线循环不断接收整数,遇到quit退出,键盘录入都以字符串形式接收
		while(true) {
			String line = sc.nextLine();
			if("quit".equals(line)) {
				break;
			}
			//4)判断是quit就退出,不是就将其转换Integer并添加到集合中
			Integer i = Integer.parseInt(line);
			ts.add(i);
			
		}
		//5)遍历treeset集合,并打印每一个元素。
		for (Integer integer : ts) {
			System.out.println(integer);
		}
	}

}