如何使用Comparator接口

我是java的新手,我并没有真正了解如何使用比较器接口。 我在Inventory类和Item类中有一个ItemArrayList 。 在我写的Item类中:

 public class Item implements Comparator { //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 { int compare(Item a, Item b); } 

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

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

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

如果只想将列表传递给Collections.sort(列表列表),则Item类必须具有实现Comparable接口。

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

这是一些示例代码:

实施Comparable + Inventory的物品类,其中包含物品清单

 public class Item implements Comparable { 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 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() { @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. 

编辑:首先,有几件事:

  1. @Override注释不应该是必需的。 如果Eclipse要你把它戴上,不要担心。
  2. 不要编写自己的Comparator接口。 删除该定义NAO并使用Java提供的定义。 重新发明轮子可能以大约15种不同的方式违反了“计算机编程的未说出口代码”。 使用import java.util.Comparator; 在代码的最顶层(在public class之前)到a)使用Java提供的版本和b)使你的代码与世界上存在的几乎所有其他代码兼容。

Comparator接口不用于创建可以使自己按顺序排列的类。 这是Comparable接口。

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

的java.util.Comparator

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

比较器主要用于为其他对象提供一种在参数不按自然顺序排序时的方法。 例如, java.util.TreeSet类为其排序function采用Comparator。

java.lang.Comparable的

可比较的目的是说可以比较一个对象。 它也是通用的,并采用可以与之比较的类型。 例如,可以将Comparable与Strings进行比较。

Comparable有一个方法: compareTo() 。 与Comparator的compare()compareTo接受一个参数。 它像compare一样工作,除了它使用调用对象作为一个参数。 因此, comparator.compare(comparableA, comparableB) comparableA.compareTo(comparableB)comparator.compare(comparableA, comparableB) comparableA.compareTo(comparableB)相同。

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

ArrayList排序

要对List排序,可以使用现有方法:向下滚动以sort java.util.Collections类进行sort 。 一种方法需要比较器,另一种方法不需要。 sort是静态的; 使用Collections.sort(...) ,而不是Collections c = new Collections(); c.sort(...) Collections c = new Collections(); c.sort(...) 。 (无论如何, Collections甚至都没有构造函数,所以meh 。)

您正在混合使用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的目的是一个类(在现场匿名声明或以其他方式声明),可以传递给需要排序的操作,并定义将在项目上使用的排序。 比较器将在需要排序的类的OUTSIDE中使用,如果有另一种方法要对其进行排序。

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

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

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

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

 public class ItemCompare implements Comparator { @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 Collections.sort(al, new ItemCompare())