Java 可以使用迭代器进行排序并保持插入顺序的数据结构

Java 可以使用迭代器进行排序并保持插入顺序的数据结构,java,Java,这是一个非常笼统的问题,我会尽可能地澄清。假设我有一些对象集合,为了简单起见,将它们设为整数。现在我想创建一个类,将这些整数表示为某种数据结构。在这个类中,我要实现 一个排序函数,它根据定义的排序逻辑对集合进行排序 iterable接口,迭代器按插入顺序遍历该接口 即使我按不排序的顺序添加整数,例如 someCollection.add(1); someCollection.add(3); someCollection.add(2); 然后打电话 Collections.sort(some

这是一个非常笼统的问题,我会尽可能地澄清。假设我有一些对象集合,为了简单起见,将它们设为整数。现在我想创建一个类,将这些整数表示为某种数据结构。在这个类中,我要实现

  • 一个排序函数,它根据定义的排序逻辑对集合进行排序

  • iterable接口,迭代器按插入顺序遍历该接口

即使我按不排序的顺序添加整数,例如

someCollection.add(1);
someCollection.add(3);
someCollection.add(2);
然后打电话

Collections.sort(someSortingLogic);
在对集合排序后,迭代器仍按插入顺序进行遍历。是否有一个特定的数据结构可以用于此目的,或者是手动跟踪哪些元素按哪个顺序插入,或者是其他我想不出来的东西


非常感谢

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

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

如果您为我们展示更多关于您所写内容的代码,可能会有更好的解决方案。

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

然后,当您想要按排序顺序进行遍历时,使用排序索引对值进行遍历;当您想要按插入顺序进行遍历时,使用插入索引对值进行遍历

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

Fancier数据结构利用Fancier技术,但它们基本上都归结为维护两个顺序:插入顺序和排序顺序

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

如果迭代顺序基于插入,排序的意义是什么?编辑:我猜这是一个可索引列表,因为其他集合无论如何都无法排序。请澄清任何一种方式。您好,很抱歉模棱两可!我自己也不太清楚,我的任务中有一小部分需要这样做sort方法不能返回副本吗?这样就可以保留原始顺序,这将违反迭代器契约。如果集合具有已建立的顺序(插入、自然或显式),则迭代器必须反映该顺序。其他的一切都是违反直觉的,因此容易出错。@SeanPatrickFloyd这对于列表是正确的,对于其他集合则不一定如此。