0

我正在创建一个实现 List 的 SortedList 类。

如果我理解正确,方法 toArray(T[] a) 将对象数组作为参数并返回这些对象的排序数组。

在java文档中我们可以读到,如果Collection长度大于sortedList,则创建一个大小合适的新数组,如果collection长度小于sortedList,则设置集合最后一个对象之后的对象为空。

我正在处理的项目不允许我在排序列表中使用空值,因此我使用新的 sortedList 和 toArray() 方法以不同的方式实现该方法:

public <T> T[] toArray(T[] a)
{
    SortedList sort = new SortedList();

    for(Object o : a)
    {
        sort.add(o);
    }

    return (T[])sort.toArray();
}

这会是实现此方法的好方法,还是我应该期望像这样使用它会出错?

感谢您的时间。

4

3 回答 3

1

你确定你需要实施List. 通常只需实现Iterable和就足够了Iterator

public class SortedList<S extends Comparable<S>> implements Iterable<S>, Iterator<S> {

  private final Iterator<S> i;

  // Iterator version.
  public SortedList(Iterator<S> iter, Comparator<S> compare) {
    // Roll the whole lot into a TreeSet to sort it.
    Set<S> sorted = new TreeSet<S>(compare);
    while (iter.hasNext()) {
      sorted.add(iter.next());
    }
    // Use the TreeSet iterator.
    i = sorted.iterator();
  }

  // Provide a default simple comparator.
  public SortedList(Iterator<S> iter) {
    this(iter, new Comparator<S>() {

      public int compare(S p1, S p2) {
        return p1.compareTo(p2);
      }
    });
  }

  // Also available from an Iterable.
  public SortedList(Iterable<S> iter, Comparator<S> compare) {
    this(iter.iterator(), compare);
  }

  // Also available from an Iterable.
  public SortedList(Iterable<S> iter) {
    this(iter.iterator());
  }

  // Give them the iterator directly.
  public Iterator<S> iterator() {
    return i;
  }

  // Proxy.
  public boolean hasNext() {
    return i.hasNext();
  }

  // Proxy.
  public S next() {
    return i.next();
  }

  // Proxy.
  public void remove() {
    i.remove();
  }
}

然后,您可以执行以下操作:

for ( String s : new SortedList<String>(list) ) 

这通常是你想要的,因为TreeSet它为你提供了你的排序。

于 2013-05-01T15:44:28.870 回答
1

如果您正在实现“SortedList”类,那么在内部维护排序列表可能符合您的最大利益,而不是依靠toArray()方法在退出时对它们进行排序。换句话说,该类的用户可能不使用该toArray()方法,而是使用listIterator()返回一个迭代器,该迭代器应该以正确的顺序迭代列表的元素。

于 2013-05-01T15:47:31.670 回答
1

先推荐一个:

如果要SortedList实现List接口,最好扩展AbstractList而不是List直接实现。AbstractList已经定义了许多必要的方法,包括您遇到问题的方法。ListJava 平台库中的大多数实现也扩展了AbstractList.

如果您仍然想List直接实现,这是该方法应该执行的操作:

a成为指定的数组。

  • 如果a足够大,请用您的元素SortedList(以正确的顺序)填充它,而不用关心之前在a.
  • a如果填充后有空余空间,请设置a[size()] = null. 然后用户将知道列表在哪里结束,除非列表包含null-elements。
  • 如果列表不适合a,则创建一个T与列表大小相同的新类型数组,然后填充新数组。
  • 返回您填充的数组。如果你填了a,返回a。如果您创建了一个新数组,请返回新数组。

这种方法有用的原因有两个:

  • 数组不一定是 type Object,而是T由用户决定的类型(只要类型有效)。
  • 用户可能希望节省内存并重新使用数组,而不是分配更多内存来创建新数组。

以下是 Java Docs 描述该方法的方式。

于 2013-05-01T16:39:18.143 回答