java - 如何实现轮询循环链表并统计元素的访问请求?

标签 java list load-balancing circular-list round-robin

场景:

对于包含 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/

相关文章:

javascript - 我在尝试访问和设置数据库中的外键时遇到问题

java - 一个简单的重复 block 查找算法在使用 BloomFilter 进行查找时性能更差

java - 在接口(interface) : what is the outerclass? 中声明的匿名内部类

r - 从 R 中的列表打包和解包元素

java - jdbc负载均衡问题

azure - 服务结构 URL 路由

java - 删除开关条件的干净代码(使用多态性)

python - 使用 del() 删除列表中的多个元素

c# - 使用 GroupBy 消除 List<T> 中的重复对象

多个 AWS 实例中的 MongoDB 负载平衡