T [] toArray(T [] a)实现

时间:2013-05-01 15:35:58

标签: java list toarray

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

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

在java文档中,我们可以看到,如果Collection长度大于sortedList,则创建一个具有良好大小的新数组,如果集合长度小于sortedList,则该对象跟在最后一个对象之后collection设置为null。

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

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

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

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

这是一种实现此方法的好方法,还是我希望错误使用它?

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

您确定需要实施List。实施IterableIterator

通常就足够了
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为您提供排序。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

首先推荐:

如果您希望SortedList实施List界面,最好扩展AbstractList而不是直接实施ListAbstractList已经定义了许多必要的方法,包括你遇到问题的方法。 Java平台库中的大多数List - 实现也扩展了AbstractList

如果你仍想直接实现List,那么这个方法应该是这样做的:

a成为指定的数组。

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

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

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

Here是Java Docs描述该方法的方式。