删除Java中的重复对象

Mik*_*ike 0 java hashcode

我的User对象如下所示:

User.java:

    public class User {
        public String firstName;
        public String lastName;

        public String getFirstName() {
            return firstName;
        }   
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @Override
        public int hashCode() {
            return (this.firstName.hashCode() + this.lastName.hashCode());
        }

        @Override
        public boolean equals(Object obj) {
            if(obj instanceof User) {
                User temp = (User) obj;
                if(this.firstName.equals(temp.firstName) && this.lastName.equals(temp.lastName)) {
                    return true;
                }
            }
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

主程序如下所示:

    import java.util.*; 

    class pp {
        public static void main(String[] args) {
            List<User[]> a = new ArrayList<User[]>();
            User[] u = new User[3];

            u[0] = new User();
            u[0].setFirstName("Mike"); u[0].setLastName("Jordon");      

            u[1] = new User();
            u[1].setFirstName("Jack"); u[1].setLastName("Nicolson");

            u[2] = new User();
            u[2].setFirstName("Jack"); u[2].setLastName("Nicolson");

            a.add(u);

            Set<User[]> s = new HashSet<User[]>(a);

            for (User[] ss : s) {
                for (int i=0; i<ss.length; i++) {           
                    System.out.println(ss[i].getFirstName() + " " + ss[i].getLastName());
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我期待输出

Mike Jordon
Jack Nicolson
Run Code Online (Sandbox Code Playgroud)

但不知何故,它保留了重复的对象并打印为:

Mike Jordon
Jack Nicolson
Jack Nicolson
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我错过了什么?

谢谢!

Jas*_*son 6

你的equals方法应该是这样的:

  @Override
    public boolean equals(Object obj) {
        if(obj instanceof User) {
            User temp = (User) obj;
            if(this.firstName.equals(temp.firstName) && this.lastName.equals(temp.lastName)) {
                return true;
            }
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

我已经完成了你的问题并理解了这个要求.请查找我已实现的类似代码,并成功从具有重复值的集合中删除对象.

@Snipet...

Employee.java
==============

package com.hcl;

public class Employee {

    public String empid;
    public String empname;
    public double sal;
    public int age;

    public Employee(){

    }

    public Employee(String empid,String empname,double sal,int age){

        this.empid = empid;
        this.empname = empname;
        this.sal = sal;
        this.age = age;
    }

    public String getEmpid() {
        return empid;
    }
    public void setEmpid(String empid) {
        this.empid = empid;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
    public double getSal() {
        return sal;
    }
    public void setSal(double sal) {
        this.sal = sal;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * This override method playes a major role to remove duplicate values
     */
    @Override
    public int hashCode() {
        return (this.empid.hashCode() + this.empname.hashCode()+String.valueOf(this.sal).hashCode()+String.valueOf(this.age).hashCode());
    }

    /**
     * This override method plays a major role to remove duplicate values
     */
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Employee) {
            Employee temp = (Employee) obj;

            if(this.empid.equals(temp.empid) && this.empname.equals(temp.empname) && String.valueOf(this.sal).equals(String.valueOf(temp.sal)) && String.valueOf(this.age).equals(String.valueOf(temp.age))) {
                return true;
            }
        }
        return false;
    }

}

@Snipet..........
RemoveDuplicateObjects.java
=============================
package com.hcl;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class RemoveDuplicateObjects {


    public static void main(String[] args) {

        Employee emp1 = new Employee("1","bapi",1000,31);
        Employee emp2 = new Employee("2","mano",2000,29);
        Employee emp3 = new Employee("1","bapi",1000,31); // emp3 == emp1 duplicate object
        Employee emp4 = new Employee("3","Rohan",3000,27);
        Employee emp5 = new Employee("1","bapi",1000,31); // emp5 == emp3 == emp1 duplicate object

        RemoveDuplicateObjects obj = new RemoveDuplicateObjects();

        // empList contains objects having duplicate values. How to remove duplicate? 
        List<Employee> empList = new ArrayList<Employee>();
        empList.add(emp1);
        empList.add(emp2);
        empList.add(emp3);
        empList.add(emp4);
        empList.add(emp5);

        if(emp1.equals(emp2)){

            System.out.println("emp1 and emp2 are equal");
        }

        if(emp1.equals(emp3)){
            System.out.println("emp1 and emp3 are equal");
        }
        obj.removeDuplicate(empList);

    }

    // method is used for removing objects having duplicate values
    private void removeDuplicate(List<Employee> empList) {


        Set<Employee> empSet = new HashSet<Employee>();
        empSet.addAll(empList);

        for(Employee e: empSet){

            System.out.println("id = "+e.getEmpid());
            System.out.println("name = "+e.getEmpname());
            System.out.println("sal = "+e.getSal());
            System.out.println("age = "+e.getAge());
        }

    }

}

Done! Now you can run the program and analyze the solution.
Run Code Online (Sandbox Code Playgroud)