Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java比较java中两种不同类型列表中相同id的两条记录_Java_Spring_List_Arraylist_Stream - Fatal编程技术网

java比较java中两种不同类型列表中相同id的两条记录

java比较java中两种不同类型列表中相同id的两条记录,java,spring,list,arraylist,stream,Java,Spring,List,Arraylist,Stream,班级学生:字符串名称、字符串寄存器、字符串部门、整数pendingCollegeFee 类HostelStudent:字符串名称、字符串寄存器、整数PendingHosterFee、整数pendingMessFee 和两个对象的列表: 学生名单和大学生名单 学生宿舍名单学生宿舍名单 现在,我想比较两个列表中具有相同名称和寄存器号的记录,然后需要使用两个列表中都有值的记录调用一个方法 isThereAnyPendingFees(Student s, HostelStudent hs) {

班级学生:字符串名称、字符串寄存器、字符串部门、整数pendingCollegeFee 类HostelStudent:字符串名称、字符串寄存器、整数PendingHosterFee、整数pendingMessFee 和两个对象的列表:

  • 学生名单和大学生名单
  • 学生宿舍名单学生宿舍名单 现在,我想比较两个列表中具有相同名称和寄存器号的记录,然后需要使用两个列表中都有值的记录调用一个方法

    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)