作为示例,我在java中开发了一个简单的MySortedSet<E>
,它实现了SortedSet<E>
接口。它使用一个简单的数组E[] array
进行备份。
我有几个问题:
这是班级:(我不是在编写整个代码,而是编写相关部分)
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.
}
}
问题1:有人可以告诉我是否有更好的解决方案在构造函数中创建新数组而不是this.array = (E[]) new Object[this.capacity];
答案 0 :(得分:1)
ArrayList<E>
中的 Object[]
stores the elements,原始值会自动生成,并且assigns null
to holes会被删除的元素留下。
实施Comparable<E>
的类必须实现int compareTo(E other)
,其工作方式与Comparator
的{{3}}类似。您可以检查内部比较器null
并回退对象的自然顺序,或者您可以定义内部“使用自然排序”比较器实现。
compare(E o1, E o2)
是一种最小化定位项目或项目应插入排序列表的位置所需的比较次数的方法。您可以从列表的中点开始,而不是从第一个元素开始检查每个元素。如果所寻找的物品应该在找到的元件之前,则向前移动一半并重复;否则转移到最后并重复。每次重复时,使用前一个下限/上限和中点作为新子列表,每个步骤中的元素数量减半。
考虑尝试猜测1到100之间的数字,每次告诉你是否猜到太高或太低。
答案 1 :(得分:1)
要么你应该继续做你在这里做的事情,要么你应该把它保持为Object[]
并在你输出时投出值。 (例如,ArrayList
实现执行后者。)
答案 2 :(得分:1)
您可以更改代码以删除不安全的强制转换:
public MySortedSet(Class<E> clazz) {
capacity = 10;
array = Array.newInstance(clazz, capacity);
}
虽然它强制客户端代码提供Class<E>
对象,但这是一个非常常见的代码模式,用于解决这类问题(在构造函数中需要一个类型化的Class
对象)