Java 从集合中获取子列表的一行程序
是否有一个从集合中获取子列表的一行程序(可能来自Guava或Apache集合)。在内部,它应该这样做:Java 从集合中获取子列表的一行程序,java,guava,apache-commons-collection,Java,Guava,Apache Commons Collection,是否有一个从集合中获取子列表的一行程序(可能来自Guava或Apache集合)。在内部,它应该这样做: public <T> List<T> sublist(Set<T> set, int count) { Iterator<T> iterator = set.iterator(); List<T> sublist = new LinkedList<T>(); int pos = 0; while (iter
public <T> List<T> sublist(Set<T> set, int count) {
Iterator<T> iterator = set.iterator();
List<T> sublist = new LinkedList<T>();
int pos = 0;
while (iterator.hasNext() && pos++ < count) {
sublist.add(iterator.next());
}
return sublist;
}
公共列表子列表(集合、整数计数){
迭代器迭代器=set.Iterator();
列表子列表=新建LinkedList();
int pos=0;
while(iterator.hasNext()&&pos++
显然,如果没有足够的元素,它必须返回尽可能多的元素。这应该可以做到:
return (new LinkedList<T>(set)).subList(0, count);
return(新链接列表(set)).subList(0,count);
但请确保count
不大于set
(新链接列表(mySet)).sublist(0,Math.min(count,mySet.size())的大小
(new LinkedList<Object>(mySet)).sublist(0, Math.min(count, mySet.size()))
但请注意:代码(甚至您的原始代码)有点臭,因为集合的迭代顺序取决于所讨论的实际集合实现(它在HashSet
和TreeSet
s中完全没有定义)。所以,这实际上是一个悬而未决的问题,哪些元素会进入最后的子列表。这是什么
Set<String> s = new HashSet<String>();
// add at least two items to the set
Set<String> subSet = new HashSet(new ArrayList<String>(s).subList(1, 2));
Set s=newhashset();
//向集合中至少添加两项
Set子集=新的HashSet(新的ArrayList.subList(1,2));
这将是介于1和2之间的子列表您可以使用a并使用它的方法:
返回此集合中元素范围从Element到toElement的部分的视图。如果fromElement和toElement相等,则返回的集为空,除非fromExclusive和toExclusive都为true。此集合支持返回的集合,因此返回集合中的更改将反映在此集合中,反之亦然。返回的集合支持该集合支持的所有可选集合操作
使用整数的示例:
TreeSet<Integer> t = new TreeSet<Integer>();
t.add(1);
t.add(2);
t.add(3);
t.add(4);
t.add(5);
System.out.println("Before SubSet:");
for(Integer s : t){
System.out.println(s);
}
System.out.println("\nAfter SubSet:");
for(Integer s : t.subSet(2,false,5,true)){
System.out.println(s);
}
Before SubSet:
1
2
3
4
5
After SubSet:
3
4
5
或者,如果不知道元素并希望返回两点之间的元素,则可以使用使用集合构造的ArrayList并使用该方法
无需事先创建
集合的副本,您可以(使用番石榴)执行以下操作:
这是一个真正的链接列表
,只包含(最多)第一个计数
元素,而不是更大列表上的视图。番石榴:
return FluentIterable.from(set)
.limit(count)
.toImmutableList();
(而且,与大多数其他解决方案相比,这实际上不会迭代整个集合——它实际上只迭代第一个count
元素,然后停止。)这与上面解释的要求相反。我不知道元素的值,我只需要得到一些them@yegor256我真的很抱歉。我在末尾添加了一个方法,我认为它可能更符合您的要求?如果您希望从集合中获得子列表
,首先不应该使用Set
,因为它的迭代顺序未定义,并且您的实现可能会根据以下情况产生不同的结果。。。月亮的阶段。你怎么知道我的集合中元素的顺序是未定义的?来自Java集合API-请参阅。Set
接口本身所做的操作不会对Collection
关于迭代顺序的契约添加任何内容;另一方面,Set实现(TreeSet和LinkedHashSet有)。你怎么知道我的Set
实现没有向它添加迭代顺序?我不知道你的impl,但在方法签名中没有YourSet
但Set
参数,因此方法可以(你不禁止它)作为子列表调用(新的HashSet(Arrays.asList(2,3,1),2)
可以产生与子列表不同的结果(新的LinkedHashSet(Arrays.asList(2,3,1),2)
。这个具体的片段将给出索引自动边界异常
)@Xaerxess啊,是的,你是正确的。让我更新代码示例。谢谢+1新的XXXList(set)'处理集合中的所有元素,Fluentitable不处理。从Guava 3.0开始,可以作为Iterables.limit(Set,count);
。Simpler API,IMHO。@XtremeBiker:这种方法将其转换为列表
,我认为这是问题的一部分。
Lists.newLinkedList(Iterables.getFirst(Iterables.partition(mySet, count), ImmutableList.of()))
return FluentIterable.from(set)
.limit(count)
.toImmutableList();