以独特的方式遍历列表或其他内容

时间:2013-01-20 04:04:13

标签: java android

我需要创建一个将参数作为maxValue的方法。并从0开始循环,但一旦使用一个索引,就不能再使用它了。

解释

让我们举一个例子,maxValue是2000.现在它应该从0到2000,但是起始索引会被其他线程保持更改。就像它可以再次为0或者它可以是1900或1999,可以是小于maxValue的任何数字。所以它应该保持循环从开始索引到结束,然后循环其余的项目。

以下是我的尝试:

public int i = 0;  //keep changes by other thread

public void DoStuff(int maxValue) {
    HashSet<Integer> valuesSet = new HashSet<Integer>();      

    // fill hashset
    for (int a = 0; a < maxValue; a++)
        valuesSet.add(a);       

    for (; i < maxValue; i++) {
        if (valuesSet.contains(i)) {
            valuesSet.remove(i);
            // SomeMethod(i);
        }

        if (valuesSet.isEmpty())// must check isEmpty first
            break;
        if (i == (maxValue - 1)) // reset i to 0 to use remaining items in hashset
            i = 0;
    }
}

我还没有测试过这段代码,但是如果其他线程将i设置为0或者比maxValue更少的值,我可以看到问题会出现,这个循环将变为无限。虽然它应该是更好的东西。任何想法的人?

编辑:
深刻的例子
i=0maxValue=2000

DoStuff被调用,当i通过循环达到100时,i被其他线程设置为1600,循环继续进行,但i被同一个其他valuesSet设置为30线程,然后一次又一次地由其他线程设置,直到SomeMethod(i)中的所有项目都被调用valuesSet。但问题是,如果i中有一个或多个项目,如1998或1999,并且SomeMethod保持设置为低于0或10或100,则循环中断或完成的可能性非常低。 / p>

我想要的是,如果在SomeMethod中调用一个数字(0到maxValue),则不能再次调用它,而起始数字会保持更改而SomeMethod必须全部调用数字直到maxValue。如果{{1}}被调用到maxValue并且仍然是数字,那么它应该以最小的数字重新开始。

1 个答案:

答案 0 :(得分:0)

您的要求不明确,但您似乎在描述应该作为自定义Iterator类实现的内容。例如:

public class MyIterator<T> implements Iterator<T> {
    private int maxValue;
    private int pos;
    private List<T> list;
    public ListIterator(List<T> list, int maxValue) { 
        this.list = list; 
        this.maxValue = maxValue;
    }

    public synchronized T next() {
        if (pos < list.size() && pos <= maxValue) {
            return list.get(pos++);
        } else {
            throw ...
        }
    }

    // etcetera.
}

然后,您可以将此类的实例提供给您希望能够参与迭代的特定线程。其他线程无法干预。实际上,其他线程可以使用不同的实例......并独立迭代。

请注意,此自定义迭代器与List.iterator()返回的迭代器之间的唯一区别是:

  • 这个只从零到maxValue迭代。
  • 这个方法有synchronized个方法,因此可以由多个线程共享。

如果您需要,还可以添加reset方法。