这篇,我们通过前面学习的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);
}
}
}