Java 如何实现循环循环列表并统计元素的访问请求?

Java 如何实现循环循环列表并统计元素的访问请求?,java,list,load-balancing,circular-list,round-robin,Java,List,Load Balancing,Circular List,Round Robin,情景: 对于包含3个元素的列表: [A, B, C] 您可以根据需要多次访问它 还有一个额外的计数功能记录每个元素的访问计数 例如,如果访问它7次,则应返回: [A, B, C, A, B, C, A] [C, C, C, B, C, A, B, C, A, B, C, A] 每个元素的访问计数如下所示: +–––––––––––+–––––––––––––––+ | Element | Access count | +–––––––––––––––––––––––––––+ |

情景:

对于包含3个元素的列表:

[A, B, C]
您可以根据需要多次访问它

还有一个额外的计数功能记录每个元素的访问计数

例如,如果访问它7次,则应返回:

[A, B, C, A, B, C, A]
[C, C, C, B, C, 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]
随后对
getNextOne()
的调用应始终获取访问计数较低的调用。模拟负载平衡的访问计数实现。因此,如果第二个调用方尝试访问它10次,则应返回:

[A, B, C, A, B, C, A]
[C, C, C, B, C, A, B, C, A, B, C, A]
番石榴提供了一个,再加上一个,你就完成了:

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"));
    }
} 

NB:注意对于类型
T

使用适当的
等于
/
hashCode>以上答案是正确的,只需添加一种更简单的带列表的循环算法

import java.util.Iterator;
导入java.util.List;
公共类MyRoundRobin实现了Iterable{
私人名单;
私有整数指数=0;
公共MyRoundRobin(列表coll){
this.coll=coll;
}
公共迭代器迭代器(){
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
返回true;
}
@凌驾
公共交通工具{
索引++;
如果(索引>=coll.size()){
指数=0;
}
T res=coll.get(索引);
返回res;
}
@凌驾
公共空间删除(){
抛出新的UnsupportedOperationException();
}
};
}
}
您可以基于单个
树映射实现循环访问列表

树图 钥匙
Integer
访问请求数 价值
列表
请求访问的对象列表
A
B
C
A
B
C
A
Count for A: 3