【问题标题】:Strange behaviour: Java Comparator randomizes list entries奇怪的行为:Java Comparator 随机化列表条目
【发布时间】:2009-07-12 14:38:24
【问题描述】:

我很好奇。比较器在每个条目上随机播放条目的原因可能是什么 申请开始了吗?

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

首次应用启动:

第二次应用启动

正如在一个答案中提到的那样

Comparator 实际上比较一个自定义对象 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();
}
  }

【问题讨论】:

  • 需要更多代码。你是如何使用这个比较器的?
  • 我会仔细看看 toString() 方法的作用。例如,它可能只列出对象的序列号。

标签: java blackberry list


【解决方案1】:

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

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

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

对于 (1),将其添加到您的联系人类中:

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

您甚至不需要检查 0,但您可以返回字符串比较给出的任何内容。

【讨论】:

  • 正确! =) ((ContactsListObject)o1).get_contactFirstName().compareTo(((ContactsListObject)o2).get_contactFirstName())
【解决方案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());;
 }

}

【讨论】:

  • Comparator 至少需要 JRE 1.5,不是吗?
  • 它们在 J2ME 中无法工作 - 必须坚持丑陋的铸造!
【解决方案3】:

你的第一个例子与

基本相同
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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2017-03-29
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多