【问题标题】:Sort an iterator of strings对字符串的迭代器进行排序
【发布时间】:2013-05-08 06:59:33
【问题描述】:

我有一个字符串迭代器。

对于排序,我需要从中创建一个列表并使用 Collections.sort(list) 对其进行排序。

有什么简单的方法可以对迭代器进行排序。

【问题讨论】:

  • 你是怎么知道iterator的?来自list?传递相同的list 怎么样?
  • 迭代器是一个专为浏览集合而设计的对象。虽然有一些方便的函数允许您在 current 位置添加或删除元素,但在您的情况下不应该使用迭代器,因为它只会使代码更难理解并且可能更慢。跨度>

标签: java


【解决方案1】:

迭代器不是容器,它是一种用于遍历容器元素的实用程序。 因此,如果您只能访问迭代器,则无法更改迭代器的创建者定义的迭代顺序。

如果您无法更改原始容器,则必须将迭代器传递的元素收集到一个新集合中并在其中进行排序。

(了解迭代器可能实现的一个好方法是查看 JDK 类的源代码或实现自己的迭代器)

【讨论】:

    【解决方案2】:

    其实你不能,因为迭代器不是一个集合。

    如果很明显,你可以这样做

    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();
      }
    }
    

    【讨论】:

    • 这并没有真正回答问题,OP 询问是否可以在不将Iterator 复制到另一个Collection 的情况下进行排序。
    【解决方案3】:

    使用 TreeSet 或 TreeMap。它们是已经排序的集合。

    【讨论】:

    • 是的,但它们不允许重复,因此它们不能真正替代 List
    • Map 确实”是什么意思? Map 不允许重复键。我想您可以将List 放入Map 并将每个键的重复次数作为Integer 存储在值中,然后使用它进行迭代,但这实际上是在破解Map 来做某事不应该的。顺便说一句,在 Java 中,SetMap,但具有 null 值。
    • @renz:它不允许重复键。而且由于它是按键排序的,因此 Map 在这种情况下与 Set 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多