Java 比较 Java 中两种不同类型的列表中的两个记录相同的 ID



类 学生:字符串名称、字符串寄存器、字符串部门、整数待定大学费用 类宿舍学生: 字符串名称, 字符串寄存器, 整数待定宿舍费, 整数待定邮件费 和两个对象的列表:

  1. 学生名单<学生>大学生;
  2. 宿舍学生名单<宿舍学生>宿舍学生;

现在我想比较两个列表中具有相同名称和寄存器编号的记录,然后需要调用一个方法,其中包含值都在两个列表中的记录

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

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

按名称和注册号对每个列表进行排序:O(n logn(。

遍历第一个列表,并为每个元素在另一个列表中搜索匹配项,然后对两个匹配元素执行所需的任何操作。二叉搜索是O(logn(,所以这是整体的O(n logn(。

这两个步骤都是 O(n logn(,所以算法仍然是 O(nlogn(

首先,我会在宿舍学生班中扩展学生班。您同时使用多个变量。

学生.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;
}
}

宿舍学生.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;
}
}

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

创建一个只代表"身份"的类(所以,大概是name+register,尽管听起来你误判了情况,你真的希望"register"是唯一键,在这种情况下你可以只使用String(,然后使用map代替列表:

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

这些查找速度要快得多。

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

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

相关内容

  • 没有找到相关文章

最新更新