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

Vib*_*ava 2 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);
            }
       }
   });
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

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

Collections.sort(coll, Comparator.nullsLast(new YourComparator()));
Run Code Online (Sandbox Code Playgroud)

您当前的比较器将正常工作,Comparator.nullsLast将处理null元素并使它们最后运行。


如果你需要使用Java 7,您可以确保null通过合适的返回值的值,我们就到年底排序compare依据的空两者均o1o2

  • 如果o1o2都返回0null
  • 如果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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

您可以像这样使用此比较器:

Collections.sort(users, new UserComparator());
Run Code Online (Sandbox Code Playgroud)

如果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);
    }
}
Run Code Online (Sandbox Code Playgroud)