簡體   English   中英

如何檢查 ArrayList 是否包含具有特定字段值的對象?

[英]How can I check if an ArrayList contains an Object with a specific field value?

我有一個ObjectsArrayList 我想看看該ArrayList包含具有特定字段的Object

團隊建設者.java

public class TeamBuilder {

    public static void main(String[] args) {
        Team team = new Team();
        team.addMember(new TeamMember("myID"));
        System.out.println(team.containsMember("myID"));  //false
    }

}

團隊成員.java

public class TeamMember {

    private String id;

    public TeamMember(String id) {
        this.id = id;
    }

    public String getID() {
        return this.id;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof TeamMember) {
            o = ((TeamMember) o).getID();
        }
        return o.equals(this.getID());
    }

}

團隊.java

import java.util.ArrayList;

public class Team {

    private ArrayList<TeamMember> members = new ArrayList<>();

    public boolean addMember(TeamMember teamMember) {
        if (members.contains(teamMember)) {
            return false;
        }
        members.add(teamMember);
        return true;
    }

    public boolean containsMember(String eid) {
        System.out.println(members.get(0).equals(eid));  //true
        System.out.println(members.contains(eid));  //false
        if (members.contains(eid)) {
            return true;
        }
        return false;
    }

}

我不想使用循環,也不想覆蓋arrayList.contains()

我期待.contains()遍歷我的TeamMember列表,並在找到與傳遞的Object相等的列表時返回true 這兩個Objects是相等的,但.contains()方法返回 false。

如何優雅地檢查Team包含具有指定 ID 的TeamMember 我的印象是我可以避免 for 循環,因為Java 方法:在數組列表中查找對象給定已知屬性值,但我無法讓它工作。

最優雅的解決方案是

  1. 首先,最重要的是修復您的 equals 方法,以便它履行 equals 合同 --- 意思是如果a.equals(b)那么b.equals(a)必須為真。
  2. 您永遠不應該讓 TeamMember 對象等於 String。 這將導致難以調試的副作用和錯誤的可能性,這是您真正不想要的。
  3. equals 方法不應該拋出異常。 他應該首先檢查引用是否相等,然后是類是否相同,然后是字段是否相等。
  4. 您的 TeamMember 類也應該覆蓋hashCode()並且它應該使用與 equals 方法相同的字段。
  5. 然后設置一個HashMap<String, TeamMember>匹配 ID 字符串 TeamMember 對象。
  6. 確保您的 ID 是不可變的。
  7. 使用 String-TeamMember 對填充您的地圖
  8. 當您需要與 ID 匹配的 TeamMember 時調用get(String key)

暫無
暫無

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

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