2016-12-17 95 views
1

我有一个TreeSet其中的元素有两个属性(姓名和年龄)的对象。每次我想要搜索具有特定名称的对象时,我都必须使用增强型for循环或迭代器。无法使用TreeSet中的contains()方法

我不能使用方法来搜索具有特定名称的对象,因为这个名字是此对象中“封装”。

有没有办法解决这个问题?那就是利用log(n)时间复杂度的一种方法?

由于在TreeSet中所有元素都按名称排序,必须有一个方式,我认为。

什么,我想实现的一个例子:

public Element search(String name) { 
    // if some TreeSet element's name.equals(name), return the Element 
} 

的一个例子是我希望使用:

public Element search(String name) { 
    for (Element entry : tree) { 
     if (entry.getName().equals(name)) { 
      return entry; 
     } 
    } 

    return null; 
} 
+0

为什么这是一个集而不是地图从名字到凡是? – user2357112

+0

@ user2357112:因为这是一项任务,我不允许更改集合。 –

+0

然后,分配可能要么使用O(n)查找,要么避免执行这些查找操作。还有可能你应该建立和维护一个辅助地图,或者这个任务不一致,或者你误解了某些东西。 – user2357112

回答

0

在一般情况下,我们现有的TreeSet<Person>无法使用用于按名称查找。树组将根据您为该组定义的顺序进行组织。

一般来说,您需要一个单独的Map<String, Person>,它保存原始集合中所有Person对象的映射。这需要保持集合和地图的一步。

但是,如果你的树设置的顺序是姓名和年龄的组合,名为提供主要排序,那么你可以使用TreeSet.tailSet得到了一套“尾巴”开始了给定的名称。然后迭代尾部集合直到名称更改。

0

TreeSet安排基于其Comparator项目。

您可以实现比较操作由名头进行排序。