奇怪的行为:Java Comparator随机化列表条目

时间:2009-07-12 14:38:25

标签: java blackberry list

我很好奇。可能是比较器在每个上输入条目的原因 申请开始?

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

Second App Start

alt text

如答案中所述

比较器实际上比较了自定义对象Contact

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

3 个答案:

答案 0 :(得分:14)

您的toString方法可能不会覆盖表示联系人的对象。它将返回这些对象的哈希字符串,每次运行应用程序时都会有所不同。

您可以通过以下两种方式解决此问题:

  • 覆盖toString()对象中的Contact方法以返回联系人姓名(1)或
  • Comparator更改为Comparator<Contact>,以便将Contact个对象作为参数(2)

for(1),将其添加到Contact类:

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

对于(2)你最终会得到这个Comparator实现:

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

你甚至不需要检查&lt; 0或&gt; 0,但你可以返回String比较给出的任何内容。

答案 1 :(得分: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 :(得分:2)

您的第一个示例与

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

如果你覆盖像

这样的toString(),这将有效
public String toString() {
     return _contactFirstName + ' ' + _contactLastName;
}

然而,比较预期字段的比较器更好,如建议的那样。