我刚刚在旧的试卷中找到了这个考试题目,我正准备参加即将到来的考试。我无法弄清楚:
下面描述了一个实现Iterable接口的设计部分类。此类的唯一目的是提供迭代属性things.
我们需要在课堂上填写两件事来完成它。这是班级
private class PartialIterableClass /*FILL IN */ {
private String[] things;
public PartialIterableClass( String[] things ){
this.things = things;
}
/*FILL IN 2*/
}
我猜它应该类似于:
private class PartialIterableClass implements Iterable<PrivateIterableClass> {
private String[] things;
public PartialIterableClass( String[] things ){
this.things = things;
}
public Iterator<PartialIterableClass> iterator( ){
return new Iterator<PartialIterableClass>( ) {
}
}
}
我不确定如何充实这个问题的答案,但有人可以帮忙吗?
答案 0 :(得分:3)
您的Iterator
必须实现Iterator
接口中的所有方法才能封装迭代逻辑。
在您的情况下,它必须保持数组中的当前迭代索引。您可以从commons-collections
查看ArrayIterator
答案 1 :(得分:2)
最简单的方法可能是创建一个填充new ArrayList<String>()
中值的things
,并将调用结果返回给.iterator()
方法。这肯定是我在有限时间(如考试)的情况下所做的,而且很可能是我在现实场景中所做的,只是为了让事情变得简单。
您可以编写自己的ArrayIterator
类,或者使用您可以在网络上找到的各种库中的类,但这似乎会增加不必要的复杂性。
答案 2 :(得分:0)
private class PartialIterableClass implements Iterable<String> {
private String[] things;
public PartialIterableClass( String[] things ){
this.things = things;
}
@Override
public Iterator<String> iterator() {
return Arrays.asList(things).iterator();
}
}
答案 3 :(得分:0)
您可以使用ArrayIterator
,或者像这样构建自己的迭代器:
package arrayiterator;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ArrayIterator_int
{
public static void main(String[] args)
{
int [] arr = { 5, 4, 3, 2, 1 };
ArrayIterator_int iterator = new ArrayIterator_int(arr);
while (iterator.hasNext())
{
System.out.println(" " + iterator.next());
}
}
private int cursor;
private final int [] array;
private static final Lock lock = new ReentrantLock();
public ArrayIterator_int (int [] array)
{
this.array = array;
this.cursor = 0;
}
public boolean hasNext ()
{
boolean hasNext = false;
lock.lock();
try
{
hasNext = ((this.cursor+1) < this.array.length);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
return hasNext;
}
}
public int next () throws ArrayIndexOutOfBoundsException
{
int next = 0;
lock.lock();
try
{
next = this.array[++this.cursor];
}
catch(ArrayIndexOutOfBoundsException e)
{
throw e;
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
return next;
}
}
public int read () throws ArrayIndexOutOfBoundsException
{
int read = 0;
lock.lock();
try
{
read = this.array[this.cursor];
}
catch(ArrayIndexOutOfBoundsException e)
{
throw e;
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
return read;
}
}
public void write (int newVal) throws ArrayIndexOutOfBoundsException
{
lock.lock();
try
{
this.array[this.cursor] = newVal;
}
catch(ArrayIndexOutOfBoundsException e)
{
throw e;
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
}