[英]Android java custom sorting using Comparable
@Override
public int compareTo(final myRow another) {
final int BEFORE =-1;
final int EQUAL = 0;
final int AFTER = 1;
if (this==another) return EQUAL;
if (sorttype==sort_type.SORT_ABC) {
int rv =0;
int sorted =row.toLowerCase().compareTo(another.getRow().toLowerCase());
if (this.getUserType()==user_type.USER_TYPE_BANNED) rv=AFTER;
if (this.getUserType()==user_type.USER_TYPE_NORMAL) rv=sorted;
if (this.getUserType()==user_type.USER_TYPE_FRIEND) rv=BEFORE;
Log.e("sorted", row+" "+this.getUserType()+" - "+rv+" ");
return rv;
} else if (sorttype==sort_type.SORT_LOGINTIME) {
if (this.getUserType()==user_type.USER_TYPE_BANNED) {
return AFTER;
}
if (this.getUserType()==user_type.USER_TYPE_NORMAL) return EQUAL;
if (this.getUserType()==user_type.USER_TYPE_FRIEND) {
//int sorted =row.toLowerCase().compareTo(another.getRow().toLowerCase());
return BEFORE;
}
//return 0;
}
return 0;
//return row.toLowerCase().compareTo(another.getRow().toLowerCase());
}
我有一个String用户列表,带有昵称。 我已禁止用户,普通用户和朋友用户。
我想将我的朋友用户排在列表的顶部,将被禁用的用户排在列表的底部,我想显示它们是ASC风格。
我怎样才能做到这一点?
所以结构是:
Abc (friend)
abrt (friend)
dfgh (friend)
abdfg (normal user)
bnmm (normal user)
wert (normal user)
Andgh (banned user)
Dfghhj (banned user)
Qwer (banned user)
我明白了:
06-19 14:43:46.586: ERROR/AndroidRuntime(23434): java.lang.IllegalArgumentException: Comparison method violates its general contract!
您的代码看起来有点复杂。 最简单的方法是从最高优先级字段开始,然后向下移动到其他字段。 示例代码是:
public class Member implements Comparable<Member> {
static enum Status {
NORMAL(1), FRIEND(2), BANNED(3);
private final int order;
Status(int order) {
this.order = order;
}
public int getOrder() {
return this.order;
}
};
private final String name;
private final Status status;
public Member(final String name, final Status status) {
this.name = name;
this.status = status;
}
@Override
public int compareTo(Member o) {
if (this.status.equals(o.status)) {
return this.name.compareTo(o.name);
} else {
return this.status.compareTo(o.status);
}
}
@Override
public String toString() {
return "Member [name=" + name + ", status=" + status + "]";
}
public static void main(String[] args) throws Throwable {
Member[] members = {
new Member("abrt", Status.FRIEND),
new Member("dfgh", Status.FRIEND),
new Member("abdf", Status.NORMAL),
new Member("wert", Status.NORMAL),
new Member("andgh", Status.BANNED),
new Member("qwer", Status.BANNED)
};
List<Member> lst = Arrays.asList(members);
Collections.sort(lst);
System.out.println(lst);
}
}
您的ABC排序逻辑不起作用。 例如,如果传入两个USER_TYPE_FRIEND
对象,无论它们各自的顺序如何, compareTo
将始终返回BEFORE
。
您需要首先比较usertype来实现这一点。
如果它们相等,则可以返回row.compareTo(...)
表达式。
如果没有,您需要在之前/之后返回,仅取决于您的逻辑中这些类型“比较”的方式(即朋友<正常<禁止)。
我的代码现在:
public enum user_type {USER_TYPE_FRIEND(1), USER_TYPE_NORMAL(2), USER_TYPE_BANNED(3);
private final int order;
user_type(int order) {
this.order = order;
}
public int getOrder() {
return this.order;
}
}
...
@Override
public int compareTo(final myRow another) {
if (sorttype==sort_type.SORT_ABC) {
if (this.getUserType().equals(another.getUserType())) {
return this.getRow().toLowerCase().compareTo(another.getRow().toLowerCase());
} else {
return this.getUserType().compareTo(another.getUserType());
}
}
else {
//LOGINTIME
return this.getUserType().compareTo(another.getUserType());
}
}
谢谢,桑杰!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.