在API 21中组合多种排序的最佳方法

时间:2018-07-24 22:10:46

标签: java android sorting

我的目标是对由字符串和布尔值组成的对象列表应用2种排序方式。

我有帐户和活动/非活动状态,因此我想先显示活动状态(对布尔值进行排序),然后再按字母顺序对其余元素进行排序。

例如:

[约翰,不活跃],[克雷格,活跃],[迈克,不活跃],[丹尼斯,不活跃]

我想要拥有:

[Craig,active],[Dennis,inactive],[John,inactive],[Mike,inactive]

我打算使用Comparable <>,但我想知道是否还有另一种方法。

我不想使用Guava或任何其他库。 这也应该用于Android API 21,因此不能使用list.sort()。

谢谢!

2 个答案:

答案 0 :(得分:2)

没有Java 8或某些第三方库,没有任何魔术/简便的方法可以做到这一点。您将必须实现Comparable并自己完成繁重的工作:

public class Person implements Comparable<Person> {

    private final boolean isActive;
    private final String name;

    @Override
    public int compareTo(Person other) {
        if (isActive && !other.isActive) {
            return -1;
        } else if (!isActive && other.isActive) {
            return 1;
        } else {
            return name.compareTo(other.name);
        }
    }
}

答案 1 :(得分:0)

像这样简单地创建一个新的ace_array

Comparator

最小测试示例:

public class AccountComparator implements Comparator<Account> {

    @Override
    public int compare(Account o1, Account o2) {
        if (o1.isActive() && !o2.isActive()) {
             return -1;
        }
        if (!o1.isActive() && o2.isActive()) {
            return 1;
        }
        return o1.getName().compareTo(o2.getName());
    }
}

具有预期的输出

public static void main(String[] args) {
    Account account2 = new Account("B", true);
    Account account4 = new Account("D", false);
    Account account3 = new Account("C", true);
    Account account1 = new Account("A", false);

    List<Account> list = new ArrayList<>();
    list.add(account1);
    list.add(account2);
    list.add(account3);
    list.add(account4);

    Collections.sort(list, new AccountComparator());

    list.forEach(System.out::println);
}

或使用lambda表达式:(感谢@Wow使用Account{name='B', active=true} Account{name='C', active=true} Account{name='A', active=false} Account{name='D', active=false}

Comparator.comparing