2013-05-01 71 views
0

我正在创建一个实现List的SortedList类。T [] toArray(T [] a)implementation

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

在Java文档我们可以看到,如果集合长度比排序列表时,一个新的阵列与良好的尺寸创建的,如果集合长度比排序列表的最后一个对象后的对象小集合被设置为null。

我的工作并没有让我在排序列表中使用空值的项目,所以我不同的实施方法,使用新的排序列表和指定者()方法:

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

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

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

会变成这样是实现这种方法的一个好方法,还是我应该期望像这样使用它的错误?

谢谢你的时间。

+0

如果你已经有一个数组,那么'toArray'就没有意义了。 – 2013-05-01 15:39:31

+0

方法toArray不带参数返回Arrays.copyOf(数组,长度),这就是我使用它的原因。 – jpl 2013-05-01 15:46:03

+0

我认为这是因为该方法将一个未排序的数组作为参数并返回一个已排序的数组。但我可能是错的。 – jpl 2013-05-01 15:55:45

回答

1

首先推荐:

如果你想SortedList实现List接口,这是延长AbstractList,而不是直接实现List一个好主意。 AbstractList已经定义了许多必要的方法,包括您遇到问题的方法。大多数List - 在Java平台库中的实现也延伸到AbstractList

如果你仍想直接实现List,这里是什么方法应该做的事:

a是指定数组。

  • 如果a是足够大的,从你的SortedList元素(以正确的顺序),而无需关心在a什么以前填充它。
  • 如果在填充后还有余地a,请设置a[size()] = null。然后用户将知道列表结束的位置,除非该列表包含null -elements。
  • 如果该列表不适合a,请创建一个类型为T的新阵列,其大小与列表的大小相同,然后填充新阵列。
  • 返回您填充的数组。如果填写了a,请返回a。如果您创建了一个新数组,则返回新数组。

有两个原因,这方法是有用的:

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

Here是Java Docs如何描述该方法。

+0

非常感谢。现在我更好地理解这种方法应该做什么。 – jpl 2013-05-02 13:40:35

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

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

相关问题