Reputation: 5733
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
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
class InstituteUserConnection
holds insitute name and a list ofUser
s.listOfInsituteUserConnection
will holdInstituteUserConnection
.- Iterate over the
listOfInsituteUserConnection
and get Users and put them intoSet<User>
. you can check the count in the User to cross verify and print them out.- 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
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
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