可以使用迭代器维护插入顺序的数据结构

时间:2018-01-03 01:03:17

标签: java

这是一个非常普遍的问题,我会尽可能地清楚。让我们说我有一些对象的集合,为简单起见,使它们成为整数。现在我想创建一个表示这些整数的类作为一些数据结构。在本课程中,我想实现

  • 一个排序函数,它根据一些定义的排序逻辑

  • 对集合进行排序
  • 迭代接口,Iterator按插入顺序遍历

我怎么能这样做,即使我以未排序的顺序添加整数,例如

Collections.sort(someSortingLogic);

然后致电

import { Validators } from '@angular/forms';

在对集合进行排序后,迭代器仍按插入顺序遍历。是否有我可以用于此目的的特定数据结构,或者是手动跟踪哪些元素按哪种顺序插入的情况,或者我无法想到的其他内容?

非常感谢!

2 个答案:

答案 0 :(得分:1)

我不确定您是否向我们展示了足够的代码来为您提供一个好的答案,但如果您的课程看起来有点像这样:

public class Hand implements Iterator<Card>
{
    private List<Card> cards = new ArrayList<>();

    // Returns iterator for natural ordering of cards
    @Override
    public Iterator<Card> iterator()
    {
        return cards.iterator();
    }

    // Rest of code omitted

然后你可以实现这样的sortedIterator(...)方法:

    // Returns iterator for sorted ordering by Comparator c
    public Iterator<Card> sortedIterator(Comparator<? super Card> c)
    {
        return cards.stream().sorted(c).iterator();
    }

如果您向我们展示了更多代码,可能会有更好的解决方案。

答案 1 :(得分:1)

通常,要解决此类问题,请为这些值维护两个索引。也许其中一个索引包含实际值,也许两个索引都包含实际值,或者实际值可能存储在其他位置。

然后,当您想要遍历已排序的顺序时,可以使用排序的索引来表示值,并且当您需要插入顺序时,可以使用插入索引来表示值。

索引可以像包含值的数组一样简单。当然,您不能将两个不同的值存储到数组中的一个位置,因此一个简单的解决方案是将两个数组包装在一个Object中,这样调用Object的sort()方法就可以对一个数组进行排序,同时保持插入顺序数组不变。

Fancier数据结构利用了更高级的技术,但它们基本上归结为维护两个订单,即插入订单和排序顺序。

public class SomeCollection {
   public void add(int value) {
      insertArray = expandIfNeeded(insertArray);
      insertArray[insertIndex++] = value;
      sortArray = expandIfNeeded(sortArray);
      sortArray[sortIndex++] = value;
      sort(sortArray);
   }
   ...
}