Java 从集合中获取任意元素

Java 从集合中获取任意元素,java,Java,在许多算法中,您应该迭代一组元素,而该集合不是空的 由于在迭代集合时可能会更改集合,因此通常会从集合中取出一个元素,然后进行迭代,可能会在集合中添加或删除元素。下面是一个典型的Java代码 Set<Integer> possibleFactors = Sets.newHashSet(2,3,4,5,6,7,8,100); while (!possibleFactors.isEmpty()) { int factor = possibleFactors.iterator().n

在许多算法中,您应该迭代一组元素,而该集合不是空的

由于在迭代集合时可能会更改集合,因此通常会从集合中取出一个元素,然后进行迭代,可能会在集合中添加或删除元素。下面是一个典型的Java代码

Set<Integer> possibleFactors = Sets.newHashSet(2,3,4,5,6,7,8,100);
while (!possibleFactors.isEmpty()) {
    int factor = possibleFactors.iterator().next();
    for (int i=1;i<10;i++) possibleFactors.remove(i*factor);
}
Set possibleFactors=Set.newHashSet(2,3,4,5,6,7,8100);
而(!possibleFactors.isEmpty()){
int factor=possibleFactors.iterator().next();

对于(int i=1;i接口的唯一访问方法是通过
iterator()
方法或
toArray()
方法


如果您有一个选项,您可以使用
first()
last()
方法直接访问一个项目。

实际上,它不仅不可读,而且如果集合为空,它还会引发异常


在获取
next()
之前,您应该始终选中
hasNext()
,然后根据它采取行动。

在一个集合中,元素没有特定的顺序。您可以通过提供其值(set.remove(Object o)或set.contains(Object o)来移除或检查元素的存在您可以考虑删除一个集合中的所有元素,或者将其定义为使用

将元素设置在集合B中的不在集合B中的元素。
Set.removeAll(Set B);
比如说

Set<Integer> A = new HashSet();
Set<Integer> B = new HashSet();

add numbers from 1-to-10 into A
add even numbers in range [1, 10] to B

A.removeAll(B);
println(A)

will print all odd numbers, eg those that are in A but not in B.
Set A=newhashset();
Set B=新的HashSet();
将1到10之间的数字添加到
将[1,10]至B范围内的偶数相加
A.removeAll(B);
println(A)
将打印所有奇数(如A中的但不在B中的)。
或者,您可以调用remove()方法,从集合中删除元素(如果存在):

for (int i = 2; i <= 10; i += 2) {
   a.remove(i)
}

for(int i=2;i)它不会抛出异常,因为循环会检查集合是否为空。@Sean我认为他有道理,使用next()而不使用迭代器的hasNext()不会抛出异常本身,但肯定会遇到无限循环;OP到目前为止没有遇到问题的原因是因为他删除了所有元素,最终使其为空,但这只是一个有待解决的问题。不,如果没有更多元素,next()将抛出NoSuchElementException。hasNext()是否已调用。至少,这是合同;请阅读javadoc。您可能希望将
while(!possibleFactors.isEmpty())
替换为
while(possibleFactors.iterator().hasNext())
您的示例令人困惑:它只是从集合中删除了每个元素(因为对于while循环的每次迭代,for循环的第一次迭代都会删除“1*因子”)。在征求样式建议之前,最好有一个更好的规范或工作代码。@Arnout,我有一个工作代码,但只想给出一个一般示例。现在代码不会从集合中删除所有元素。我将给出一个“真实世界示例”一分钟后。@Rajeev,但是为什么要徒劳地创建迭代器对象呢?@Elazar如果remove()只留下一个条目possibleFactors.isEmpty()将返回false,导致潜在的无限循环问题。此外,与其他方面涉及的轻微风险相比,使用迭代器实际上没有任何显著的开销。
SortedSet
的实现假设我的元素是可比的,而它们不是。而且,我不介意顺序,我只希望任何顺序都是正确的
LinkedHashSet
可以,但遗憾的是,它没有提供任何获取第一个元素的方法。-1.你说了很多真实的事情,但我不知道这与我的问题有什么关系。特别是我的集合中的所有元素都是不同的,我不需要多集,我也不知道如何在向集合添加/删除内容的同时迭代集合。我的答案是基于你问题的模糊表述。对不起,我的读心设备今天不工作。别这么苛刻,我不是有意冒犯你。如果我把问题表述得太模糊,我很高兴你能帮我澄清。但我不确定模糊的回答是否会有帮助。
for (int i = 2; i <= 10; i += 2) {
   a.remove(i)
}