【问题标题】:Sort a list by another list按另一个列表对列表进行排序
【发布时间】:2021-05-14 08:00:54
【问题描述】:

我有一个小问题让我发疯。

我有一个

  • List<Integer> 带 ID。
  • List<ObjectA> 有 3 个变量: 一个 id 和两个字符串

我必须通过将第一个列表中包含的 id 元素放在顶部,然后按字符串 asc 和第二个字符串 asc 对第二个列表进行排序。

完成这项工作的最简单方法是什么?我正在尝试使用 .sort()、比较器等。

一个例子:

@Getter
@Setter
public class ObjectA {
      private Integer id;
      private String code;
      private String name;
}

// comparator:
    static class SortByCode implements Comparator<ObjectA> {
        public int compare(ObjectA a, ObjectA b) {
            String as = a.getCode();
            String bs = b.getCode();

            return as.compareTo(bs);
        }
    }
    static class SortByName implements Comparator<ObjectA> {
        public int compare(ObjectA a, ObjectA b) {
            String as = a.getName();
            String bs = b.getName();

            return as.compareTo(bs);
        }
    }

// then in service:  
List<Integer> idsPreferred = new ArrayList<>();
List<ObjectA> listObj = new ArrayList<>();

idsPreferred = .... add preferred ids;
listObj = .... add objects;  
listObj.sort(new SortByCode()).thenComparing(new SortByName());

这样,我按代码和名称排序 - 但我需要按第一个列表添加排序 - 我需要列表中包含 id 的元素排在其他元素之前。

【问题讨论】:

  • 您可以使用比较器发布代码吗??
  • 你能举个例子吗?
  • 我添加了更深入的解释和示例

标签: java sorting comparator


【解决方案1】:

我想像这样使用提取键的链式比较:

listObj.sort(Comparator.comparing(o -> !idsPreferred.contains(((ObjectA) o).getId()))
                       .thenComparing(o -> ((ObjectA) o).getId())
                       .thenComparing(o -> ((ObjectA) o).getCode())
                       .thenComparing(o -> ((ObjectA) o).getName()));

listObj.sort(Comparator.comparing(ObjectA::getId,
                                  (id1,id2)-> {if (!((idsPreferred.contains(id1))^idsPreferred.contains(id2)))
                                                  return 0;
                                               else return (idsPreferred.contains(id2))?1:-1;})
                       .thenComparing(ObjectA::getId)
                       .thenComparing(ObjectA::getCode)
                       .thenComparing(ObjectA::getName));

【讨论】:

  • 非常好,满足我的要求,谢谢。但你能告诉我为什么需要演员阵容吗?
  • @Ed-Genesis 真的我无法解释这一点。但我已经发布了第二个解决方案。
【解决方案2】:

解决方案将涉及 2 个步骤-

  1. 检查第二个列表中对象的 ID,这些对象存在于第一个列表中。
  2. 使用建议的任一解决方案对包含的对象进行排序 - How to sort List of objects by some property

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2014-05-28
    • 2012-02-08
    • 2019-01-17
    • 1970-01-01
    • 2023-04-01
    • 2021-11-02
    • 2018-11-15
    相关资源
    最近更新 更多