gpt4 book ai didi

java - 我什么时候应该实现比较器?

转载 作者:行者123 更新时间:2023-12-02 13:07:23 25 4
gpt4 key购买 nike

所以我正在学习 Comparator 和 Comparable,并且遇到以下问题。我有一个类:

public class PhoneBook implements Comparator<Name>{

private SortedMap<Name, Integer> directory ;

//class code constructor etc.

//this is the method that the compiler wants if implementing Comparator
@Override
public int compare(Name o1, Name o2) {

return o1.firstName.compareTo(o2.firstName);
}
}

另一个类 Name 实现了 Comparable,并且在构造函数中具有两个字符串first 和last。我不完全理解的是 Comparator 的功能,我已经阅读了 Java 文档,并且我知道它用于对元素进行不同的排序,而无需更改示例中的 Name 类,在某些情况下它也可以允许空值,但是这个声明在我的类构造函数中工作正常,并且我根本不需要在 PhoneBook 类中实现比较器接口(interface):

Public PhoneBook(ArrayList<Name> names, ArrayList<Integer> phones) {
this.directory = new TreeMap<Name, Integer>(new Comparator<Name>(){

@Override
public int compare(Name o1, Name o2) {

return o1.firstName.compareTo(o2.firstName);
}

});
//other constructor code to populate map
}

并且实现了我想要它实现的功能,而不需要通过 PhoneBook 类实现 Comparator 接口(interface)。我的问题是一个类什么时候可能想要实现 Comparator 接口(interface)?是否有一种不同的方法可以让 map 使用不同的排序方法(而不是类名称中的 Comparable 接口(interface)提供的排序方法),而无需在初始化时向其传递匿名类?如果这个问题不够清楚,或者不适合这个网站,我很抱歉。

编辑:我理解 Comparable 与 Comparator 的争论以及何时使用它们。我的问题更多是关于如何使用比较器。您可以在初始化时对 Map 进行排序而不传递新的 Comparator 吗?类什么时​​候实现这个接口(interface)是个好主意?

最佳答案

实现Comparator的类不应该做任何其他事情。

由于大多数此类类仅在一个地方使用,因此以未命名的方式实现它们是很常见的,即作为匿名类,就像您在第二个示例中所做的那样。

但是,如果您希望比较器可重用,最好为其创建一个独立的类,例如在您的示例中将其命名为 FirstNameComparator

请注意,在 Java 8+ 中,使用 lambda 表达式而不是匿名类要容易得多(因为从逻辑上讲,这就是 lambda 表达式),以及用于可重用比较的方法引用。

// Using anonymous class (Java 1.2+)
this.directory = new TreeMap<Name, Integer>(new Comparator<Name>() {
@Override
public int compare(Name n1, Name n2) {
return n1.getFirstName().compareTo(n2.getFirstName());
}
});
// Reusable named class (Java 1.2+)
public final class FirstNameComparator implements Comparator<Name> {
@Override
public int compare(Name n1, Name n2) {
return n1.getFirstName().compareTo(n2.getFirstName());
}
}

// Then use it like this:
this.directory = new TreeMap<Name, Integer>(new FirstNameComparator());
// Using lambda expression (Java 8+)
this.directory = new TreeMap<Name, Integer>(
(n1, n2) -> n1.getFirstName().compareTo(n2.getFirstName())
);
// Using method reference (Java 8+)
public class PhoneBook {
public PhoneBook(ArrayList<Name> names, ArrayList<Integer> phones) {
this.directory = new TreeMap<Name, Integer>(PhoneBook::compareFirstName);
// other constructor code
}
private static int compareFirstName(Name n1, Name n2) { // public, if reusable
return n1.getFirstName().compareTo(n2.getFirstName());
}
// other PhoneBook code
}
// Using Comparator helper (Java 8+)
this.directory = new TreeMap<Name, Integer>(Comparator.comparing(Name::getFirstName));

关于java - 我什么时候应该实现比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44090689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com