【问题标题】:Android java custom sorting using ComparableAndroid java自定义排序使用Comparable
【发布时间】:2011-06-19 12:51:51
【问题描述】:
  @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());
      }

我有一个带有昵称的字符串用户列表。我已经禁止了用户、普通用户和朋友用户。

我想将我的好友用户排序到列表顶部,将被禁止的用户排序到列表底部,我想显示它们是 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!

【问题讨论】:

  • 你的类的名字是否包含这个方法myRow

标签: java android sorting


【解决方案1】:

您的代码看起来有点复杂。最简单的方法是从优先级最高的字段开始,然后向下移动到其他字段。示例代码如下:

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);
    }


}

【讨论】:

    【解决方案2】:

    您的 ABC 排序逻辑不起作用。例如,如果您传入两个 USER_TYPE_FRIEND 对象,无论它们各自的顺序如何,compareTo 将始终返回 BEFORE

    您需要通过首先比较用户类型来实现这一点。

    如果它们相等,您可以返回您的 row.compareTo(...) 表达式。

    如果不是,您需要返回之前/之后仅取决于这些类型在您的逻辑中“比较”的方式(即朋友

    【讨论】:

      【解决方案3】:

      我现在的代码:

        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());
          }
        }
      

      谢谢,桑杰!

      【讨论】:

      猜你喜欢
      • 2018-05-13
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      相关资源
      最近更新 更多