类 学生:字符串名称、字符串寄存器、字符串部门、整数待定大学费用 类宿舍学生: 字符串名称, 字符串寄存器, 整数待定宿舍费, 整数待定邮件费 和两个对象的列表:
- 学生名单<学生>大学生;学生>
- 宿舍学生名单<宿舍学生>宿舍学生;宿舍学生>
现在我想比较两个列表中具有相同名称和寄存器编号的记录,然后需要调用一个方法,其中包含值都在两个列表中的记录
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的实际实例可供搜索。
总而言之,地图解决方案将简单得多。我强烈建议你这样做。