二维数组多次排序 或 嵌套list多次排序

可以排序int 的顺序,也可以排序List<List<Integer>> 顺序

为便于理解,以力扣原题为例:1333.餐厅过滤器

原题中给了一个双重数组,并要求返回一个List<Integer>。

方法1

会用流的,通常用于会反应把双重数组转成List<List<Integer>>去处理这个双重数组,于是解题思路如下:

java 复制代码
public static List<Integer> filterRestaurants2(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {
    List<List<Integer>> lists = new ArrayList<>();

    for(int[] arr : restaurants){
        if((veganFriendly == 1 && arr[2] != 1) || maxPrice < arr[3] || maxDistance < arr[4]){
            continue;
        }

        lists.add(Arrays.stream(arr).boxed().collect(Collectors.toList()));
    }
    
    if (lists.size() == 0) {
        return new ArrayList<>();
    }

    lists.sort((a,b) ->{
        int rating = b.get(1).compareTo(a.get(1));
        if (rating != 0) {
            return rating;
        }
        return b.get(0).compareTo(a.get(0));
    });

    return lists.stream().map(o->o.get(0)).collect(Collectors.toList());
}

可是该方式耗空间较大,于是又会想,能不能从直接用数组的方式,不另外构造新对象。

方法2:

python 复制代码
public static List<Integer> filterRestaurants3(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {

    for(int[] arr : restaurants){
        if((veganFriendly == 1 && arr[2] != 1) || maxPrice < arr[3] || maxDistance < arr[4]){
            arr[0] = 0;
        }
    }

    Arrays.sort(restaurants, (o1, o2) -> {
        int compare = Integer.compare(o2[1], o1[1]);
        if (compare != 0){
            return compare;
        }
        return Integer.compare(o2[0], o1[0]);
    });

    return Arrays.stream(restaurants).map((int[] o)->o[0]).filter(o->o!=0).collect(Collectors.toList());
}

但是提交的结果然后是耗时耗空间。

既然数组能用流处理,那是不是可以全部用流的形式过滤和排序呢
方法3:

java 复制代码
public static List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {
    return Arrays.stream(restaurants)
    .filter(r -> (veganFriendly != 1 || r[2] == 1) && r[3] <= maxPrice && r[4] <= maxDistance)
    .sorted((a1, a2) -> a1[1] == a2[1] ? a2[0] - a1[0] : a2[1] - a1[1])
    .map(a -> a[0])
    .collect(Collectors.toList());
}
相关推荐
边境悍匪5 分钟前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
302wanger11 分钟前
分享一个工作习惯:整点看即时消息
算法
letisgo532 分钟前
JAVA 高级进阶02篇《并发编程三板斧:JMM、CAS与AQS的源码级拆解》
java·面试·并发编程·aqs·jmm
胡写代码36 分钟前
若依 + MyBatis-Plus,分页为什么悄悄失效了?
java·后端
yxlalm1 小时前
4.java秒杀项目第四课-后端商品后台接口
java·开发语言
宁之明起(B服)1 小时前
vulhub靶场(tomcat三件套:PUT写马、Ghostcat与manager弱口令)
java·tomcat
君顾11 小时前
家政派单小程序源码开发实战:从零搭建到上线全流程指南
java·开发语言·家政派单
流烟默1 小时前
HTTP 连接管理技术梳理:JDK KeepAliveCache 机制与池化选型
java·网络协议·http
阿酷tony2 小时前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
洋不写bug2 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序