Set集合
特点: 无序(没有下标) 集合中的元素不重复
HashSet
hashset具有去重功能
例: 创建一个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");
// 增强for循环
for (String string : set) {
System.out.println(string);
}
打印结果 a b d f
去重且无序(不是按照输出顺序打印)
注意: 打印对象不会自动去重 需要重写equals和hashcode方法
去重系统类的对象时不用重写
去重: 当添加到Set的对象 HashCode码不相同时 不会调用equals方法,对象直接存到Set集合中
hashset相同时 才会调用equals方法 查看是否是同一个对象(是否重复) 是---则无法存入
public static void main(String[] args) {
HashSet<Person1> hashSet = new HashSet<>();
hashSet.add(new Person1("吕布", 25));
hashSet.add(new Person1("吕布", 25));
hashSet.add(new Person1("关羽", 26));
hashSet.add(new Person1("关羽", 26));
hashSet.add(new Person1("赵云", 23));
hashSet.add(new Person1("赵云", 23));
for (Person1 person1 : hashSet) {
System.out.println(person1);
}
}
LinkedHashSet 有序的HashSet(按照存入集合的顺序打印)
// 去重系统类的对象时候 不用重写equals hashset方法了
public class D1fun4 {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
while (set.size() < 10) {
int num = (int)(Math.random()*(20-1+1)+1);
set.add(num); // 自动装箱
}
for (Integer integer : set) {
System.out.print(integer + " ");
}
}
例:
利用set集合
去除ArrayList集合中的重复元素(操作原ArrayList)
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("d");
list.add("d");
HashSet<String> set = new HashSet<>();
set.addAll(list);
System.out.println(set);
list.clear(); // 清空原有元素 放入被list去重后的元素
list.addAll(set);
System.out.println(list);
}
TreeSet
TreeSet用来排序
创建一个TreeSet 添加几个数 查看效果
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(66);
treeSet.add(66);
treeSet.add(22);
treeSet.add(77);
treeSet.add(11);
treeSet.add(11);
System.out.println(treeSet);
输出结果自动去重排序
TreeSet 存入对象
public static void main(String[] args) {
TreeSet<Person1> set = new TreeSet<>();
set.add(new Person1("张三", 24));
set.add(new Person1("王五", 26));
set.add(new Person1("刘六", 26));
set.add(new Person1("李四", 23));
set.add(new Person1("赵四", 20));
System.out.println(set);
}
打印结果异常
注意: TreeSet存入对象 打印时 需要实现Comparable接口 或者 创建比较器
写TreeSet排序规则步骤:
1.实现Comparable接口
// 实现Comparable接口
public class Person implements Comparable<Person>{
}
2.重写接口中的 comparableTo() 方法
3.编写你想要的排序规则
@Override
public int compareTo(Person o) {
int num = this.age - o.getAge();
return (num==0) ? this.name.compareTo(o.getName()):
this.age - o.getAge();
}
输出规则: 以升序输出
compareTo返回值:
返回0 只有一个元素
返回正数 打印的数据 正序输出(不会去重 需要写compareTo方法)
返回负数 打印的数据 倒序输出
public static void main(String[] args) {
TreeSet<Person1> set = new TreeSet<>();
set.add(new Person1("张三", 24));
set.add(new Person1("张三", 24));
set.add(new Person1("王五", 26));
set.add(new Person1("刘六", 26));
set.add(new Person1("李四", 23));
set.add(new Person1("赵四", 20));
System.out.println(set);
}
此时打印报错 需
实现
Comparable接口 或者 创建比较器
// 实现Comparable接口
public class Person implements Comparable<Person>{
}
按需求重写规则
// 重写比较规则
@Override
public int compareTo(Person1 o) {
int num = this.age - o.getAge();
return num == 0 ? 1 : num;
}
例:
集合中保存字符串 按字符串长度排序
使用比较器 来进行排序
在比较器中写需求的排序规则
利用TreeSet的构造方法
直接将比较器的实现类传进去
在类的外部创建比较器
// 创建比较器
class StringLength implements Comparator<String> {
// 实现比较方法 重写比较规则
@Override
public int compare(String o1, String o2) {
// 主要按长度 长度一样比较字符
int num = o1.length() - o2.length();
int c = o1.compareTo(o2);
return num == 0 ? c : num;
}
}
public class D2fun3 {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<>(new StringLength());
set.add("linaiang");
set.add("hailong");
set.add("liucong");
set.add("liyuechen");
set.add("wangxiaotie");
for (String string : set) {
System.out.println(string);
}
}
}
例:
程序启动后, 可以从键盘输入接收多个整数,
直到输入quit时结束输入.
把所有输入的整数倒序排列打印
public class D2fun6 {
public static void main(String[] args) {
System.out.println("请输入整数 输入quit结束");
Scanner scanner = new Scanner(System.in);
TreeSet<Integer> set = new TreeSet<>(new IntPrint());
while (true) {
String string = scanner.nextLine();
if (string.equals("quit")) {
break;
}
int num = Integer.parseInt(string);
set.add(num);
}
System.out.println(set);
}
}
// 创建比较器
class IntPrint implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
int num = o2 - o1;
return num == 0 ? 1 : num;
}
}
转载自原文链接, 如需删除请联系管理员。
原文链接:Set集合 去重和比较方法,转载请注明来源!