【问题标题】:Find multiple element with similar values in ArrayList?在 ArrayList 中查找具有相似值的多个元素?
【发布时间】:2020-05-01 12:28:58
【问题描述】:

我有一个名为 Student 的类有两个变量:

    String lastName;
    String firstName; 

    public Student(String lastName,String firstName){
        this.lastName = lastName;
        this.firstName = firstName;
    }
    public Student(String lastName){
        this.lastName = lastName;

    } 

    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        String getLastName = ((Student) obj).getLastName();
        return lastName.equalsIgnoreCase(getLastName);
    }

在 Main 类中我创建了一个 ArrayList

    private static ArrayList<Student> listOfStudents = new ArrayList<>(); 

我已经创建了这个方法来从 ArrayList 中获取学生

public void findStudent(String lastName){
       for (int i=0;i<listOfStudents.size();i++){
                if (listOfStudents.get(i).equals(new Student(lastName))){
                    System.out.println(listOfStudents.get(i));
                }
       }
}

我已覆盖 equals() 以按姓氏检查。 现在一切都很好,但是当我添加重复的姓氏时,如下所示:

        listOfStudents.add(new Student("Tamoussat","Abdelillah"));
        listOfStudents.add(new Student("Tamoussat","Fatima"));
        listOfStudents.add(new Student("Soussi","Ahlam"));

我只得到第一个元素,如果它们具有相同的姓氏,我想要如何获取多个元素的方法? 最好的问候

【问题讨论】:

  • 能否请您发布您的 hashcode() 和 equals() 方法
  • 你是说你只得到第一个重复的元素,但你想要所有重复的元素?
  • @SharadNanda 完全正确
  • @IgorKhvostenkov 完成

标签: java arrays arraylist methods find


【解决方案1】:

感谢帮助,最后我发现问题出在我的代码中,我有一个方法可以将学生添加到数组中,在我使用的那个方法中


if(!listOfStudents.contains(new Student(lastName,firstName)){}

所以问题出在其他方法中,当它发现重复元素时,它没有将其添加到 ArrayList,当我从该方法中删除这个 if 语句时,代码运行良好,最好的祝福

【讨论】:

    【解决方案2】:

    您的 equals() 和 hashCode() 应该可以工作,尽管它们不是规范的。我会用更好的方式写它:

      @Override
      public boolean equals(Object o) {
        if (this == o) {
          return true;
        }
        if (o == null || getClass() != o.getClass()) {
          return false;
        }
        Student student = (Student) o;
        return Objects.equals(lastName, student.lastName);
      }
    
      @Override
      public int hashCode() {
        return Objects.hash(lastName);
      }
    

    但这并不能解释为什么您的代码只返回数组中的一项。您可以尝试我的实现,或者发布更精确的代码,使用您使用的数据和执行结果来执行。

    【讨论】:

      【解决方案3】:

      错误将出现在您的 equals() 方法中,因为运行上面的代码与我自己的 equals() 实现按预期工作,它只是将 thislastName 与 object 参数进行比较。

      不过,还是试着改进一下这个方法

      public void
      findStudent(String lastName)
      {
        for (Student student : listOfStudents)
        {
          if (student.lastName().equals(lastName))
          {
            System.out.println(student);
          }
        }
      }
      

      或任何其他版本,如 @CodingSamples 的

      【讨论】:

        【解决方案4】:
        public class Student {
            private String lastName;
            private String firstName;
        
            public Student(String lastName, String firstName) {
                this.lastName = lastName;
                this.firstName = firstName;
            }
        
            public String getFirstName() {
                return firstName;
            }
        
            public String getLastName() {
                return lastName;
            }
        
            @Override
            public String toString() {
                return firstName + " " +  lastName;
            }
        }
        

        您可以使用 java 流 api 过滤您的列表:

        public static void findStudent(List<Student> listOfStudents, String lastName){
            listOfStudents.stream().filter(s -> s.getLastName().equals(lastName)).forEach(student -> {
                // for each student with the lastName
                System.out.println(student);
            });
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 2019-07-30
          • 2020-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多