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这对于列表是正确的,对于其他集合则不一定如此。