0

作为一个示例,我正在开发一个MySortedSet<E>实现SortedSet<E>接口的简单的java。它由一个简单的数组备份,即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];

4

3 回答 3

1

要么你应该继续做你正在做的事情,要么你应该把它保留为一个Object[]并在你输出它们时转换这些值。(ArrayList例如,实现是后者。)

于 2012-05-28T06:30:08.627 回答
1

您可以更改代码以删除不安全的演员表:

public MySortedSet(Class<E> clazz) {
    capacity = 10;
    array = Array.newInstance(clazz, capacity);
}

尽管它强制客户端代码提供Class<E>对象,但这是一种非常常见的代码模式,用于解决此类问题(您需要Class在构造函数中使用类型化对象)。

于 2012-05-28T07:56:51.360 回答
1

ArrayList<E> 将元素存储在一个 plainObject[]中,原始值是自动装箱的,它分配null给被移除元素留下的空洞。

实现的类Comparable<E>必须实现与fromint compareTo(E other)类似的工作方式。您可以检查内部比较器并返回对象的自然顺序,也可以定义内部“使用自然顺序”比较器实现。compare(E o1, E o2)Comparatornull

二进制搜索是一种最小化查找项目或应将项目插入排序列表的位置所需的比较次数的方法。不是从第一个元素开始检查每个元素,而是从列表的中点开始。如果寻找的项目应该在找到的元素之前,则向前面移动一半并重复;否则中途移动到最后并重复。每次重复时,都使用之前的下限/上限和中点作为新的子列表,将每一步的元素数量减半。

想一想尝试猜测 1 到 100 之间的数字,每次都会被告知您是猜得太高还是太低。

  • 50 - 太高了
  • 25 - 太低
  • 37 - 太高
  • 31 - 太低
  • 34 - 太低
  • 35 - 正确!
于 2012-05-28T00:54:18.477 回答