一、Set集合
特点:无序(没有下标),不重复
HashSet: 去重的功能
TreeSet: 排序的功能
例1.
创建一个HashSet
保存 f f a a b b d d
HashSet<String> set = new HashSet<>();
set.add("f");
set.add("f");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
set.add("d");
set.add("d");
// 有序:存进去的顺序,就打印什么顺序
// 迭代器遍历
// Iterator<String> iterator = set.iterator();
// while (iterator.hasNext()) {
// String next = iterator.next();
// System.out.println(next);
// }
// 增强for循环
for (String string : set) {
System.out.println(string);
}
System.out.println(set);
例2.
创建Set集合 保存6个人 两两重复
HashSet<Person> set = new HashSet<>();
set.add(new Person("刘备", 12));
set.add(new Person("刘备", 12));
set.add(new Person("曹操", 15));
set.add(new Person("曹操", 15));
set.add(new Person("孙权", 14));
set.add(new Person("孙权", 14));
// 遍历集合
for (Person person : set) {
System.out.println(person);
}
例3.
Linked 表示 有序(怎么存的 打印出来 还是那个顺序)
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("f");
set.add("f");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
set.add("d");
set.add("d");
for (String string : set) {
System.out.println(string);
}
例4.
编写一个程序,获得10个随机数,范围1~20,要求不能有重复的
有去除重复的,就用set
去重系统类的对象 不用操心那两个方法
HashSet<Integer> hashSet = new HashSet<>();
while (hashSet.size() < 1) {
int number = (int) (Math.random() * (20 - 1 + 1) + 1);
hashSet.add(number);// 自动装箱
}
System.out.println(hashSet);
例5.
利用set集合a , b, c, d
去除ArrayList集合中的重复元素(操作原ArrayList)
ArrayList 保存a a ,b b ,c c ,d d
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("b");
arrayList.add("c");
arrayList.add("c");
arrayList.add("d");
arrayList.add("d");
// 创建set集合
LinkedHashSet<String> hashSet = new LinkedHashSet<>();
hashSet.addAll(arrayList);
arrayList.addAll(hashSet);
System.out.println(arrayList);
二、TreeSet:作用是排序和去重复
例1.
创建一个TreeSet 添加几个数 查看效果
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(10);
treeSet.add(8);
treeSet.add(15);
treeSet.add(3);
treeSet.add(15);
System.out.println(treeSet);
例2.
创建一个TreeSet 添加4个人 查看效果
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("老王", 22));
set.add(new Person("老李", 32));
set.add(new Person("老赵", 42));
set.add(new Person("老张", 52));
System.out.println(set);
System.out.println((int) '赵');
System.out.println((int) '张');
System.out.println((int) '李');
System.out.println((int) '王');
例3.
集合中保存字符串 按字符串长度排序
使用比较器进行排序
在比较器中 写你的排序规则
利用TreeSet的构造方法
直接将比较器的实现类传进去
TreeSet<String> set = new TreeSet<>(new StringLengthImpl());
set.add("凤兮凤兮归");
set.add("故乡遨游四海求其凰");
set.add("时未遇兮无所将何悟今兮升斯堂");
set.add("有艳淑女在闺房室迩人遐毒我肠。(李白)");
System.out.println(set);
例4.
在一个集合ArrayList中存储了无序并且重复的字符串
要求:排序,而且还不能去除重复,用比较器,操作ArrayList
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("庆历四年春");
arrayList.add("滕子京谪守巴陵郡");
arrayList.add("越明年");
arrayList.add("政通人和百废具兴");
arrayList.add("越明年");
// 在创建TreeSet的时候创建一个比较器
TreeSet<String> treeSet = new TreeSet<>();
// 把list全部装到treeSet中
treeSet.addAll(arrayList);
// 把arrayList清空
arrayList.clear();
arrayList.addAll(treeSet);
System.out.println(arrayList);
例5.
键盘接收一个字符串, 程序对其中所有字符进行排序 要求保留重复的
System.out.println("请输入字符串:");
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
TreeSet<Character> treeSet = new TreeSet<>(new ComparatorImpl2());
for (int i = 0; i < string.length(); i++) {
treeSet.add(string.charAt(i));
}
System.out.println(treeSet);
例6.
程序启动后, 可以从键盘输入接收多个整数,
直到输入quit时结束输入.
把所有输入的整数倒序排列打印.
Scanner scanner = new Scanner(System.in);
System.out.println("请输入整数:");
String string = scanner.next();
//创建一个带比较器的treeSet
TreeSet<Integer> treeSet = new TreeSet<>(new IntImpl());
while (!string.equals("quit"))
{
int temp = Integer.parseInt(string);
treeSet.add(temp);
string = scanner.next();
例7.
键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。
System.out.println("请按照格式输入学生成绩:");
Scanner scanner = new Scanner(System.in);
TreeSet<Student> treeSet = new TreeSet<>(new studentImpl());
for(int i = 0; i<5;i++)
{
String string = scanner.next();
String[] array = new String[4];
array = string.split(",");
Student student = new Student(array[0], array[1], array[2], array[3]);
treeSet.add(student);
}
System.out.println(treeSet);
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
// 重写HashCode
// 只要创建对象 就给每一个对象分配一个HashCode码
// 当太监到set中的对象 hashCode不相同时
// 没有调用equals方法 并且对象直接存到set集合中
// 当"hashCode码相同的时候 会调用equals方法
// 来查看是否是同一个对象 是 就不存进去 反之 存进去
/*@Override
public int hashCode() {
System.out.println("hashCode 被调用了");
// 返回一个固定 让所有创建出来的Person对象
// hashCode码都一样
// 返回固定值 效率不高(equals每次都会被调用)
return this.age;
}
// 重写equals方法
@Override
public boolean equals(Object obj) {
System.out.println("equals被调用");
Person p = (Person) obj;
return this.age == p.getAge() &&
this.name.equals(p.getName());
}
*/
@Override
public int hashCode() {
// 复杂度 是为了减少hashCode码 重复
// 提高曹操时候 调用equals方法的效率
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
// 防御性判断 利用判断提交效率
if (this == obj)// 如果两个东西都在相同
return true;// 肯定是同一个东西
if (obj == null)// 传进来不是空(调用方法东西肯定不是空的)
return false;// 不是一个对象
// 判断两个东西 是否是 同一个类创建出来的对象
if (getClass() != obj.getClass())
return false;
// 向下转型
Person other = (Person) obj;
// 判断年龄
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
/*
*返回0 只一个元素
*返回整数时 :打印的数据 正序输出
*返回负数时:打印的数据 倒序输出
*
*TreeSet 二叉树
*存储规则
*比我小的数 放到我的左边(返回负数的情况)
*比我大的数 放到我的右边(返回正数的情况)
*返回的是0 就不存储
*输出规则
*以升序输出
*
*treeset在存储的时候
*只跟compareTo 方法的返回值有关
*
*TreeSet排序步骤
*1.实现接口
*/
@Override
public int compareTo(Person o) {
// 按年龄排序
// return this.age - o.getAge();
// 按姓命排序
return this.name.compareTo(o.getName());
// 主要按年龄排序 次要按姓名排
// int number = this.getAge()-o.getAge();
// return number == 0 ? this.name.compareTo(o.name) : number;
}