13

我是 java 新手,我并没有真正了解如何使用比较器接口。我有一ArrayList堂课和一Item堂课。在课堂上我写道:InventoryItemItem

public class Item implements Comparator<Item> {
    //stuff
    ...
    @Override
    public int compare(Item a, Item b) {
        if (a.getID().compareToIgnoreCase(b.getID())>0)
            return 1;
        else if (a.getID().compareToIgnoreCase(b.getID())<0)
            return -1;
        else
            return 0;
    }
}

getID() 方法只给出了 id,我必须用它来按字母顺序排列项目。我不确定这是否正确,它让我放了@Override注释,我不知道为什么。我还写了一个界面,上面写着:

 public interface Comparator<Item>
{
    int compare(Item a, Item b);
}

我不确定那一点。另外,如何实现此方法来对库存类中创建的数组列表进行排序?

谢谢,如果我的问题没有意义或需要澄清,请告诉我。

4

5 回答 5

16

编辑:首先,有几件事:

  1. @Override注释不应该是强制性的。如果 Eclipse 想让您戴上它,请不要担心。
  2. 不要编写自己的 Comparator 接口。删除该定义 NAO 并使用 Java 提供的定义。重新发明轮子可能以大约 15 种不同的方式违反了计算机编程的潜规则。import java.util.Comparator;在代码的最顶部(在这些使用public classa) 使用 Java 提供的版本和 b) 使您的代码与世界上几乎所有其他存在的东西兼容。

Comparator 接口不用于创建可以将自身排序的类。这是 Comparable 接口。

两者都是相似的,所以我将在这里描述两者。

java.util.Comparator

如您所知,Comparator 接口有一种方法:compare. Comparator 是通用的(使用尖括号<>)并采用它将在<>. 问题是 Comparator 用于比较其他类的项目。例如,我可以创建一个比较器,java.lang.Integers它返回与“自然顺序”相反的结果(整数通常是如何排序的)。

比较器主要用于在其他对象不按自然顺序时为其他对象提供一种对其参数进行排序的方法。例如,java.util.TreeSet该类使用 Comparator 来实现其排序功能。

java.lang.Comparable

Comparable 的目的是说一个对象可以进行比较。它也是通用的,并采用可以与之比较的类型。例如,Comparable<String>可以将 a 与字符串进行比较。

Comparable 有一种方法:compareTo(). 与 Comparator 不同compare()compareTo它采用一个参数。它的工作方式类似于compare,除了它使用调用对象作为一个参数。所以,comparableA.compareTo(comparableB)是一样的comparator.compare(comparableA, comparableB)

Comparable 主要建立对象的自然顺序,是比较对象的默认方式。比较器的作用是在对数据比较或排序有不同需求时覆盖这种自然顺序。

数组列表排序

要对 a 进行排序List,您可以使用已经可用的方法:向下滚动sortjava.util.Collectionsclass。一种方法需要一个比较器,另一种不需要。sort是静态的;使用Collections.sort(...),不是Collections c = new Collections(); c.sort(...)。(Collections反正甚至没有构造函数,所以。)

于 2013-04-21T00:19:33.180 回答
11

要使用Comparator接口,您必须实现它并将其作为匿名类传递给Collections.sort(List list, Comparator c)作为第二个参数。

如果您只想将列表传递给Collections.sort(List list)那么您的Item类必须实现Comparable接口。

因此,在这两种情况下,Collections.sort方法都知道如何对列表中的元素进行排序

这是一些示例代码:

项目类实施Comparable+ 库存持有项目清单

public class Item implements Comparable<Item> {

    String id = null;

    public Item(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return id;
    }

    @Override
    public int compareTo(Item o) {
        return - id.compareToIgnoreCase(o.id);
    }
}


public class Inventory {

    List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);
    }

    public static void main(String[] args) {
        Inventory inventory = new Inventory();
        inventory.addItem(new Item("2"));
        inventory.addItem(new Item("4"));
        inventory.addItem(new Item("1"));
        inventory.addItem(new Item("7"));

        Collections.sort(inventory.items, new Comparator<Item>() {
            @Override
            public int compare(Item o1, Item o2) {
                return o1.id.compareToIgnoreCase(o2.id);
            }
        });
        System.out.println(inventory.items);

        Collections.sort(inventory.items);
        System.out.println(inventory.items);

    }
}

输出

[1, 2, 4, 7] // ascending
[7, 4, 2, 1] // descending since the compareTo method inverts the sign of the comparison result.
于 2013-04-21T00:23:58.777 回答
3

您正在混淆接口ComparatorComparable.

比较器: http: //docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

可比:http ://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

Comparator 的目的是一个可以传递给需要排序的操作的类(当场匿名声明或以其他方式声明),它定义了将在项目上使用的排序。比较器将在需要排序的类之外使用,如果有另一种方法要对其进行排序。

Comparable 的目的是说(实现 Comparable 的)类具有自然顺序 - 这就是它的本质。如果您需要排序的类具有自然排序,则将其定义为 Comparable。(实现 Comparable 排序顺序的类仍然可以被 Comparator 覆盖。另一方面,如果该类不是 Comparable ,则还必须传递 Comparator 才能进行排序。)

于 2013-04-21T00:13:33.883 回答
0

使用@Override注释是 eclipse、netbeans 等编辑器的标准做法,用于通知开发人员他正在覆盖/实现父类/接口方法。它是可选的。

不要在您的 Item 类中实现此接口。创建一个类并实现Comparator接口。

public class ItemCompare implements Comparator<Item> {

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

然后,在您的主要课程中,执行以下操作:

ArrayList al = new ArrayList<Item>

Collections.sort(al, new ItemCompare())
于 2013-04-21T00:19:36.717 回答
0

你实现了错误的接口,你想要Comparable

于 2013-04-21T00:11:57.760 回答