如何在java中实现比较器

时间:2014-09-12 04:17:53

标签: java collections comparator

该程序用于实现比较器

一切都很好

import java.util.*;
public class Solocomparator implements Comparator<Solocomparator> {

    int age;
    String name;
    Solocomparator(int age,String name){
        this.age=age;
        this.name=name;
    }

    public int compare(Solocomparator nam) {
        return (this.name).compareTo(nam.name);
    }

    public static void main(String[] args) {
        ArrayList<Solocomparator> a1=new ArrayList<Solocomparator>();
        a1.add(new Solocomparator(21,"solomon"));
        a1.add(new Solocomparator(26,"solomons"));
        a1.add(new Solocomparator(20,"solomonjking"));
        Collections.sort(a1,new Solocomparator());
        for(Solocomparator i:a1)
            System.out.println(i.age+":" + i.name);        
    }
}

在这个程序中,我已经实现了比较器按年龄对文件列表进行排序, 问题似乎出现在这行代码中

Collections.sort(a1,new Solocomparator());

2 个答案:

答案 0 :(得分:2)

ComparableComparator是两个不同的接口,用于类似目的。 Collections.sort需要一个Comparator,这样您就可以灵活地修改对象的默认方式(或不是,取决于您想要实现的目标)

首先创建一个基础对象,其中包含您需要存储的值...

public class Solomon {
    private int age;
    private String name;

    public Solomon(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

}

然后创建一个Comparator,可以按照您需要的方式比较Solomon的实例...

public class SolomanAgeComparator implements Comparator<Solomon> {

    @Override
    public int compare(Solomon o1, Solomon o2) {
        return o1.getAge() - o2.getAge();
    }

}

和/或

public class SolomanNameComparator implements Comparator<Solomon> {

    @Override
    public int compare(Solomon o1, Solomon o2) {
        return o1.getName().compareTo(o2.getName());
    }

}

然后使用其中任何一个来排序值List ......

List<Solomon> a1 = new ArrayList<Solomon>();
a1.add(new Solomon(21, "solomon"));
a1.add(new Solomon(26, "solomons"));
a1.add(new Solomon(20, "solomonjking"));
Collections.sort(a1, new SolomanNameComparator());

答案 1 :(得分:1)

你不能说,但我的猜测是你的代码没有编译,因为类Solocomparator实际上没有实现Comparator接口所需的方法。

您似乎将ComparatorComparable混为一谈。这些是相关但不同的接口。 Comparator比较两个与比较器不同的对象。您需要使用签名实现一个方法:

public int compare(Solocomparator o1, Solocomparator o2)

另一方面,Comparable对象是一个知道如何将自身与同一类型的另一个对象进行比较的对象。这是您撰写的内容,因此您可能希望您的课程实施Comparable<Solocomparator>,而不是Comparator<Solocomparator>。然后你可以用:

对它进行排序
Collections.sort(a1);

如果您要实施Comparator<Solocomparator>,请从Solocomparator中移除比较代码并将其放在单独的类中。