为了账号安全,请及时绑定邮箱和手机立即绑定

使用 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 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信