Circle List,迭代直到结束或中断,记住迭代

Circle List, iterate until end or break, remember iteration

这是一个简单的使用示例!

具有 n 个元素的映射(在此示例中有三个元素;OneTwoThree)。该映射定义为 <String, DecrementableInteger>,后者是可变整数的包装器。

class DecrementableInteger
{
    private int timeLeftMax;
    private int timeLeft;

    public DecrementableInteger (int v) {
        timeLeft = v;
        timeLeftMax = v;
    }

    public void update (int v) {
        timeLeft -= v;
    }

    public int get () {
        return timeLeft;
    }

    public void reset () {
        timeLeft = timeLeftMax;
    }
}

然后就是它的用法

class Test
{
    private final Map<String, DecrementableInteger> integers = new CircleHashMap<>(); //?
    private String activeKey = null;

    Test () {
        integers.put("One", new DecrementableInteger(4));
        integers.put("Two", new DecrementableInteger(1));
        integers.put("Three", new DecrementableInteger(2));
    }

    void update () {
        if (activeKey == null) {
            for (Entry<String, DecrementableInteger> e : integers.entrySet()) {
                e.getValue().update (1);
                if (e.getValue().get () <= 0) {
                    System.out.println(e.getKey() + " just finished, resetting.");
                    e.getValue().reset();
                    activeKey = e.getKey();
                    break;
                }
            }
        } else {
            System.out.println(activeKey + " did their thing, continuing!");
            activeKey = null;
        }
    }
}

update 方法每秒被调用多次。

第一次迭代将给出以下结果。

  1. 一个 => 3
  2. 两个 => 0,Two just finished, resetting.两个 => 1

迭代中断,下次在Three继续。

  1. 三 => 1

迭代完成,下次从One开始。

  1. 一个 => 2,
  2. 两个 => 0,Two just finished, resetting.两个 => 1

迭代中断,下次在Three继续。

  1. 三 => 0,Three just finished, resetting.三 => 2

迭代完成,下次从One开始。

  1. 一个 => 1
  2. ...

意味着代码需要具备以下品质:

对于 CircleList 是否有有效且简洁的解决方案?如果是这样,该解决方案会是什么样子。

您需要使用地图,还是可以使用列表?

如果需要是Map,应该使用TreeMap,因为TreeMap已经定义了顺序。然后需要创建一个特殊的Iterator,本质上就是遍历树,走到尽头就回到元素1。