如何在不使用 contains 的情况下高效地搜索 TreeSet 中的元素?

问题描述 投票:0回答:1

我对 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 的信息。

java performance search tree iteration
1个回答
0
投票

是否有一种方法可以重做这些,利用它实际上是一棵树的好处,而不仅仅是像有序数组

不。

TreeSet
API 只允许您对
Person
对象进行高效查找,而不仅仅是要比较的属性。你可以构造一个“假”
Person
对象来完成这项工作,并且你可以 maybe 通过调用
getPerson
或类似方法来强制它做
ceiling
来取出一个元素,但这肯定不是
TreeSet 
专为使用而设计。

因为我正在尝试学习/了解更多有关 Sets 和 TreeSet 的信息

学习 Sets 和 TreeSet 的一部分是了解它们不适合的用例。它们不是为此设计的。

© www.soinside.com 2019 - 2024. All rights reserved.