2011-02-23 134 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"}其中立即找到匹配的算法可以停止。