场景:
对于包含 3 个元素的列表:
[A, B, C]
您可以根据需要多次循环访问它。
并且有一个额外的计数函数记录每个元素的访问次数。
比如访问7次,应该返回:
[A, B, C, A, B, C, A]
每个元素的访问次数如下:
+–––––––––––+–––––––––––––––+
| Element | Access count |
+–––––––––––––––––––––––––––+
| A | 3 |
+–––––––––––––––––––––––––––+
| B | 2 |
+–––––––––––––––––––––––––––+
| C | 2 |
+–––––––––––+–––––––––––––––+
添加另一个附加功能,允许调用者指定应过滤的元素列表。还是以7次访问为例,过滤[C]
:
[A, B, A, B, A, B, A]
+–––––––––––+–––––––––––––––+
| Element | Access count |
+–––––––––––––––––––––––––––+
| A | 4 |
+–––––––––––––––––––––––––––+
| B | 3 |
+–––––––––––––––––––––––––––+
| C | 0 |
+–––––––––––+–––––––––––––––+
随后对 getNextOne()
的调用应该始终获取访问次数较少的那个。模拟负载均衡的访问计数实现。因此,如果第二个调用者尝试访问它 10 次,应该返回:
[C, C, C, B, C, A, B, C, A, B, C, A]
+–––––––––––+–––––––––––––––+
| Element | Access count |
+–––––––––––––––––––––––––––+
| A | 7 |
+–––––––––––––––––––––––––––+
| B | 6 |
+–––––––––––––––––––––––––––+
| C | 6 |
+–––––––––––+–––––––––––––––+
最佳答案
Guava 提供了一个 Iterables.cycle()
, 再加上 Multiset
计数,你就完成了:
package com.stackoverflow.so22869350;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Multiset;
import java.util.Iterator;
import java.util.List;
public class Circular<T> {
private final Multiset<T> counter;
private final Iterator<T> elements;
public Circular(final List<T> elements) {
this.counter = HashMultiset.create();
this.elements = Iterables.cycle(elements).iterator();
}
public T getOne() {
final T element = this.elements.next();
this.counter.add(element);
return element;
}
public int getCount(final T element) {
return this.counter.count(element);
}
public static void main(final String[] args) {
final Circular<String> circular =
new Circular<>(Lists.newArrayList("A", "B", "C"));
for (int i = 0; i < 7; i++) {
System.out.println(circular.getOne());
}
System.out.println("Count for A: " + circular.getCount("A"));
}
}
输出:
A
B
C
A
B
C
A
Count for A: 3
注意:注意为类型 T
使用正确的 equals
/hashCode
。
关于java - 如何实现轮询循环链表并统计元素的访问请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22869350/