阅读 232

Set集合 去重和比较方法

Set集合 去重和比较方法

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;

}

}


————————————————

版权声明:本文为CSDN博主「joker-LI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lijock/article/details/80410202


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐