3

我想按对象拥有的字符串对对象进行排序。只是想知道这有意义吗?以前我只使用过Arrays.sort(BlahList);,但现在我可以有很多对象,而不仅仅是一个字符串数组列表。

public class Contact implements Comparable
{
    private string name;

    public compareTo (Contact Contact1)
    {
        return this.name.compareTo(Contact1.name);
    }
}

在我的主要方法中:

Collections.sort(ContactList);

我还想知道如果名称是年龄,这是否适用于整数?

4

4 回答 4

2

首先,您应该键入Comparable界面:

public class Contact implements Comparable<Contact>

其次,你应该为你的参数/变量使用前导小写:

public compareTo (Contact contact)

第三,除非必要,否则不要使用this.- 这只是代码混乱:

return name.compareTo(contact.name);

最后,是的,您可以这样比较年龄:

return age - contact.age; // order youngest to oldest

或者更清洁的方式(感谢您指出JB):

return Integer.compareTo(age, contact.age);

这整个类应该是这样的:

public class Contact implements Comparable<Contact> {
    private string name;

    public int compareTo(Contact contact) {
        return name.compareTo(contact.name);
    }
}

int注意:您的方法的代码中缺少返回类型compareTo()

要改为比较年龄,请将compareTo()方法替换为:

public int compareTo(Contact contact) {
    return Integer.compareTo(age, contact.age);
}
于 2013-05-13T14:26:14.363 回答
0

它适用于所有人。如果是 int 你需要在 compareTo 方法中编写以下代码

return this.age-contact1.age// for ascending order contact1.age-this.age // for descending order

于 2013-05-13T14:27:08.670 回答
0

如果您想要多个比较器,那么我建议您使用Comparator接口:

对于名称比较:

public class NameCompare implements Comparator<Contact> {

    @Override
    public int compare(Contact a, Contact b) {
        if (a.getName().compareToIgnoreCase(b.getName())>0)
            return 1;
        else if (a.getName().compareToIgnoreCase(b.getName())<0)
            return -1;
        return 0;
    }
} 

年龄比较:

public class AgeCompare implements Comparator<Contact> {

        @Override
        public int compare(Contact a, Contact b) {
            if (a.getAge() > b.getAge())
                return 1;
            else if (a.getAge() < b.getAge())
                return -1;
            return 0;
        }
    } 

总的来说,您只需传递所需的Comparator

ArrayList al = new ArrayList<Contact>

Collections.sort(al, new NameCompare())

Collections.sort(al, new AgeCompare())
于 2013-05-13T14:46:30.653 回答
0

在 Java 7 中,您可以使用 Integer.compare(age, contact.age)。它(几乎)与 (x < y) 相同?-1 : ((x == y) ? 0 : 1); 但更具可读性(Integer.compare 并没有说它会返回那些确切的数字,但 Oracle 的实现会,它可以返回任何其他正数而不是 1 和负数而不是 -1)

顺便提一句。不要使用 age-contact.age,因为 Integer.MIN_VALUE-Integer.MAX_VALUE = 1

对于复杂的比较器(例如,首先按名称,然后按年龄,如果名称相等)我建议使用一些库,如 google guava。

于 2013-05-13T14:47:50.380 回答