使用 add 方法将重复对象存储在 ArrayList 中

我有两个类,一个名为 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 的预期结果应该是一个海鸥值而不是两个。我如何拒绝重复?


波斯汪
浏览 129回答 2
2回答

ITMISS

你可以在这里有两种方法:第一:遍历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,自动生成以下方法:@Overridepublic int hashCode() {&nbsp; &nbsp; final int prime = 31;&nbsp; &nbsp; int result = 1;&nbsp; &nbsp; result = prime * result + ((latinName == null) ? 0 : latinName.hashCode());&nbsp; &nbsp; result = prime * result + ((name == null) ? 0 : name.hashCode());&nbsp; &nbsp; result = prime * result + obeservation;&nbsp; &nbsp; return result;}@Overridepublic boolean equals(Object obj) {&nbsp; &nbsp; if (this == obj)&nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; if (obj == null)&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; if (getClass() != obj.getClass())&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; Bird other = (Bird) obj;&nbsp; &nbsp; if (latinName == null) {&nbsp; &nbsp; &nbsp; &nbsp; if (other.latinName != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; } else if (!latinName.equals(other.latinName))&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; if (name == null) {&nbsp; &nbsp; &nbsp; &nbsp; if (other.name != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; } else if (!name.equals(other.name))&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; if (obeservation != other.obeservation)&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; return true;}如果您将这些方法(我鼓励您在您的 IDE 中生成)添加到Bird类中,您可以使用HashSet<Bird>. 为避免重复,只需将所有Bird对象添加到 defined 中即可HashSet<Bird>。您不需要任何其他数据结构或相等性检查来控制任何两个Bird类型对象是否相等。您只需要将您的对象集合从 更改ArrayList<Bird> birds = new ArrayList<Bird>();为Set<Bird> birds = new HashSet<>();。

慕桂英3389331

add将循环移出:&nbsp; &nbsp; for (int i = 0; i < birds.size(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; if (birds.get(i).getName().equals(name1)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Bird already exist");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; birds.add(new Bird(name1, latinName1));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java