2011-02-23 130 views
1

我有一個List<String>,我使用Collections.sort(...)按字母順序排序。現在我有一個參考String,我想從List中刪除所有字符串,它們比我的引用字符串「更低」(按字母順序排列)。有沒有什麼好的方法可以做到這一點,還是應該逐個瀏覽列表,並將每條記錄與參考值進行比較?如何刪除列表中「低於」指定元素的元素

編輯: 由於有人在這裏要求工作解決方案,它是。 originalListList<String> ... duplicities將這個解決方案

String filterString = "..."; 
TreeSet<String> tSet = new TreeSet<String>(originalList); 
List<String> filteredResources = new ArrayList<String>(tSet.tailSet()); 
+0

在複製的項目,會發生什麼原始列表。恐怕這些重複項目不會出現在尾部。 – 2012-05-21 09:42:32

+0

是的,看問題中的編輯,它從2011年2月開始:) –

回答

4

如果沒有重複的,那麼你可以這樣做:

  1. 使用創建一個TreeSet的TreeSet constructor that takes a collection
  2. 現在只需調用TreeSet.tailSet(refString)
+0

當然! :)我有一些黑屏。謝謝! –

+0

你可以發佈你如何使用一個工作示例解決它,以便它可以方便進一步參考。(+ 1 for tailSet) – Deepak

+0

@Deepak他的文本似乎對我來說已經足夠清晰了。 –

-1

這是我能想到的最好的辦法丟失。

  1. 排序列表
  2. 開始接一個,從最低開始在列表一個會。
  3. 達到一個點,直到列表元素高於所擁有的點。
  4. 打破循環。
  5. 保留此索引的註釋並使用此索引的subList函數分割列表。
+0

-1因爲這種風格的解決方案至少應該使用二進制搜索(O(log N))。 –

0

對它進行排序後,使用ListIterator迭代列表並執行比較將會很平常。一旦你比較失誤,你知道你可以停止迭代,因爲你的列表已經排序。

但請注意,排序是一個相對昂貴的操作,因此從頭到尾迭代列表執行比較會更有效。


你也可以使用它檢查中間的算法(list.size()/2)元素,然後向上移動或再次下調Halfing的結果集,依此類推,直到你找到了交匯點。

E.g.尋找"f"與列表{"a", "b", "c", "d", "e", "f", "g"}將執行中間元素"d"比較,然後看中間"f"元素的下半部分{"e", "f", "g"}其中立即找到匹配的算法可以停止。