欢迎访问宙启技术站
智能推送

HashSet去重函数

发布时间:2023-06-13 21:14:43

HashSet是Java中常用的无序、不重复的集合类。它底层是通过HashMap实现的,并且对于相同的元素,只会存储一次。因此,HashSet可以很好地帮助我们实现去重功能。

HashSet有两种构造方法:

- HashSet():创建一个空HashSet。

- HashSet(Collection c):创建一个包含指定集合中的元素的HashSet。

在我们使用HashSet时,需要先创建一个HashSet对象,然后调用其add()方法添加元素。当我们添加元素时,HashSet会自动判断该元素是否已经存在于集合中。如果不存在,则将其添加到集合中,如果已经存在,则不进行任何操作。

下面是一个使用HashSet去重的示例:

import java.util.HashSet;

public class RemoveDuplicateElements {

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 5, 4, 3, 2, 1};

        HashSet<Integer> set = new HashSet<>();

        for (int i : arr) {
            set.add(i);
        }

        System.out.println(set); // 输出 [1, 2, 3, 4, 5]
    }
}

在上面的代码中,我们定义了一个整型数组arr,该数组包含重复元素。然后创建了一个HashSet对象set,并使用for-each循环依次将arr中的元素添加到set中。由于HashSet会自动去重,因此最终输出的set集合中不会包含重复元素。

当然,在实际开发中,我们可能会遇到更加复杂的数据结构,例如对象、数组、集合等。对于这些复杂的数据结构,我们可以编写相应的去重函数。

下面是一个去重数组中自定义对象的示例:

import java.util.Arrays;
import java.util.HashSet;

public class RemoveDuplicateObjects {

    public static void main(String[] args) {
        Person[] people = {
                new Person("张三", 18),
                new Person("李四", 20),
                new Person("王五", 18),
                new Person("张三", 18),
                new Person("李四", 20)
        };

        Person[] distinctPeople = removeDuplicateObjects(people);

        System.out.println(Arrays.toString(distinctPeople)); // 输出 [Person{name='张三', age=18}, Person{name='李四', age=20}, Person{name='王五', age=18}]
    }

    public static Person[] removeDuplicateObjects(Person[] arr) {
        HashSet<Person> set = new HashSet<>();

        for (Person p : arr) {
            set.add(p);
        }

        return set.toArray(new Person[0]);
    }

    static class Person {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
}

在上面的代码中,我们定义了一个Person类,该类包含name和age两个属性。然后创建一个Person类型的数组people,并包含重复元素。我们根据重写的equals()和hashCode()方法来判断是否相等。对于类中的每个对象,我们将其添加到HashSet集合set中,最终使用set的toArray()方法将所有去重后的元素转换为一个数组并返回。

当然,除了使用HashSet外,我们还可以使用其他数据结构来实现去重,例如使用TreeSet来自动排序去重,使用HashMap来快速定位去重等等。不同的数据结构可以针对不同的需求实现相应的去重功能。

总之,使用HashSet去重可以很好地帮助我们实现去重功能,并且HashSet还提供了丰富的API来帮助我们进行相关操作。在编写去重函数时,我们需要根据实际需求选择适合的数据结构,并结合具体场景进行优化,从而实现更好的性能和效率。