java - 具有相同字段的不同对象的唯一列表(id,name,...)

时间:2015-12-22 14:21:52

标签: java

我有一个INSTITUserConnections列表,我将拥有这些用户。 因此,我遍历了INSTITUserConnections列表。 可能是用户在多个机构中。 因此,我有2个不同的用户对象 - 但它是同一个用户。

我现在的问题是如何获得一个独特的用户列表?

final List<User> users = new ArrayList<>();
    for (final InstitutionUserConnection institutionUserConnection : institutionUserConnections) {
        final User user = institutionUserConnection.getUser();
        users.add(user);
    }

[编辑] 实际上很难解释。我也使用了Set但没有成功。 这是我使用的完整代码:

final List<InstitutionUserConnection> institutionUserConnectionsOfUser = institutionUserConnectionService
        .getActiveInstitutionUserConnectionsByUser(foundedUser);

    final List<InstitutionUserConnection> institutionUserConnections = new ArrayList<>();
    for (final InstitutionUserConnection institutionUserConnection : institutionUserConnectionsOfUser) {
        final Institution institution = institutionUserConnection.getInstitution();
        institutionUserConnections
            .addAll(institutionUserConnectionService.getActiveInstitutionUserConnectionsByInstitution(institution));
    }

    final List<User> users = new ArrayList<>();
    for (final InstitutionUserConnection institutionUserConnection : institutionUserConnections) {
        final User user = institutionUserConnection.getUser();
            users.add(user);
    }

也许有人有另外一个提示我如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

在注释用户HashSet中建议,它将仅保留对象的唯一引用。

我无法清楚地理解你的问题。我设计了一种解决问题的方法,我希望它有所帮助

  
      
  1. class InstituteUserConnection拥有名称和User s。
  2. 的列表   
  3. listOfInsituteUserConnection将保留InstituteUserConnection
  4.   
  5. 迭代listOfInsituteUserConnection并获取用户并将其放入Set<User>。你可以查看用户的计数   交叉验证并打印出来。
  6.   
  7. FYI HashSet的工作原理是哈希检查link以获取信息。
  8.   
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

class User {

    String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return this.name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof User)) {
            return false;
        }
        User objUser = (User) obj;
        System.out.println("in equals");
        return this.name.equals(objUser.getName());

    }

    @Override
    public String toString() {
        return this.name;
    }

}

public class InstitutionUserConnections {
    String institutionName;
    List<User> users;

    public InstitutionUserConnections(String institutionName, List<User> users) {
        this.users = users;
        this.institutionName = institutionName;
    }

    public void addUser(User user) {
        this.users.add(user);
    }

    public List<User> getUsers() {
        return this.users;
    }

    public static void main(String[] args) {
        User user1 = new User("user1");
        User user2 = new User("user2");

        List<InstitutionUserConnections> listOfInstitutionUserConnections = new ArrayList<InstitutionUserConnections>();
        List<User> institute1User = Arrays.asList(new User[] { user1, user2 });
        InstitutionUserConnections institute1 = new InstitutionUserConnections(
                "institute1", institute1User);

        List<User> institute2User = Arrays.asList(new User[] { user1 });
        InstitutionUserConnections institute2 = new InstitutionUserConnections(
                "institute1", institute2User);

        listOfInstitutionUserConnections.add(institute1);
        listOfInstitutionUserConnections.add(institute2);

        Set<User> listOfUniqueUsers = new HashSet<User>();
        for (InstitutionUserConnections institute : listOfInstitutionUserConnections) {
            listOfUniqueUsers.addAll(institute.getUsers());
        }

        System.out.println("No of User in Set<User> : "
                + listOfUniqueUsers.size());
        for (User user : listOfUniqueUsers) {
            System.out.println(user);
        }
    }
}

答案 1 :(得分:0)

试试这个

final HashSet<User> users = new HashSet<>();
for (final InstitutionUserConnection institutionUserConnection : institutionUserConnections) {
    final User user = institutionUserConnection.getUser();
        users.add(user);
}
// iterate users to check unique

答案 2 :(得分:0)

如果您急于使用List / ArrayList或任何集合,我建议覆盖您的Equals方法并使用您想要使用的数据结构。 Apache Commons Collection提供了一个很棒的单行代码来提供唯一的列表。

添加Maven依赖项或下载jar:

<dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>

然后只需使用以下代码行:

SetUniqueList uniqueList = SetUniqueList.decorate(<<Your list>>);

并覆盖Equals和HashCode:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

    YourClass tester = (YourClass) o;

    if (user!= null ? !user.equals(tester.user) : tester.user!= null) return false;


    return true;
}

@Override
public int hashCode() {
    int result = user != null ? user.hashCode() : 0;
    result = 31 * result + (anotherField!= null ? anotherField.hashCode() : 0);

    return result;
}