Circle List,迭代直到结束或中断,记住迭代
Circle List, iterate until end or break, remember iteration
这是一个简单的使用示例!
具有 n 个元素的映射(在此示例中有三个元素;One
、Two
和 Three
)。该映射定义为 <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
方法每秒被调用多次。
第一次迭代将给出以下结果。
- 一个 => 3
- 两个 => 0,
Two just finished, resetting.
两个 => 1
迭代中断,下次在Three
继续。
- 三 => 1
迭代完成,下次从One
开始。
- 一个 => 2,
- 两个 => 0,
Two just finished, resetting.
两个 => 1
迭代中断,下次在Three
继续。
- 三 => 0,
Three just finished, resetting.
三 => 2
迭代完成,下次从One
开始。
- 一个 => 1
- ...
意味着代码需要具备以下品质:
- 地图需要记住它的顺序,它不能乱序。
- 代码需要记住是否停止;目前在
activeKey
- 迭代需要能够从
activeKey
开始
对于 CircleList
是否有有效且简洁的解决方案?如果是这样,该解决方案会是什么样子。
您需要使用地图,还是可以使用列表?
如果需要是Map,应该使用TreeMap,因为TreeMap已经定义了顺序。然后需要创建一个特殊的Iterator,本质上就是遍历树,走到尽头就回到元素1。
这是一个简单的使用示例!
具有 n 个元素的映射(在此示例中有三个元素;One
、Two
和 Three
)。该映射定义为 <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
方法每秒被调用多次。
第一次迭代将给出以下结果。
- 一个 => 3
- 两个 => 0,
Two just finished, resetting.
两个 => 1
迭代中断,下次在Three
继续。
- 三 => 1
迭代完成,下次从One
开始。
- 一个 => 2,
- 两个 => 0,
Two just finished, resetting.
两个 => 1
迭代中断,下次在Three
继续。
- 三 => 0,
Three just finished, resetting.
三 => 2
迭代完成,下次从One
开始。
- 一个 => 1
- ...
意味着代码需要具备以下品质:
- 地图需要记住它的顺序,它不能乱序。
- 代码需要记住是否停止;目前在
activeKey
- 迭代需要能够从
activeKey
开始
对于 CircleList
是否有有效且简洁的解决方案?如果是这样,该解决方案会是什么样子。
您需要使用地图,还是可以使用列表?
如果需要是Map,应该使用TreeMap,因为TreeMap已经定义了顺序。然后需要创建一个特殊的Iterator,本质上就是遍历树,走到尽头就回到元素1。