quma
quma

Reputation: 5733

java - unique list of different objects with same fields (id, name, ...)

I have a list of institutionUserConnections and I will have the users. Therefore I iterate over the institutionUserConnections list. It can be that a user is in more than one institution. Therefore I have 2 different user object - but it is the same user.

My question now would be how to get a unique list of users?

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

[EDIT] Actually it is hard to explain. I have also used a Set but with no success. Here is the whole code I use:

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

Maybe someone have another hint how I can solve this issue.

Upvotes: 1

Views: 450

Answers (3)

saikumarm
saikumarm

Reputation: 1575

as suggested in the comments user HashSet, which will retain only unique reference of the object.

I could not understand your question clearly. I have design a way to get around your issue I hope it helps

  1. class InstituteUserConnection holds insitute name and a list of Users.
  2. listOfInsituteUserConnection will hold InstituteUserConnection.
  3. Iterate over the listOfInsituteUserConnection and get Users and put them into Set<User>. you can check the count in the User to cross verify and print them out.
  4. FYI HashSet works on the principle of hashing check link for info.
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);
        }
    }
}

Upvotes: 1

usman
usman

Reputation: 1391

I would suggest to override your Equals method and use data structure you want to use,if you are eager to use List/ ArrayList or any set as well. Apache Commons Collection provide a great one line code to provide unique list.

Add Maven dependency or download jar :

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

Then simply use below line of code:

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

and override Equals and 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;
}

Upvotes: 0

vels4j
vels4j

Reputation: 11298

Try this

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

Upvotes: 0

Related Questions