作为示例,我正在用 java 开发一个简单的 MySortedSet,它实现了 SortedSet 接口。它由一个简单的数组备份,即 E[] 数组。
我对此有几个问题:
这是类:(我不是在编写整个代码,而是在编写相关部分)
public class MySortedSet<E> implements SortedSet<E>, Iterator<E> {
private E[] array;
private Comparator<? super E> _comparator;
private int size = 0;
private int capacity;
@SuppressWarnings("unchecked")
public MySortedSet() {
this.capacity = 10;
this.array = (E[]) new Object[this.capacity];
// this.array = Array.newInstance(Class<E> var,int size);
// We have to get Class<E> from outside caller.
}
}
问题 3:对 Constructor 有一个解释,因为这是一个排序集,所以假设元素是排序的:
如果此构造函数用于创建排序集,则假定元素使用它们的自然顺序进行排序(即,E 实现 Comparable)。
它有两个不同的构造函数。一种是无参数的,另一种是接受的Comparator<? super E>
。
public MySortedSet() {
this.capacity = 10;
this.array = (E[]) new Object[this.capacity];
// this.array = Array.newInstance(Class<E> var,int size);
// We have to get Class<E> from outside caller.
}
public MySortedSet(Comparator<? super E> comparator) {
this._comparator = comparator;
}
如果comparator
未传入,则应使用自然排序,但我不确定如何完成它,因为我需要以Comparator
某种方式访问compare
方法。请你们推荐我一种调用它的方法,这样我就可以在比较sort
方法对每个元素进行排序时调用它。
对于他们喜欢查看完整代码的人,请参阅此地址:http ://codepaste.net/4ucvsw它并不完美,但我正在努力。
问题 4:代码指南说:
因为搜索特定项目的最快方法是使用二进制搜索,所以您必须确保集合中的项目始终处于排序顺序。这并不像看起来那么难实现。当您插入一个新项目时,您可以假设要插入它的数组已经排序。因此,您需要做的就是在数组中找到新项目所属的位置,将大于新项目的所有内容向右移动一个插槽,然后插入新项目。这称为插入排序。
这是sort
方法逻辑。我需要进行二进制搜索以查找新项目所属的位置,以便我可以在该位置插入新项目并将另一个插槽向右移动。
但我不太确定二分搜索在这里对我有用,因为我不太确定我需要找到什么。我得到的是要添加的项目,而不是要查找的项目。相反,我认为是将每个元素与我需要添加的元素进行比较,当我找到最后一个较小和第一个较大的项目时,我将获得第一个较大项目的索引,将它们向右移动并在索引处添加新项目.