这是一个非常普遍的问题,我会尽可能地清楚。让我们说我有一些对象的集合,为简单起见,使它们成为整数。现在我想创建一个表示这些整数的类作为一些数据结构。在本课程中,我想实现
一个排序函数,它根据一些定义的排序逻辑
迭代接口,Iterator按插入顺序遍历
我怎么能这样做,即使我以未排序的顺序添加整数,例如
Collections.sort(someSortingLogic);
然后致电
import { Validators } from '@angular/forms';
在对集合进行排序后,迭代器仍按插入顺序遍历。是否有我可以用于此目的的特定数据结构,或者是手动跟踪哪些元素按哪种顺序插入的情况,或者我无法想到的其他内容?
非常感谢!
答案 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);
}
...
}