0

以下に示すように、ユーザーオブジェクトを作成しました。

ユーザー.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;
        }
    }

主なプログラムは以下のとおりです。

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

私は出力が

Mike Jordon
Jack Nicolson

しかし、どういうわけか、重複オブジェクトと印刷を次のように保持します。

Mike Jordon
Jack Nicolson
Jack Nicolson

誰が私が欠けているものを教えてもらえますか??

ありがとう!

4

9 に答える 9

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;
    }
于 2012-07-23T06:26:28.707 に答える
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.
于 2013-01-13T09:34:44.767 に答える
1

これを試してみてください私の友人:

        Iterator i = a.iterator();
        while (i.hasNext()) {
            User u = (User) i.next();
            boolean match = false;
            Iterator j = a.iterator();
            boolean once = true;
            while (j.hasNext()) {                    
                if(once){j.next();} // to skip own occurence only once
                once = false;                    
                User u2 = (User) j.next();
                if (u.getFirstName().equals(u2.getFirstName())
                        && u.getLastName().equals(u2.getLastName())) {
                    match = true;
                }
            }
            if (!match) {
                // print
            }
        }
于 2012-07-23T06:44:01.990 に答える
1

私はあなたがこれを望んでいると思います:

 class pp {
        public static void main(String[] args) {
            Set<User> a = new HashSet<User>();

        User u = new User();
        u.setFirstName("Mike"); u.setLastName("Jordon");  
        a.add(u);

        u = new User();
        u.setFirstName("Jack"); u.setLastName("Nicolson");
        a.add(u);

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

        a.add(u);

        for (User ss : a) {           
                System.out.println(ss.getFirstName() + " " + ss.getLastName());
        }
    }
}
于 2012-07-23T06:29:28.750 に答える
0

一般に、要素を に追加Setして重複を削除できます。ただし、通常、配列全体をコレクションに追加することは望ましくありません。次のように、個々の要素を追加するだけです。

    public static void main(String[] args) {
        Set<User> a = new HashSet<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");

        // Add each of the users to the Set.  Note that there are three.
        for (User user : u) {
            a.add(u);
        }

        // Get the results back as an array.  Note that this will have two.
        User[] duplicatesRemoved = new User[0];
        a.toArray(duplicatesRemoved);
    }
于 2012-07-23T06:29:28.457 に答える
0

Jason の提案に従って equals メソッドをオーバーライドします。重複を削除するには、Set を使用する必要があります。

リストでは値の重複が許可されるため、常に値が重複します。セットは重複する値を許可しないため、問題が解決します。

于 2012-07-23T06:31:27.350 に答える
0

こんにちは、次のようにユーザー配列から重複した要素を削除するために、pp クラスにメソッドを記述できます。

private User[] getUserArrayWithoutDuplicates(User[] a) {
    int count = a.length;
    Set<User> tempset = new HashSet<User>();
    for (int i = 0; i < count; i++) {
        User[] user = a;
        int arraysize = user.length;
        for (int j = 0; j < arraysize; j++)
            tempset.add(user[j]);
    }
    User[] usr = new User[tempset.size()];
    Iterator<User> tempIterator = tempset.iterator();
    int p = 0;
    while (tempIterator.hasNext()) {
        User user = tempIterator.next();
        usr[p] = new User();
        usr[p].setFirstName(user.firstName);
        usr[p].setLastName(user.lastName);
        p++;
    }
    return usr;
}

このメソッドは、User 配列から重複するエントリを削除し、重複するエントリのない User 配列を返します。

于 2012-07-23T07:41:10.933 に答える
0

配列のセットを使用しています。セットには 1 つの要素、つまり 3 人のユーザーの配列があります。配列は一意性を強制またはチェックしないため、同じ User を 2 回取得します。配列を完全に削除し、単純に Set を使用すると、必要な「独自の」動作が得られます。

于 2012-07-23T06:33:10.827 に答える
0

最初に、重複したくない場合は、配列の代わりに Set を使用してオブジェクトを格納する必要があります。(配列とリストでは、重複したオブジェクトをストアにすることができます)

次に、equals メソッドは比較のために String.equal メソッドを使用し、null 値もチェックして安全を確保する必要があります。ハッシュコードとイコールメソッドには常にIDEの自動生成機能を使用します(つまり、Eclipseソース-> hashCode()とequals()を生成します...)

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

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

そして主な方法

public static void main(String[] args) {
    List<Set<User>> a = new ArrayList<Set<User>>();
    Set<User> set = new HashSet<User>();

    User u = new User();
    u.setFirstName("Mike"); u.setLastName("Jordon");      
    set.add(u);

    u = new User();
    u.setFirstName("Jack"); u.setLastName("Nicolson");
    set.add(u);

    u = new User();
    u.setFirstName("Jack"); u.setLastName("Nicolson");
    set.add(u);

    a.add(set);

    for (Set<User> ss : a) {
        for (User user : ss) {           
            System.out.println(user.getFirstName() + " " + user.getLastName());
        }
    }
}
于 2012-07-23T06:41:24.200 に答える