2009-07-12 64 views
2

我很好奇。比較器在每個 應用程序啓動時洗牌的原因是什麼?奇怪的行爲:Java比較器隨機化列表條目

final static class ContactsListComparator implements Comparator 
{       
    public int compare(Object o1, Object o2) 
    { 
     if((o1.toString().compareTo(o2.toString()))<0) 
     { 
      return -1; 
     } 
     if((o1.toString().compareTo(o2.toString()))>0) 
     { 
      return 1; 
     } 
     else 
     { 
      return 0; 
     } 
    }  
}  

第一應用開始:

alt text

第二應用開始

alt text

作爲一個提到的答案

的比較實際上是一個比較自定義對象聯繫人

public class Contact 
{ 
    // Members 
    private String _contactFirstName; 
    private String _contactLastName; 
    private long _contactLastModified; 

// Constructor 
public Contact() 
{ 
    set_contactLastModified(); 
} 

public Contact(String contactFirstName) 
{ 
    _contactFirstName = contactFirstName; 
    set_contactLastModified(); 
} 

// Accessable Getters 
public String get_contactFirstName() 
{ 
    return _contactFirstName; 
} 

public String get_contactLastName() 
{ 
    return _contactLastName; 
} 

public long get_contactLastModified() 
{ 
    return _contactLastModified; 
} 

public void set_contactLastModified() 
{ 
    _contactLastModified = System.currentTimeMillis(); 
} 
    } 
+0

需要更多的代碼。你如何使用這個比較器? – Pierre 2009-07-12 14:44:55

+0

我會仔細看看toString()方法的作用。例如,它可能只列出對象的序列標識。 – 2009-07-12 14:48:04

回答

14

您的toString方法可能不會覆蓋表示聯繫人的對象。它將爲這些對象返回一個哈希字符串,每次運行應用程序時都會有所不同。

可以解決這個問題通過以下兩種方式:

  • 覆蓋在你的Contact對象返回的聯繫人的姓名toString()方法(1),或
  • 更改ComparatorComparator<Contact>因此獲得Contact對象作爲參數(2)

爲(1),將它添加到您的聯繫人類:

@Override public String toString() { 
    return get_contactFirstName(); 
} 

爲(2)你會與此比較的實施結束了:

final static class ContactsListComparator implements Comparator<Contact> {       
    public int compare(Contact o1, Contact o2) { 
     return contact1.get_contactFirstName().compareTo(contact2.get_contactFirstName()); 
    } 
} 

你甚至都不需要檢查的< 0或> 0,但你可以返回任何字符串比較給人。

+0

正確! =)((ContactsListObject)o1).get_contactFirstName()。compareTo(((ContactsListObject)o2).get_contactFirstName()) – 2009-07-12 14:54:08

2

我會用:

final static class ContactsListComparator implements Comparator<Contact> 
{ 
public int compare(Contact c1,Contact c2) 
{ 
int i=c1.get_contactLastName().compareTo(c2.get_contactLastName()); 
if(i!=0) return i; 
return c1.get_contactFirstName().compareTo(c2.get_contactFirstName());; 
} 

} 
2

你的第一個例子是基本相同

final static class ContactsListComparator implements Comparator {       
    public int compare(Object o1, Object o2) { 
     return o1.toString().compareTo(o2.toString()); 
    }  
} 

這工作,如果你喜歡

public String toString() { 
    return _contactFirstName + ' ' + _contactLastName; 
} 

覆蓋的toString()但是,比較目標領域的比較比較好,正如已經提出的那樣。