如何使用比较器接口java.util.Comparatorjava.lang.Comparable数组列表排序

2022-09-04 06:55:25

我是Java的新手,我并没有真正了解如何使用比较器接口。我在一个班级和一个班级里有一个s。在课堂上我写道:ArrayListItemInventoryItemItem

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);
}

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

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


答案 1

编辑:首先,有几件事:

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

比较器接口不用于创建可以按顺序排列的类。这是可比较接口。

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

java.util.Comparator

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

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

java.lang.Comparable

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

可比有一种方法: .与比较器不同,它采用一个参数。它的工作方式与 类似,只是它使用调用对象作为一个参数。所以,是相同的。compareTo()compare()compareTocomparecomparableA.compareTo(comparableB)comparator.compare(comparableA, comparableB)

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

数组列表排序

要对 进行排序,可以使用已经可用的方法:向下滚动到 java.util.Collections。一种方法采用比较器,另一种方法则不采用。 是静态的;使用 ,而不是 。(反正甚至没有构造函数,所以嗯。ListsortsortCollections.sort(...)Collections c = new Collections(); c.sort(...)Collections


答案 2

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

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

因此,在这两种情况下,这些方法都知道如何对列表中的元素进行排序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.

推荐