2013-05-08 72 views
4

我有一個字符串迭代器。排序字符串的迭代器

對於排序,我需要從它創建一個列表,並使用Collections.sort(list)排序。

有什麼簡單的方法來排序迭代器。

+4

怎麼u得到的是'iterator'?從「列表」?如何通過相同的'列表'? – sanbhat 2013-05-08 07:00:31

+2

迭代器是專爲瀏覽集合而設計的對象。雖然有一些方便的功能可以讓你在* current *位置添加或移除元素,但迭代器不應該用於你的情況,因爲它只會使代碼變得不那麼容易理解,並且可能會變慢。 – Dariusz 2013-05-08 07:17:27

回答

5

其實你不能,因爲迭代器不是一個集合。

如果很明顯,你可以做

public static Iterator sortedIterator(Iterator it, Comparator comparator) { 
     List list = new ArrayList(); 
     while (it.hasNext()) { 
      list.add(it.next()); 
     } 

     Collections.sort(list, comparator); 
     return list.iterator(); 
    } 
} 
+4

這並沒有真正回答這個問題,OP詢問是否可以對'Iterator'複製到另一個'Collection'進行排序。 – 2013-05-08 07:13:37

-2

使用TreeSet的或TreeMap的。他們是已經排序的集合。

+4

是的,但它們不允許重複,因此它們不是真正替代「List」的。 – 2013-05-08 07:04:11

+0

「a'Map'確實是什麼意思?」 「Map」不允許重複鍵。我想你可以把'List'放到一個'Map'中,並將每個鍵的重複次數作爲一個Integer存儲在值中,然後用它來迭代,但這實際上是黑客使用Map來做一些事情不應該。順便提一句,在Java中,一個'Set'是一個'Map',但是具有'null'值。 – 2013-05-08 07:10:29

+2

@renz:它不允許重複鍵。而且由於它按鍵排序,所以在這種情況下Map與Set相同。 – creinig 2013-05-08 07:10:48

10

Iterator不是一個容器,它是遍歷容器元素的實用工具。 所以如果你只能訪問迭代器,就沒有辦法改變迭代器的創建者定義的迭代順序。

如果您不能更改原始容器,則必須將迭代器提供的元素收集到新的Collection中並對其進行排序。

(一個好的方法來了解什麼是可能的迭代器是看看在JDK類的源代碼或實現一個自己的迭代器)