亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 add 方法將重復對象存儲在 ArrayList 中

使用 add 方法將重復對象存儲在 ArrayList 中

波斯汪 2023-03-02 10:00:24
我有兩個類,一個名為 Bird,另一個名為 Runtime。bird 類創建鳥類 - 名稱,拉丁名稱。Runtime 類有 4 個方法,只有一個對這個問題很重要,那就是“添加”方法。調用時的添加方法需要從用戶那里獲取名稱和拉丁名稱的輸入,這些被保存到字符串變量“名稱”和“拉丁名稱”中,我調用 Bird 類構造函數并將這些字符串變量傳遞到它的參數,最后將其添加到 ArrayList 中。但是,如果我兩次寫同一只鳥,我會得到重復的值。我試圖將 ArrayList 轉換成一個集合,然后再將其轉換回 ArrayList,我在 add 方法中做了這個,但沒有用。我懷疑這是因為我對對象如何存儲在 ArrayList 中的理解不足。我還在 Bird 類中創建了一個 getName 方法,所以我可以使用list.get(i).getName,如果名稱等于用戶鍵入的名稱,它會相應地提示用戶,如果不是,則將其添加到我的 ArrayList 中。這也沒有用。我還嘗試了一個遍歷 ArrayList 的 for 循環和一個 if 語句來確定用戶鍵入的名稱是否存在于 ArrayList 中,這也沒有用,嘗試是在早期所以我不記得確切的錯誤消息,但是在 while 循環中調用了 add 方法,我認為錯誤消息是并發修改,我不完全確定所以請忽略它,我的觀點是展示我嘗試過的各種解決方案。下面是鳥類    public class Bird{       int obeservation = 0;       String name;       String latinName;       public Bird(String name, String latinName){         this.name = name;         this.latinName = latinName;       }       public void addBird(String name, String latinName){         this.name = name;         this.latinName = latinName;       }       public String getName(){         return this.name;       }       public String statistics(){         return this.name + " (" + this.latinName + ") : " +                  this.obeservation + " observation";       }   }統計方法打印出 ArrayList,一個遍歷 ArrayList 的 foreach 循環將其打印出來。如果我輸入兩次 seagull 的預期結果應該是一個海鷗值而不是兩個。我如何拒絕重復?
查看完整描述

2 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

你可以在這里有兩種方法:

  • 第一:遍歷ArrayList,如果找不到相同的鳥,就把它加入到ArrayList中。這是一種更糟糕的方法。

  • 第二:將鳥類存儲在 HashSet 中。在這種情況下,您需要覆蓋.hashCode().equals(Object obj)方法。這是一個更好的方法。

在說如何生成.hashCode().equals(Object obj)方法之前,我想提一下.hashCode()方法和HashSet<T>

HashSet<T>s 提供了一組獨特的內部元素。為此,.hashCode()使用類的方法。如果您重寫.hashCode()任何類中的方法,您可以獲得使用 s 的好處HashSet<T>。如果不重寫這個方法,Java 會自動返回對象的內存地址。這就是您HashSet<Bird>包含重復元素的原因。

.hashCode().equals()方法可以由許多 IDE 生成。Bird我將您的課程復制并粘貼到 Eclipse 中。通過用于Alt+Shift+S -> hEclipse 或Alt+Insert -> equals() and hashCode()IntelliJ,自動生成以下方法:

@Override

public int hashCode() {

    final int prime = 31;

    int result = 1;

    result = prime * result + ((latinName == null) ? 0 : latinName.hashCode());

    result = prime * result + ((name == null) ? 0 : name.hashCode());

    result = prime * result + obeservation;

    return result;

}


@Override

public boolean equals(Object obj) {

    if (this == obj)

        return true;

    if (obj == null)

        return false;

    if (getClass() != obj.getClass())

        return false;

    Bird other = (Bird) obj;

    if (latinName == null) {

        if (other.latinName != null)

            return false;

    } else if (!latinName.equals(other.latinName))

        return false;

    if (name == null) {

        if (other.name != null)

            return false;

    } else if (!name.equals(other.name))

        return false;

    if (obeservation != other.obeservation)

        return false;

    return true;

}

如果您將這些方法(我鼓勵您在您的 IDE 中生成)添加到Bird類中,您可以使用HashSet<Bird>. 為避免重復,只需將所有Bird對象添加到 defined 中即可HashSet<Bird>。您不需要任何其他數據結構或相等性檢查來控制任何兩個Bird類型對象是否相等。


您只需要將您的對象集合從 更改ArrayList<Bird> birds = new ArrayList<Bird>();為Set<Bird> birds = new HashSet<>();。


查看完整回答
反對 回復 2023-03-02
?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

add將循環移出:


    for (int i = 0; i < birds.size(); i++) {

        if (birds.get(i).getName().equals(name1)) {

            System.out.println("Bird already exist");

            return;

        }

    }

    birds.add(new Bird(name1, latinName1));


查看完整回答
反對 回復 2023-03-02
  • 2 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號