作为一个示例,我正在开发一个简单的MySortedSet,它实现了SortedSet接口。它用一个简单的数组E []数组备份。用Java对数组排序
我有一个关于这几个问题:
这是类:(我不写整个代码,而不是相关的部分)
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:有一个解释构造函数,因为这是一个有序集合,因此假定的元素进行排序:
如果这个构造函数用于创建有序集合,它是假设d 该元素使用它们的自然排序来排序(即,E 实现了可比较的)。
它得到两个不同的构造函数。一个是无参数的,另一个接受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
方法逻辑。我需要进行二分查找以找到新物品所属的位置,以便我可以在该位置插入新物品并将另一个槽移到右侧。
但我不确定二进制搜索如何在我这里工作,因为我不知道我需要找什么。我得到的项目添加不是要找到的项目。相反,我认为将每个元素与我需要添加的元素进行比较,当我找到最后一个较小的第一个较大的项目时,我将获得第一个较大的项目的索引,将它们移动到右侧并在索引处添加新项目。