排序时,在数组列表的最后位置放置一个null或空对象

时间:2016-12-25 15:01:18

标签: java collections

我想对一个对象的数组列表进行排序,其中null或空对象必须最后到达ArrayList。这是我根据两个属性,名称和数量进行排序。

public int compare(Object o1, Object o2) {
        String username1=((User) o1).getName();
        String username2=((User) o2).getName();
        int namecomp=username1.compareTo(username2);
            if(namecomp!=0){
                return namecomp;
            }
            else{
                Integer useramount1= ((User) o1).getAmount();
                Integer useramount2=((User) o2).getAmount();
                 return useramount1.compareTo(useramount2);
            }
       }
   });

2 个答案:

答案 0 :(得分:4)

从Java 8开始,此功能已存在于库中,Comparator.nullsLast

Collections.sort(coll, Comparator.nullsLast(new YourComparator()));

你现在的比较器会起作用, Comparator.nullsLast将处理null个元素,并将它们放在最后。

如果您需要使用Java 7,则可以确保null值在最后排序,方法是从compare返回适当的值,具体取决于o1的无效值和o2

    如果o1o2都是null ,则
  • 返回0 如果o1nullo2不是
  • ,则
  • 返回1 如果o1不是nullo2
  • ,则
  • 返回-1

完整的Comparator类可以像这样实现:

static class UserComparator implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        if (o1 == null) {
            return (o2 == null) ? 0 : 1;
        }
        if (o2 == null) {
            return -1;
        }

        String username1 = o1.getName();
        String username2 = o2.getName();
        int namecomp = username1.compareTo(username2);
        if (namecomp != 0) {
            return namecomp;
        } else {
            Integer useramount1 = o1.getAmount();
            Integer useramount2 = o2.getAmount();
            return useramount1.compareTo(useramount2);
        }
    }
}

我还更正了帖子中的方法签名。

你可以像这样使用这个比较器:

Collections.sort(users, new UserComparator());

如果usernameamount字段都可以为空, 那么你也可以将相同的概念应用于那些:

static class UserComparator implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        if (o1 == null) {
            return (o2 == null) ? 0 : 1;
        }
        if (o2 == null) {
            return -1;
        }

        String username1 = o1.getName();
        String username2 = o2.getName();
        if (username1 == null) {
            return username2 == null ? 0 : 1;
        }
        if (username2 == null) {
            return -1;
        }

        int namecomp = username1.compareTo(username2);
        if (namecomp != 0) {
            return namecomp;
        }

        Integer useramount1 = o1.getAmount();
        Integer useramount2 = o2.getAmount();
        if (useramount1 == null) {
            return useramount2 == null ? 0 : 1;
        }
        if (useramount2 == null) {
            return -1;
        }
        return useramount1.compareTo(useramount2);
    }
}

答案 1 :(得分:0)

  

我正在使用Java 7

要获得更可重复使用的解决方案,您可以使用Bean ComparatorGroup Comparator

  1. BeanComparator允许您对对象中的任何属性进行排序,并允许您控制null的排序位置

  2. GroupComparator允许您将多个Comparator合并为一个Comparator

  3. 所以基本逻辑是:

    BeanComparator name = new BeanComparator(User.class, "getName");
    BeanComparator amount = new BeanComparator(User.class, "getAmount");
    GroupComparator gc = new GroupComparator(name, amount);