java比较java中两种不同类型列表中相同id的两条记录
班级学生:字符串名称、字符串寄存器、字符串部门、整数pendingCollegeFee 类HostelStudent:字符串名称、字符串寄存器、整数PendingHosterFee、整数pendingMessFee 和两个对象的列表:java比较java中两种不同类型列表中相同id的两条记录,java,spring,list,arraylist,stream,Java,Spring,List,Arraylist,Stream,班级学生:字符串名称、字符串寄存器、字符串部门、整数pendingCollegeFee 类HostelStudent:字符串名称、字符串寄存器、整数PendingHosterFee、整数pendingMessFee 和两个对象的列表: 学生名单和大学生名单 学生宿舍名单学生宿舍名单 现在,我想比较两个列表中具有相同名称和寄存器号的记录,然后需要使用两个列表中都有值的记录调用一个方法 isThereAnyPendingFees(Student s, HostelStudent hs) {
isThereAnyPendingFees(Student s, HostelStudent hs) {
return(s.getPendingCollegeFee() + hs.getPendingHostelFee() + hs.getPendingMessFee() !=0
}
有谁能帮我把它改成O(nlogn)或更小,因为列表中的记录长度非常高。按名称和寄存器编号对每个列表进行排序:O(n logn) 循环遍历第一个列表,对每个元素二进制搜索另一个列表中的匹配项,然后对两个匹配元素执行所需的任何操作。二进制搜索是O(logn),所以这是整个O(nlogn)
这两个步骤都是O(nlogn),因此算法仍然是O(nlogn)按名称和寄存器编号对每个列表进行排序:O(nlogn) 循环遍历第一个列表,对每个元素二进制搜索另一个列表中的匹配项,然后对两个匹配元素执行所需的任何操作。二进制搜索是O(logn),所以这是整个O(nlogn)
这两个步骤都是O(n logn),因此算法仍然是O(nlogn)创建一个只表示“标识”的类(因此,可能是名称+寄存器,尽管听起来好像您误判了情况,您确实希望“寄存器”是唯一的键,在这种情况下,您可以只使用字符串),然后使用映射代替列表:
Map
和Map
这些搜索速度要快得多
或者,对列表进行排序,例如register
,然后可以使用二进制搜索(可以在Collections类中找到),这也比只搜索列表快几个数量级。但是,您必须获取二进制搜索的源代码(或者使用wikipedia来理解算法;如果您想使用reigster+name组合来查找条目,那么您将无法搜索HosteStudent的实际实例)
总而言之,map解决方案将变得非常简单。我强烈建议您这样做。创建一个只表示一个“标识”的类(因此,可能是name+register,尽管听起来好像您误判了情况,您确实希望“register”成为唯一的键,在这种情况下,您可以使用String),然后使用地图代替列表:
Map
和Map
这些搜索速度要快得多
或者,对列表进行排序,例如register
,然后可以使用二进制搜索(可以在Collections类中找到),这也比只搜索列表快几个数量级。但是,您必须获取二进制搜索的来源(或者使用wikipedia了解算法;如果您想使用reigster+名称组合来查找条目,则不会有HosteStudent的实际实例可供搜索
总而言之,map解决方案将变得非常简单。我强烈建议您这样做。首先,我将扩展HosteStudent类中的Student类。您将同时使用多个变量 学生会:
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;
}
}
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;
}
}
HostelStudent.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;
}
}
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;
}
}
你可以列出学生的
列表
和寄宿学生的列表
。填写完列表后,你可以循环检查它们的值是否相同。(不要忘记你的getter/setter).首先,我将在HostelStudent类中扩展Student类。您同时使用多个变量
学生会:
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;
}
}
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;
}
}
HostelStudent.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;
}
}
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;
}
}
你可以列出学生的列表
和寄宿学生的列表
。填写完列表后,你可以循环检查它们的值是否相同。(不要忘记你的getter/setter)