簡體   English   中英

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

[英]java - unique list of different objects with same fields (id, name, …)

我有一個stitutionalUserConnections列表,我將有用戶。 因此,我遍歷了stitutionalUserConnections列表。 用戶可能在多個機構中。 因此,我有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);
    }

也許有人對我如何解決這個問題有另一個提示。

就像注釋用戶HashSet中建議的那樣,它將僅保留對象的唯一引用。

我不清楚您的問題。 我設計了一種解決您的問題的方法,希望對您有所幫助

  1. class InstituteUserConnection保存初始化名稱和User列表。
  2. listOfInsituteUserConnection將保存InstituteUserConnection
  3. 遍歷listOfInsituteUserConnection並獲取Users並將其放入Set<User> 您可以在用戶中檢查計數以進行交叉驗證並打印出來。
  4. FYI HashSet按照哈希檢查信息鏈接的原理工作。
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);
        }
    }
}

嘗試這個

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

如果您想使用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;
}

Jackson (Java):反序列化相同的屬性名但返回不同的對象。 其中一個返回 object 和第二個列表<object><div id="text_translate"><p>我有一個這樣的 POJO:</p><pre> public class NewClass { String name; @JsonProperty("productType") ProductType productType2005; List&lt;ProductType&gt; productType; }</pre><p> 我想將 json 反序列化為 Pojo。 問題是我的屬性名稱相同 productType 但我可以期待兩種不同的返回類型或數據結構。</p><ol><li> 返回ProductType</li><li> return List&lt;ProductType&gt;因為屬性名稱相同我如何有效地使用 Jackson 注釋來解決它?</li></ol><p> 我使用 rest-assured 進行反序列化,使用 Lombok 進行典型的 getter 和 setter。</p></div></object>

[英]Jackson (Java) : deserialization for the same property name but return different objects. for one it return object and second List<Object>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM