我对 Java 及其库很陌生,所以这个问题可能是一个愚蠢或明显的问题。 假设我有一堂这样的课:
public class Person implements Comparable<Person>
{
private String nif;
private String name;
private double salary;
// Assume the usual gets, sets, deep clone and etc.
public boolean equals(Object o)
{
if(this == o)
return true;
if(o == null || this.getClass() != o.getClass())
return false;
Person p = (Person) o;
return ((this.name.equals(p.getName()))
&& (this.code.equals(p.getCode()))
&& (this.salary == p.getSalary()));
}
public int compareTo(Person p)
{
return this.code.compareTo(p.getCode());
}
public static Comparator<Person> PersonCodeComparator = new Comparator<Person>()
{
public int compare(Person p1, Person p2)
{
String s1 = p1.getCode();
String s2 = p2.getCode();
return s1.compareTo(s2);
}
};
}
在另一个类或主函数中,我在以下位置使用它:
TreeSet<Person> peopleSet = new TreeSet<>(Person.PersonCodeComparator);
到目前为止,我了解到 TreeSet add、contains 等在遍历 TreeSet 时是为了高效而构建的。但是,当我尝试创建方法来查找 TreeSet 上是否存在某个人并根据代码或名称获取该人的文件时,我很确定它没有使用树应该允许的二分搜索.
而不是这个:
public boolean existsPerson(String code)
{
for(Person p : peopleSet) {
if(code.equals(p.getCode())) {
return true;
}
}
return false;
}
public Employee getPerson(String code)
{
for(Employee p : peopleSet) {
if(e.getCode().equals(code)) {
return e.clone();
}
}
return null;
}
这让我认为它基本上是对有序集的线性搜索,是否有一种方法可以重做这些,利用它实际上是树而不只是像有序数组的好处?必须有,否则我很困惑除了排序之外还需要什么 Comparator 和 Comparable 类。 我搜索了其他几个问题,但没有找到与我的问题相符的答复。我也不是在寻找需要使用其他方式存储的回复,因为我正在尝试学习/理解更多有关 Sets 和 TreeSet 的信息。
是否有一种方法可以重做这些,利用它实际上是一棵树的好处,而不仅仅是像有序数组
不。
TreeSet
API 只允许您对 Person
对象进行高效查找,而不仅仅是要比较的属性。你可以构造一个“假” Person
对象来完成这项工作,并且你可以 maybe 通过调用 getPerson
或类似方法来强制它做 ceiling
来取出一个元素,但这肯定不是 TreeSet
专为使用而设计。
因为我正在尝试学习/了解更多有关 Sets 和 TreeSet 的信息
学习 Sets 和 TreeSet 的一部分是了解它们不适合的用例。它们不是为此设计的。