有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我很好奇。为什么比较器会在每一个表上洗牌 申请开始

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

共 (3) 个答案

  1. # 1 楼答案

    我会使用:

    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 楼答案

    对于表示联系人的对象,toString方法可能不会被覆盖。它将为这些对象返回一个哈希字符串,每次运行应用程序时都会发生变化

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

    • 重写Contact对象中的toString()方法以返回联系人的姓名(1),或
    • Comparator更改为Comparator<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,但可以返回字符串比较给出的任何结果

  3. # 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;
    }
    

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