如果我想检索和更新存储在TreeSet中的对象怎么办?
之所以这样问,是因为我想能够维护一些数据结构来存储学生。我希望它可以按照成绩排序(这是Student的一个实例变量),并且即使在我更新一个或多个成绩后,它仍然需要保持排序。
因此,在简要查看Java集合后,我决定使用TreeSet,并设置一个比较器,通过他们的成绩来比较两个学生。问题是,我刚发现TreeSet没有get()方法!
任何帮助和建议将不胜感激。
如果我想检索和更新存储在TreeSet中的对象怎么办?
之所以这样问,是因为我想能够维护一些数据结构来存储学生。我希望它可以按照成绩排序(这是Student的一个实例变量),并且即使在我更新一个或多个成绩后,它仍然需要保持排序。
因此,在简要查看Java集合后,我决定使用TreeSet,并设置一个比较器,通过他们的成绩来比较两个学生。问题是,我刚发现TreeSet没有get()方法!
任何帮助和建议将不胜感激。
你可以使用迭代器从TreeSet中检索元素。你可以尝试像这样:
Iterator<Integer> it = treeSet.iterator();
Integer current = 0;
while(it.hasNext() ) {
current = it.next();
}
希望这有所帮助。private SortedMap<Integer,Set<Student>> _studentsByGrade = new TreeMap<Integer,Set<Student>>();
public void updateStudent(Student student, int oldGrade, int newGrade)
{
getOrCreateContainer(oldGrade).remove(student);
getOrCreateContainer(newGrade).add(student);
student.setGrade(newGrade);
}
public Set<Student> getOrCreateContainer(int grade)
{
Set<Student> set = _studentsByGrade.get(grade);
if(set==null)
{
set = new HashSet<Student>();
_studentsByGrade.put(grade, set);
}
return set;
}
不要忘记在你的学生类中重载equals和hashcode方法以确保其正确工作。
如果您想轻松快速地进行Java索引,请检查cqengine库,但上面介绍的解决方案对您的使用也是可以的。
boolean contains(E input)
和E ceiling(E input)
来实现。实际上,根据ceiling方法的Javadoc:
返回此集合中大于或等于给定元素的最小元素;如果没有这样的元素,则返回{@code null}。
因此,如果我们预先知道元素在集合中,则对ceiling的调用保证返回等于输入的元素。
import java.util.Comparator;
import java.util.TreeSet;
public class ExtendedTreeSet<E> extends TreeSet<E> {
public ExtendedTreeSet(Comparator<? super E> comparator) {
super(comparator);
}
public E get(E input) {
return this.contains(input) ? this.ceiling(input) : null;
}
}
TreeSet
在插入时进行排序。如果按学生的成绩排序并在添加后进行修改,则项目不再排序(与之前相同的顺序)。
TreeSet
还不使用equals()
来确定元素是否已经添加,而是使用比较器(相同的顺序=相同的项)。因此,如果两个学生有相同的成绩,则只添加其中一个。从Javadoc中可以看出:
您可以使用TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此通过此方法判断为相等的两个元素在集合的角度上是相等的。
HashSet
,并且每当需要时按成绩对学生进行排序(创建一个新列表包含学生,对其进行排序并迭代)。这是我为自己找到的问题答案,但我认为集合应该有一个get(elem)
方法,但正如你所知道的那样,实际上并没有。
给你:
set.subSet(elem,true,elem,true).floor(elem);
我很惊讶之前没有人想到过这个。
需要点赞 :D
if(set.contains(searchingObject)) {
addonPartNumber = p.floor(searchingObject);
}
E ceiling(E e) E floor(E e)
E higher(E e) E lower(E e)
你也可以使用 for-each 循环来获取 TreeSet
中的所有元素。
TreeSet<String> words = new TreeSet<String>();
for(String w : words) {
System.out.println(w);
}
TreeSet
中的唯一单词复制到列表中,这样你就可以使用 get();
了。
List
”而不是“毫无意义”。 - piet.tMap
根据某个键来存储对象。 - Rohit JainSortedSet
中使用get()
是有意义的。 - bryant1410