我的目标是对由字符串和布尔值组成的对象列表应用2种排序方式。
我有帐户和活动/非活动状态,因此我想先显示活动状态(对布尔值进行排序),然后再按字母顺序对其余元素进行排序。
例如:
[约翰,不活跃],[克雷格,活跃],[迈克,不活跃],[丹尼斯,不活跃]
我想要拥有:
[Craig,active],[Dennis,inactive],[John,inactive],[Mike,inactive]
我打算使用Comparable <>,但我想知道是否还有另一种方法。
我不想使用Guava或任何其他库。 这也应该用于Android API 21,因此不能使用list.sort()。
谢谢!
答案 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