首页 > 解决方案 > 获取列表中访问最少的元素(Java 8)

问题描述

我正在尝试创建一个 API 包装器。这个 API 需要一个 API 密钥,就像大多数人一样。我的目标是在 API 密钥列表之间尽可能均匀地分配使用。这是为了减少速率限制的可能性。

需求:

不可变列表

我能想到的一个解决方案是以某种方式获得访问最少的元素,也许是一个只跟踪使用和实际数据的对象?然后对其进行排序并获得第一个元素?

class Key {
    private int uses;
    private UUID key;

    public Key(UUID key) {
        this.key = key;
        this.uses = 0;
    }

    public UUID get() {
        this.uses++;
        return this.key;
    }

    public int getUses() {
        return this.uses;
    }
}

如果需要或者更优雅的解决方案,我愿意使用 maven 库,例如 Google Guava(我已经在使用)。这是它可能看起来的示例。

List<UUID> keys = new ArrayList<>();

public Data getDataFromApi(String name) {
    return getData(ENDPOINT_URL_STR + "key=" + keys.getLeastAccessed().toString() + "&name=" + name);
}

标签: javalistjava-8

解决方案


鉴于密钥集是不可变的,我建议实施循环,即使用第一个密钥,然后使用第二个、第三个等等,直到达到第 n 个,然后从第一个密钥重新开始。

这样,任何 2 个键的用法之间的差异将是 <= 1


推荐阅读