2013-05-01 69 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()返回一個迭代器,該迭代器應該按照正確的順序遍歷列表元素。

相關問題