Set集合 去重和比较方法

来源:https://blog.csdn.net/lijock/article/details/80410202

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) {
    System.out.println(string);
}
打印结果 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) {
    System.out.println(person1);
    }
}
LinkedHashSet  有序的HashSet(按照存入集合的顺序打印)

// 去重系统类的对象时候 不用重写equals hashset方法了
public class D1fun4 {
    public static void main(String[] args) {
        HashSet 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 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);
    System.out.println(set);
    list.clear();  // 清空原有元素 放入被list去重后的元素
    list.addAll(set);
    System.out.println(list);
}
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);
System.out.println(treeSet);
输出结果自动去重排序

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));
    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 = 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{
 
}
按需求重写规则
// 重写比较规则
@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) {
        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 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 {
 
    @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) {
        HashSetset=new 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 = 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.getName());
        }
        HashSet 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 + " ");
        }
        ArrayList list = new 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 = new HashSet<>();
        set.addAll(list);
        System.out.println(set);
        list.clear();  // 清空原有元素 放入被list去重后的元素
        list.addAll(set);
        System.out.println(list);
        TreeSet 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 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));
        Iterator it=set.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();
    }
}

 

你可能感兴趣的:(Set集合 去重和比较方法)