来源:https://blog.csdn.net/lijock/article/details/80410202
Set集合
特点: 无序(没有下标) 集合中的元素不重复
HashSet
hashset具有去重功能
例: 创建一个hashset 保存 f f a a b b d d
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
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
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
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
set.addAll(list);
System.out.println(set);
list.clear(); // 清空原有元素 放入被list去重后的元素
list.addAll(set);
System.out.println(list);
}
TreeSet
TreeSet用来排序
创建一个TreeSet 添加几个数 查看效果
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
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
}
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
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
}
按需求重写规则
// 重写比较规则
@Override
public int compareTo(Person1 o) {
int num = this.age - o.getAge();
return num == 0 ? 1 : num;
}
例:
集合中保存字符串 按字符串长度排序
使用比较器 来进行排序
在比较器中写需求的排序规则
利用TreeSet的构造方法
直接将比较器的实现类传进去
在类的外部创建比较器
// 创建比较器
class StringLength implements Comparator
// 实现比较方法 重写比较规则
@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
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
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
@Override
public int compare(Integer o1, Integer o2) {
int num = o2 - o1;
return num == 0 ? 1 : num;
}
}
---------------------
作者:joker-LI
来源:CSDN
原文:https://blog.csdn.net/lijock/article/details/80410202
版权声明:本文为博主原创文章,转载请附上博文链接!
package com.dasenlin.colliection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
HashSet
set.add("f");
set.add("f");
set.add("d");
set.add("d");
set.add("a");
set.add("a");
set.add("b");
set.add("b");
// 增强for循环
for (String string : set) {
System.out.println(string);
}
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.getName());
}
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 + " ");
}
ArrayList
list.add("b");
list.add("b");
list.add("a");
list.add("d");
list.add("d");
list.add("a");
list.add("c");
list.add("c");
HashSet
set.addAll(list);
System.out.println(set);
list.clear(); // 清空原有元素 放入被list去重后的元素
list.addAll(set);
System.out.println(list);
TreeSet
treeSet.add(66);
treeSet.add(66);
treeSet.add(22);
treeSet.add(77);
treeSet.add(11);
treeSet.add(11);
System.out.println(treeSet);
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));
Iterator
while(it.hasNext()){
System.out.println(it.next());
}
}
}
package com.dasenlin.colliection;
public class Person1 implements Comparable
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person1() {
}
public Person1(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person1 [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person1 o) {
int num = this.age - o.getAge();
return (num==0) ? this.name.compareTo(o.getName()):this.age - o.getAge();
}
}