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

Hen*_*sel 2 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;
        }
    }    
}    
Run Code Online (Sandbox Code Playgroud)

首次应用开始:

替代文字

第二个App Start

替代文字

如答案所述

比较器实际上比较了自定义对象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();
}
  }
Run Code Online (Sandbox Code Playgroud)

Jor*_*orn 14

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

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

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

对于(1),将其添加到您的Contact类:

@Override public String toString() {
    return get_contactFirstName();
}
Run Code Online (Sandbox Code Playgroud)

对于(2)你最终会得到这个比较器的实现:

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

你甚至不需要检查<0或> 0,但你可以返回字符串比较给出的任何内容.