我想使用布尔类型对ArrayList
进行排序。基本上我想首先显示带有true
的条目。以下是我的代码:
Abc.java
public class Abc {
int id;
bool isClickable;
Abc(int i, boolean isCl){
this.id = i;
this.isClickable = iCl;
}
}
Main.java
List<Abc> abc = new ArrayList<Abc>();
//add entries here
//now sort them
Collections.sort(abc, new Comparator<Abc>(){
@Override
public int compare(Abc abc1, Abc abc2){
boolean b1 = abc1.isClickable;
boolean b2 = abc2.isClickable;
if (b1 == !b2){
return 1;
}
if (!b1 == b2){
return -1;
}
return 0;
}
});
排序前的订单: 真正 真正 真正 假 假 假 假 真正 假 假的
排序后的订单: 假 假 真正 真正 真正 真正 假 假 假 假
答案 0 :(得分:31)
另一种方法是:
Collections.sort(abc, new Comparator<Abc>() {
@Override
public int compare(Abc abc1, Abc abc2) {
return Boolean.compare(abc2.isClickable,abc1.isClickable);
}
});
答案 1 :(得分:15)
在这种情况下,最简单的解决方案之一是将布尔值转换为整数,其中false
为0
且true
为1
。然后返回第二个和第一个的差异。
所以:
int b1 = abc1.isClickable ? 1 : 0;
int b2 = abc2.isClickable ? 1 : 0;
return b2 - b1
应该这样做。
答案 2 :(得分:11)
为什么不使用这样的东西,它更容易和java 8
TransactionScope
输出:true,true,true,false,false
reverseOrder用于第一个为true,在为false之后,在其他情况下为falses为第一个
public void RunDBTransactions() {
try {
using (TransactionScope transactionScope = new TransactionScope()) {
RunOperationsOnFirstDB();
RunOperationsOnSecondDB();
transactionScope.Complete();
}
} catch (TransactionAbortedException tae) {
// Aborted
} catch (Exception ex) {
// Deal with any other issues
}
}
private void RunOperationsOnFirstDB() {
using (SqlConnection connection = new SqlConnection(SQLConnectString)) {
connection.Open();
//Carry out database operations here
}
}
private void RunOperationsOnSecondDB() {
using (SqlConnection connection = new SqlConnection(SQLConnectString)) {
connection.Open();
//Carry out database operations here
}
}
输出:false,false,true,true,true
答案 3 :(得分:9)
我希望首先显示true
值的项目。我的解决方案是:
Collections.sort(m_mall, new Comparator<Mall>(){
@Override
public int compare(Mall mall1, Mall mall2){
boolean b1 = mall1.isClickable;
boolean b2 = mall2.isClickable;
return (b1 != b2) ? (b1) ? -1 : 1 : 0;
}
});
答案 4 :(得分:3)
一个简单的建议是使用对象Boolean
而不是布尔值并使用Collections.sort
。
但是,您必须知道false
将在true
之前,因为true表示为1
,false表示为0
。但是,您可以按相反的顺序更改算法和访问。
编辑:正如soulscheck所述,您可以使用Collections.reverseOrder
来恢复比较器强加的排序。
答案 5 :(得分:2)
Java 8:
Collections.sort(abc, (abc1, abc2) ->
Boolean.compare(abc2.isClickable(), abc1.isClickable()));
答案 6 :(得分:1)
也有可能。
myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));
答案 7 :(得分:1)
使用Kotlin,您可以执行以下操作:
listOfABCElements.sortBy { it.isClickable }
输出:true,true,true,false,false
反向:
listOfABCElements.sortByDescending { it.isClickable }
输出:false,false,true,true,true