如何使用Comparator接口

bas*_*tar 12 java sorting interface comparator

我是java的新手,我真的不知道如何使用比较器接口.我有一个ArrayListItem以S Inventory类和Item类.在Item我写的课上:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

getID()方法只提供id,我必须使用它来按字母顺序排列项目.我不确定这是不对的,它让我把@Override注释,我不知道为什么.我还写了一个界面,只是说:

 public interface Comparator<Item>
{
    int compare(Item a, Item b);
}
Run Code Online (Sandbox Code Playgroud)

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

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

ame*_*eed 16

编辑:首先,有几件事:

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

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

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

的java.util.Comparator

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

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

java.lang.Comparable的

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

可比较有一种方法:compareTo().与比较器不同compare(),compareTo需要一个参数.它的作用类似于compare,除了它使用调用对象作为一个参数.所以,comparableA.compareTo(comparableB)是一样的comparator.compare(comparableA, comparableB).

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

ArrayList排序

要排序List,你可以使用的方法已经可用:向下滚动到sortjava.util.Collections.一种方法需要比较器,另一种方法不需要.sort是静态的; 使用Collections.sort(...),而不是Collections c = new Collections(); c.sort(...).(Collections无论如何都没有构造函数,所以......)


A4L*_*A4L 11

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

如果您只想将列表传递给Collections.sort(列表列表),那么您的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);

    }
}
Run Code Online (Sandbox Code Playgroud)

产量

[1, 2, 4, 7] // ascending
[7, 4, 2, 1] // descending since the compareTo method inverts the sign of the comparison result.
Run Code Online (Sandbox Code Playgroud)