Java可比较问题

时间:2013-05-13 14:22:12

标签: java

我想按照他们拥有的字符串对对象进行排序。只是想知道这有意义吗? 在此之前我只使用过Arrays.sort(BlahList);但是现在我可以拥有许多对象而不仅仅是字符串的arraylist。

public class Contact implements Comparable
{
    private string name;

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

在主要方法中我有:

Collections.sort(ContactList);

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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

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

答案 3 :(得分:0)

在java 7中,您可以使用Integer.compare(age,contact.age)。 它(几乎)与(x

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

对于复杂的比较器(例如,首先按名称,然后按年龄,如果名称相同)我建议使用像谷歌番石榴这样的库。