2011-06-19 19 views
2
@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ユーザーリストがあります。私は、ユーザー、通常のユーザー、および友人のユーザーを禁止しています。AndroidのJavaソートの比較

友達のユーザーをリストの一番上に並べ替え、禁止されたユーザーをリストの一番下に並べ替えるのが好きで、私はそれらを表示するのが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) 

私はこの取得:あなたのABCのソートロジックは動作しません

06-19 14:43:46.586: ERROR/AndroidRuntime(23434): java.lang.IllegalArgumentException: Comparison method violates its general contract! 
+0

このメソッドの名前は、「myRow」ですか? –

答えて

4

コードは少し複雑です。最も簡単な方法は、優先順位の高いフィールドから開始し、他のフィールドに移動することです。サンプルコードは次のようになります。今

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


} 
1

を。たとえば、2つのUSER_TYPE_FRIENDオブジェクトを渡すと、それぞれの注文が何であれ、compareToは常にBEFOREを返します。

まず、ユーザータイプを比較してこれを実装する必要があります。

等しい場合は、row.compareTo(...)という表現を返すことができます。

あなたのロジック(つまり、友人<は、<が禁止されています)で、それらのタイプが「比較」されているかどうかだけに応じて、前/後に戻る必要があります。

0

私のコード:

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

おかげで、サンジェイ!

+0

あなたは大歓迎です。 :) BTW、物事を行うJavaの方法に従い、camelcase(つまり、 'my_type'の代わりに' UserType'や 'myRow'の代わりに' MyRow')を使用してクラス/列挙型/インターフェースの名前を付けてください。推奨読者:http://www.oracle.com/technetwork/java/codeconvtoc-136057.html –