哈哈哈123457 2021-12-27 17:37 采纳率: 87.2%
浏览 42
已结题

java 两个list 里面对象相同,比如学生对象,相同id的学生的成绩进行累加再返回,不用双重循环O(N^2)复杂度如何实现?lambda如何实现?

java 两个list 里面对象相同,比如学生对象,相同id的学生的成绩进行累加再返回,不用双重循环O(N^2)复杂度如何实现?lambda如何实现?

  • 写回答

3条回答 默认 最新

  • 俺不理解 2021-12-27 18:28
    关注

    两个思路吧

    1. 空间换时间,利用map,空间复杂度n,时间也是n
    public class Test {
        public static void main(String[] args) {
            List<Student> list1 = new LinkedList<>();
            List<Student> list2 = new LinkedList<>();
    
            Map<String, Student> map = list1.stream().collect(Collectors.toMap(Student::getId, Function.identity()));
            for (Student student : list2) {
                Student other = map.get(student.getId());
                student.score += other == null ? 0 : other.score;
            }
        }
    
        class Student {
            String id;
            float score;
    
            public String getId() {
                return id;
            }
        }
    }
    
    1. 不想空间换时间,那也有办法简化到 nlogn,先都排序,然后双指针,大概是:
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
            // 注意双指针要用 ArrayList,不然性能很差
            List<Student> list1 = new ArrayList<>();
            List<Student> list2 = new ArrayList<>();
    
            Comparator<Student> comparator = Comparator.comparing(Student::getId);
            list1.sort(comparator);
            list2.sort(comparator);
            
            int p1 = 0, p2 = 0, len1 = list1.size(), len2 = list2.size();
            while (p1 < len1 && p2 < len2) {
                Student s1 = list1.get(p1);
                Student s2 = list2.get(p2);
                int com = s1.getId().compareTo(s2.getId());
                if (com == 0) {
                    // 是同一个
                    s1.score += s2.score;
                    p1++;
                    p2++;
                } else if (com < 0) {
                    p1++;
                } else {
                    p2++;
                }
            }
        }
    
        class Student {
            String id;
            float score;
    
            public String getId() {
                return id;
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月27日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来