我有一个关于
Java集合的问题,例如Set或List.更常见的是可以在for-each循环中使用的对象.是否有任何要求它们的元素实际上必须存储在数据结构中的某个位置,或者它们是否只能根据某种要求进行描述并在需要时动态计算?感觉这应该可以完成,但我没有看到任何java标准集合类做这样的事情.我在这里违反任何合同吗?
我正在考虑使用它们的主要是数学.比如说我希望有一个代表所有素数低于1 000 000的集合.将它们保存在内存中可能不是一个好主意,而是要检查一个特定数字是否在集合中.
我也不是java流的专家,但我觉得这些应该可以在java 8流中使用,因为对象具有非常小的状态(在你尝试迭代它们之前,集合中的对象甚至不存在或检查集合中是否存在特定对象).
是否有可能使集合或迭代器具有几乎无限多的元素,例如“表格6 * k 1上的所有数字”,“10以上的所有素数”或“此基础跨越的所有向量”?我正在考虑的另一件事是结合两个集合,例如低于1 000 000的所有素数的并集,以及形式2 ^ n-1的所有整数,并列出低于1 000 000的mersenne素数.我觉得它会更容易关于某些数学对象的理由,如果它是以这种方式完成的,并且在实际需要之前不会明确地创建元素.也许我错了.
这是我写的两个模拟类,试图说明我想做什么.它们的行为并不像我期望的那样(参见输出),这让我觉得我在这里与可迭代接口打破某种契约或者执行错误.如果您看到它或者在集合框架下甚至允许这种代码,请随意指出我在这里做错了什么.
import java.util.AbstractSet;
import java.util.Iterator;
public class PrimesBelow extends AbstractSet{
int max;
int size;
public PrimesBelow(int max) {
this.max = max;
}
@Override
public Iterator iterator() {
return new SetIterator(this);
}
@Override
public int size() {
if(this.size == -1){
System.out.println("Calculating size");
size = calculateSize();
}else{
System.out.println("Accessing calculated size");
}
return size;
}
private int calculateSize() {
int c = 0;
for(Integer p: this)
c++;
return c;
}
public static void main(String[] args){
PrimesBelow primesBelow10 = new PrimesBelow(10);
for(int i: primesBelow10)
System.out.println(i);
System.out.println(primesBelow10);
}
}
.
import java.util.Iterator;
import java.util.NoSuchElementException;
public class SetIterator implements Iterator {
int max;
int current;
public SetIterator(PrimesBelow pb) {
this.max= pb.max;
current = 1;
}
@Override
public boolean hasNext() {
if(current < max) return true;
else return false;
}
@Override
public Integer next() {
while(hasNext()){
current++;
if(isPrime(current)){
System.out.println("returning "+current);
return current;
}
}
throw new NoSuchElementException();
}
private boolean isPrime(int a) {
if(a<2) return false;
for(int i = 2; i < a; i++) if((a%i)==0) return false;
return true;
}
}
Main function gives the output
returning 2
2
returning 3
3
returning 5
5
returning 7
7
Exception in thread "main" java.util.NoSuchElementException
at SetIterator.next(SetIterator.java:27)
at SetIterator.next(SetIterator.java:1)
at PrimesBelow.main(PrimesBelow.java:38)
编辑:在next()方法中发现错误.更正了它并将输出更改为新的输出.