Set集合-JAVA成长之路

Set集合

特点: 无序(没有下标) 集合中的元素不重复

HashSet

hashset具有去重功能

例: 创建一个hashset 保存 f f a a b b d d

HashSet 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) {

}

打印结果 a b d f

去重且无序(不是按照输出顺序打印)

注意: 打印对象不会自动去重 需要重写equals和hashcode方法

去重系统类的对象时不用重写

去重: 当添加到Set的对象 HashCode码不相同时 不会调用equals方法,对象直接存到Set集合中

hashset相同时 才会调用equals方法 查看是否是同一个对象(是否重复) 是---则无法存入

public static void main(String[] args) {

HashSet

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) {

}

}

LinkedHashSet 有序的HashSet(按照存入集合的顺序打印)

// 去重系统类的对象时候 不用重写equals hashset方法了

public class D1fun4 {

public static void main(String[] args) {

HashSet set = new HashSet();

while (set.size()

int num = (int)(Math.random()*(20-1+1)+1);

set.add(num); // 自动装箱

}

for (Integer integer : set) {

}

}

例:

利用set集合

去除ArrayList集合中的重复元素(操作原ArrayList)

public static void main(String[] args) {

ArrayList 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 set = new HashSet();

set.addAll(list);

list.clear(); // 清空原有元素 放入被list去重后的元素

list.addAll(set);

}

TreeSet

TreeSet用来排序

创建一个TreeSet 添加几个数 查看效果

TreeSet treeSet = new TreeSet();

treeSet.add(66);

treeSet.add(66);

treeSet.add(22);

treeSet.add(77);

treeSet.add(11);

treeSet.add(11);

输出结果自动去重排序

TreeSet 存入对象

public static void main(String[] args) {

TreeSet

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));

}

打印结果异常

注意: 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();

this.age - o.getAge();

}

输出规则: 以升序输出

compareTo返回值:

返回0 只有一个元素

返回正数 打印的数据 正序输出(不会去重 需要写compareTo方法)

返回负数 打印的数据 倒序输出

public static void main(String[] args) {

TreeSet

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));

}

此时打印报错 需实现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 = new TreeSet(new StringLength());

set.add("linaiang");

set.add("hailong");

set.add("liucong");

set.add("liyuechen");

set.add("wangxiaotie");

for (String string : set) {

}

}

}

例:

程序启动后, 可以从键盘输入接收多个整数,

直到输入quit时结束输入.

把所有输入的整数倒序排列打印

public class D2fun6 {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

TreeSet set = new TreeSet(new IntPrint());

while (true) {

String string = scanner.nextLine();

if (string.equals("quit")) {

break;

}

int num = Integer.parseInt(string);

set.add(num);

}

}

}

// 创建比较器

class IntPrint implements Comparator {

@Override

public int compare(Integer o1, Integer o2) {

int num = o2 - o1;

return num == 0 ? 1 : num;

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200520A0D64H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券