如何在Java中将数据从数据集传输到SortedSet
我得到一个如何在Java中将数据从数据集传输到SortedSet,java,deque,sortedset,Java,Deque,Sortedset,我得到一个Deque-Deque,我想将所有元素转移到另一个结构:SortedSet-SortedSet sortedSet中元素的顺序与从deque弹出元素的顺序相同 例如:如果所有元素按顺序从deque弹出:E01、E02、…、E10。 存储在sortedSet中的元素序列也是E01、E02、…、E10 我不知道如何覆盖比较器,让元素以这样的顺序存储 你知道怎么做吗?好吧,这太奇怪了。您希望有一个SortedSet,其中的元素按迭代顺序排列 对于这个奇怪的问题,这里有一个奇怪的解决方案: /
Deque-Deque
,我想将所有元素转移到另一个结构:SortedSet-SortedSet
sortedSet中元素的顺序与从deque弹出元素的顺序相同
例如:如果所有元素按顺序从deque
弹出:E01、E02、…、E10
。
存储在sortedSet
中的元素序列也是E01、E02、…、E10
我不知道如何覆盖比较器,让元素以这样的顺序存储
你知道怎么做吗?好吧,这太奇怪了。您希望有一个
SortedSet
,其中的元素按迭代顺序排列
对于这个奇怪的问题,这里有一个奇怪的解决方案:
// final is CRITICAL here
final List<Element> list = new ArrayList<>(deque);
deque.clear();
final Comparator<Element> cmp = new Comparator<>()
{
@Override
public int compare(final Element a, final Element b)
{
return Integer.compare(list.indexOf(a), list.indexOf(b));
}
}
return new TreeSet<>(list, cmp);
如前所述,您需要一个
LinkedHashSet
,一个保持插入顺序的集合:
Set<Element> convertToSet(Deque<Element> dq)
{
LinkedHashSet<Element> lhs = new LinkedHashSet<Element>():
while(!dq.isEmpty())
{
lhs.add(dq.peekFirst());
}
return lhs;
}
Set convertToSet(设定dq)
{
LinkedHashSet lhs=新LinkedHashSet():
而(!dq.isEmpty())
{
添加(dq.peekFirst());
}
返回lhs;
}
简,我写了一个简单的代码:
public static void main(String[] args) {
SortedSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return 1;
}
});
Deque<Integer> deq = new LinkedList<Integer>();
deq.add(5);
deq.add(1);
deq.add(3);
set.addAll(deq);
System.out.println(deq); // 5,1,3
}
publicstaticvoidmain(字符串[]args){
SortedSet集合=新树集合(新比较器(){
@凌驾
公共整数比较(整数i1、整数i2){
返回1;
}
});
Deque deq=新链接列表();
deq.add(5);
deq.add(1);
deq.add(3);
set.addAll(deq);
System.out.println(deq);//5,1,3
}
比较器应始终返回1
,这样顺序保持不变,如果这是您的问题。
警告:此解决方案违反了
可比
和设置
合同。小心使用。那么为什么要使用SortedSet
?为什么不使用一个简单的ArrayList
。它很容易使用,也能达到目的。等等,你想要自然排序迭代顺序还是插入迭代顺序?如果是后者,您应该使用LinkedHashSet
,而不是SortedSet
,因为另一个函数只接受排序集作为其参数之一,我无法更改该函数的接口。@fge,SortedSet可以通过树集实现。由于上下文的关系,我必须创建一个SortedSet对象。在您的示例中,当您从中弹出时,Deque
中的元素是否总是按自然顺序排列,或者它们可以是任何顺序?如果我只是使用Deque作为TreeSet构造函数的参数,那么sortedSet中的所有元素是否都按我上面提到的顺序排列?您还没有告诉我们的是您真正期望的顺序!这真的不清楚你想要什么。Foo
是否实现了compariable
?如果是这样,您希望返回一个元素按自然顺序或插入顺序排列的集合吗?这是最好的答案。这是一种非常有创意的方法,可以解决看似不一致的需求。@DavidWallace事实上,这是可以信赖的,但我的天啊,这很难看。我认为你的方法是正确的。Thx,Tomas.我想问一下,在'set.addAll(deq)'之后,deq是否变为空?不,您必须调用deq.clear()代码>请接受答案,如果它有效的话。呃,不,这里的可比
合同被打破了,所以这个比较者会告诉我5>1,但是如果我与相反的参数进行比较,也会告诉我1>5?凉的违反实现者必须确保所有x和y的sgn(比较(x,y))==-sgn(比较(y,x))。
,请参阅,T)。只需使用LinkedHashSet
来维护插入顺序。peekFirst
不会删除元素。如果要删除并返回第一个元素,则需要pollFirst
或removeFirst
。不幸的是,LinkedHashSet
没有实现SortedSet
,这是一项要求。然而,这项要求可能是基于这样一种想法,即他希望以某种方式(迭代顺序)对集合进行“排序”,从而认为他需要SortedSet
。也许我在这里假设的太多了,也许。实际上,我将Jane的评论解释为,她将把这个结构传递到一个带有SortedSet
类型参数的方法中,但可能我误解了她。当然,我的回答是假设人们不必使用SortedSet。
public static void main(String[] args) {
SortedSet<Integer> set = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return 1;
}
});
Deque<Integer> deq = new LinkedList<Integer>();
deq.add(5);
deq.add(1);
deq.add(3);
set.addAll(deq);
System.out.println(deq); // 5,1,3
}