基于List对其他List排序的Java实现——明修栈道,暗度陈仓

  • 问题描述
    Leetcoder 1333 餐厅的过滤。
    有2个List:id, rating
    排序要求:如果rating相等,id较大者优先;否则rating较大的id优先。
  • 方法
    • step1: 创建一个索引列表0, 1, 2, 3, …
    • step2: 对索引列表排序,重写比较方法: idx.sort((o1, o2)->ratings.get(o1).equals(ratings.get(o2)) ? ids.get(o2)-ids.get(o1) : ratings.get(o2) - ratings.get(o1));迷之排序:表面上对有序的索引进行排序,实际上是对id和rating进行排序,因为排序约束被暗含在了索引中。
    • step3: 通过索引列表,获得目标id序列。
      for (Integer i : idx) { ret.add(ids.get(i)); }
  • 评测
    时间:2020-1-31在这里插入图片描述
  • 代码
class Solution {
    public List<Integer> filterRestaurants(int[][] restaurants, int veganFriendly, int maxPrice, int maxDistance) {
        List<Integer> ids = new ArrayList<>();
        List<Integer> ratings = new ArrayList<>();
        for (int i = 0; i < restaurants.length; ++i) {
            if (restaurants[i][2] >= veganFriendly && restaurants[i][3] <= maxPrice && restaurants[i][4] <= maxDistance) {
                ids.add(restaurants[i][0]);
                ratings.add(restaurants[i][1]);
            }
        }
        int n = ids.size();
        List<Integer> idx = new ArrayList<>(n);
        for (int i = 0; i < n; ++i) {
            idx.add(i, i);
        }
        idx.sort((o1, o2)->ratings.get(o1).equals(ratings.get(o2)) ? ids.get(o2)-ids.get(o1) : ratings.get(o2) - ratings.get(o1));
        ratings.clear();
        List<Integer> ret = ratings;
        for (Integer i : idx) {
            ret.add(ids.get(i));
        }
        return ret;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章