叨逼叨两句
- 不太顺利啊,真是郁闷。
- 脑袋还疼,看来昨天淋雨还是有影响。
17-7:练习:字符串去重
package com.test.demo30;
import java.util.HashSet;
import java.util.Scanner;
public class Demo39 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一行字符串");
String str = sc.nextLine();
char[] ch = str.toCharArray();
HashSet<Character> hs = new HashSet();
for (char c : ch) {
hs.add(c);
}
for (char c : hs) {
System.out.println(c); //想要打印是按集合的顺序就用LinkedHashSet
}
}
}
17-8:练习:集合去重
package com.test.demo30;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
public class Demo40 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
list.add(1);
list.add(1);
list.add(1);
list.add(1);
System.out.println("去重前");
System.out.println(list);
getSingle(list);
System.out.println("去重后");
System.out.println(list);
}
public static <T> void getSingle(List<T> list){
LinkedHashSet<T> lhs = new LinkedHashSet<>();
lhs.addAll(list);
list.clear();
list.addAll(lhs);
}
}
17-(9-19):TreeSet
TreeSet概述
- 既可以保证元素唯一,又可以给元素排序
package com.test.demo30;
import java.util.TreeSet;
public class Demo41 {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(3);
ts.add(3);
ts.add(2);
ts.add(2);
ts.add(3);
ts.add(1);
ts.add(1);
ts.add(3);
System.out.println(ts);
}
}
TreeSet存储自定义对象
- 存储自定义对象,你必须先让要存的对象的类去实先Comparable<就是这个类>接口,然后重写里面的CompareTo方法,这样存储的自定义对象才能有个标准进行互相比较。
- 当compareTo方法返回0的时候,相当于相等;返回正数说明调用comparaTo方法的对象大于它比较的对象;返回负数说明调用comparaTo方法的对象小于它比较的对象。
- A.comparaTo(B)返回值为正数,说明A大于B;返回值为负数说明A小于B;返回值为0说明A等于B。
- 返回正数时集合怎么存怎么取,返回负数时则倒序排列。
-
后面的调用方法进行比较
TreeSet<Person> ts = new TreeSet<>(); ts.add(new Person("张三",23)); ts.add(new Person("张4",23)); ts.add(new Person("张5",23)); ts.add(new Person("张6",23));
public int compareTo(Person o) {
int num = this.age - o.age; //年龄是主要排序依据
return num == 0? this.name.compareTo(o.name) : num; //姓名是次要排序依据【姓名之间的比较实际上比较的是unnicode码的值】
}
二叉树
- 小的存储在左边,大的存储在右边。
- 最后从小到大排序时,从根开始,一直往上找,有左边的数就先取左边,没了再取右边的【具体见视频17-14】
TreeSet原理
- 特点:TreeSet是用来排序的,可以指定一个顺序,对象存入后会按照指定顺序排列。
-
使用方式:
-
自然顺序(Comparable)
- 用于比较的对象的类需要实现这个接口
- TreeSet类的add()方法中会把传入的对象的类型提升为Comparable类型,这就是为什么传入的对象的类没实现这个接口便会报类型转换异常错误的原因。
- 调用对象的compareTo方法和集合中的对象比较
- 根据CompareTo方法返回的结果进行存储。
-
比较器顺序(Comparator)
- 用于比较的对象的类不需要实现这个接口,但是可以在创建TreeSet时指定一个comparator比较器【一个实现了Comparator接口的子类对象】,并传给TreeSet,让TreeSet遵循其制定的比较标准。
- add()方法内部会自动调用Comparator接口中compara方法排序
- 调用对象的是compare方法的第一个参数,集合中的对象是compare方法的第二个参数。
-
两种方式的区别
- TreeSet构造函数什么都不传的话,默认按照类中的Comparable顺序(没有就报错ClassCastException)
- TreeSet如果传入Comparator就优先按照Comparator。
-
练习1:如何对集合中元素既排序又保留重复
- 创建TreeSet集合对象,因为String本身具备比较功能,但重复不会保留,所以我们用比较器。
- 将List集合中所有元素添加到TreeSet集合中,对其排序,保留重复
package com.test.demo30;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
public class Demo42 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("c");
list.add("b");
list.add("a3");
list.add("a3");
list.add("c3");
list.add("c2");
list.add("c2");
list.add("a7");
list.add("a5555");
list.add("a777");
list.add("a777");
list.add("a777");
list.add("a7");
System.out.println(list);
sort(list);
System.out.println(list);
}
public static void sort(List<String> list) {
TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
public int compare(String s1,String s2){
int num = s1.compareTo(s2);
return num == 0 ? 1:num;
//TreeSet对比较器比较后返回为0的值会视为相等,就不会存入集合了,可以利用这一点存入重复的元素
}
});
ts.addAll(list);
list.clear();
list.addAll(ts);
}
}
练习2:键盘接收一个字符串,程序对其中所有字符进行排序(重复保留)
package com.test.demo30;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Demo44 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
TreeSet<Integer> ts = new TreeSet<>(new Comparator<Integer>(){
public int compare(Integer i1,Integer i2){
int num = i2.compareTo(i1);
return num == 0? 1 : num;
}
});
while(true){
System.out.println("请输入一个整数:");
String line = sc.nextLine();
if("quit".equals(line)){
break;
} else {
Integer i =Integer.parseInt(line);
ts.add(i);
}
}
for (Integer k : ts) {
System.out.println(k);
}
}
}
练习3:键盘录入学生信息,按照总分排序后输出在控制台
package com.test.demo555;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Demo444 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生成绩,格式是:姓名,语文成绩,数学成绩,英语成绩");
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>(){
public int compare(Student s1,Student s2){
int num = s2.getSum() - s1.getSum();
return num == 0? 1: num;
}
});
while(ts.size() < 5){
String line = sc.nextLine();
String[] arr = line.split(",");
int chinese = Integer.parseInt(arr[1]);
int math = Integer.parseInt(arr[2]);
int english = Integer.parseInt(arr[3]);
ts.add(new Student(arr[0],chinese,math,english));
}
System.out.println("排序后的学生信息:");
for (Student s : ts) {
System.out.println(s);
}
}
}