【问题标题】:java compare two records same id in two different types of lists in javajava比较java中两种不同类型列表中相同id的两条记录
【发布时间】:2020-10-12 15:49:45
【问题描述】:

class Student:字符串名称、字符串寄存器、字符串部门、整数pendingCollegeFee 类HostelStudent:字符串名称,字符串寄存器,整数pendingHostelFee,整数pendingMessFee 和两个对象的列表:

  1. 学生名单 CollegeStudents;
  2. HostelStudent List HostelStudents;

现在我想比较两个列表中具有相同名称和注册号的记录,然后需要调用一个方法,该方法的值都在两个列表中

isThereAnyPendingFees(Student s, HostelStudent hs) {
     return(s.getPendingCollegeFee() + hs.getPendingHostelFee() + hs.getPendingMessFee() !=0
}

任何人都可以帮助我在 O(nlogn) 甚至更短的时间内实现这一目标,因为列表中的记录长度非常高。

【问题讨论】:

    标签: java spring list arraylist stream


    【解决方案1】:

    按名称和寄存器编号对每个列表进行排序:O(n logn)。

    循环遍历第一个列表,并为每个元素在另一个列表中进行二进制搜索以查找匹配项,然后对两个匹配的元素执行所需的任何操作。二分查找是 O(logn),所以总体来说是 O(n logn)。

    两步都是O(n logn),所以算法还是O(nlogn)

    【讨论】:

      【解决方案2】:

      首先,我会在 HostelStudent 类中扩展 Student 类。您同时使用多个变量。

      学生.cs:

      class Student {
      
          private long id;
          private String name;
          private String register;
          etc...
      
          public Student(long id, String name, String register) {
              this.id = id;
              this.name = name;
              this.register = register;
          }
      }
      

      HostelStudent.cs:

      class HostelStudent extends Student {
      
          private Integer pendingHostelFee;
          etc...
      
          public HostelStudent(long id, String name, String register, Integer pendingHostelFee) {
              super(id, name, register);
              this.pendingHostelFee = pendingHostelFee;
          }
      }
      

      您可以列出 Student 的 List<Student> 和 HostelStudent 的 List<HostelStudent> 的列表。填写列表后,您可以遍历它们并检查值是否相同。 (不要忘记你的 getter/setter)。

      【讨论】:

        【解决方案3】:

        创建一个仅代表“身份”的类(因此,大概是名称+注册,尽管听起来您误判了情况,并且您确实希望仅将“注册”作为唯一键,在这种情况下,您可以只需使用字符串),然后使用地图而不是列表:

        Map<StudentId, Student>Map<StudentId, HostelStudent>

        这些查找速度要快得多。

        或者,对列表进行排序,例如 register,然后您可以使用二分搜索(您可以在 Collections 类中找到),这也比仅搜索列表快几个数量级。但是,您必须获取二进制搜索的来源(或使用维基百科来理解算法;您想使用 reigster+name 组合来查找条目,您将没有 HostelStudent 的实际实例可供搜索。

        总而言之,地图解决方案将变得非常简单。我强烈建议你这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          相关资源
          最近更新 更多