【问题标题】:Compare objects by size of a Set attribute, with empty Set being left at the end of the sorted list按 Set 属性的大小比较对象,将空 Set 留在排序列表的末尾
【发布时间】:2018-07-29 17:27:46
【问题描述】:
public class User {

    private String name;
    private  private Set<MyEnum> enums;

    //getter and setter methods..
}

public enum MyEnum {

    A(1, "..."),
    B(2, "...");

    private int value;
    private String description;

    private MyEnum(int value, String description){
        ....
    }
}

如何比较两个用户实例,首先是枚举属性,然后是名称? 当我们有一个枚举集而不是单个值时有可能吗?

【问题讨论】:

  • 是的,您可以拥有一组枚举。你已经在使用它了。您打算如何比较一组枚举?
  • 您只想比较是否相等?还是您希望能够对它们进行排序?
  • @Bentaye 我有一个用户列表,我需要先按枚举集属性(按大小增加顺序)然后按名称对其进行排序。我不知道你是否明白我的意思..
  • @Dave 所以按集合中元素的数量排序就是您要找的东西?
  • @Bentaye,是的。我尝试了类似Integer o1Size = o1.getEnums().size(); Integer o2Size = o2.getEnums().size(); int compare = o1Size.compareTo(o2Size); if(compare==0){return o1.getName().compareTo(o2.getName());} return compare; 但不起作用

标签: java enums compare comparator


【解决方案1】:

编辑:按枚举集大小排序,然后按名称排序。最后给用户留下空枚举:

我会实现一个自定义的Comparator

class UserComparator implements Comparator<User> {
  @Override
  public int compare(User u1, User u2) {
    int compResult = Integer.compare(u1.getEnums().size(), u2.getEnums().size());
    if(compResult == 0)
      compResult = u1.getName().compareTo(u2.getName());
    return compResult;
  }

然后使用 List sort(Comparator c) 方法:

User u1 = new User();
u1.setName("Sarah");
u1.setEnums(Collections.emptySet());
User u2 = new User();
u2.setName("Bob");
u2.setEnums(Collections.emptySet());
User u3 = new User();
u3.setName("Peter");
u3.setEnums(EnumSet.of(MyEnum.A, MyEnum.B));
User u4 = new User();
u4.setName("Nicolas");
u4.setEnums(EnumSet.of(MyEnum.A, MyEnum.B));
User u5 = new User();
u5.setName("Paul");
u5.setEnums(EnumSet.of(MyEnum.A));

List<User> users = Arrays.asList(u1, u2, u3, u4, u5);
users.sort(new UserComparator());

// Then split the list and move the users with empty enums at the end
List<User> sortedNonEmptySetUsers = users.stream()
    .filter(u -> !u.getEnums().isEmpty())
    .collect(Collectors.toList());
List<User> sortedEmptySetUsers = users.stream()
    .filter(u -> u.getEnums().isEmpty())
    .collect(Collectors.toList());
sortedNonEmptySetUsers.addAll(sortedEmptySetUsers);

List<User> sortedUsers = sortedNonEmptySetUsers;

这样下单

Paul | [A]
Nicolas | [B, A]
Peter | [B, A]
Bob | []    
Sarah | []    

【讨论】:

  • 这很奇怪,因为我测试了我提供的代码。我的示例中的用户是否按照您的要求正确排序?
  • @Dave 我认为这个答案有效,如果您说这不起作用,您应该在您的问题中添加一些示例输入和预期输出。 @Bentaye 我建议使用 EnumSet.of(MyEnum.A, MyEnum.B) 以获得更好的性能,但无论如何你的答案对我来说都是正确的。
  • @DodgyCodeException 干杯!我改成EnumSet.of 也好多了。
  • 对不起,这是我的错。代码有效。但是,如果用户设置了空枚举?我应该按降序排列吗?
  • 是的,它是数据表插件。
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
相关资源
最近更新 更多