如何减少代码中 List 的使用?

How to reduce usage of List in the code?

我有一个像这样的 EnumSet,所以要打乱元素,我需要将它转换为列表。

EnumSet<Fruit> otherFruits = EnumSet.complementOf(CURRENT_FRUIT);

下面是我的代码,我在其中进行洗牌并添加原始 result 列表:

private static List<Fruits> getFruits() {
    EnumSet<Fruits> local = EnumSet.of(CURRENT_FRUIT);
    // first element in the list will always be the local fruit so using LinkedList
    List<Fruits> result = new LinkedList<Fruits>(local);

    // I just want to shuffle remoteFruits only
    EnumSet<Fruit> otherFruits = EnumSet.complementOf(CURRENT_FRUIT);
    List<Fruits> remoteFruits = new ArrayList<Fruits>(otherFruits);
    Collections.shuffle(remoteFruits, new Random(System.nanoTime()));

    result.addAll(remoteFruits);
    return result;
}

到目前为止,我在上面的代码中使用了两个列表,然后将 remoteFruits 列表的所有元素添加到 result 列表中。有没有办法在一个列表中完成所有这些事情?我只想随机播放 otherFruits 个元素。

这里有优化的机会吗?

的确,如果你改变操作顺序就可以做到:

private static List<Fruits> getFruits() {
    EnumSet<Fruits> local = EnumSet.of(CURRENT_FRUIT);
    EnumSet<Fruit> otherFruits = EnumSet.complementOf(CURRENT_FRUIT);

    // start by adding and shuffling otherFruits
    List<Fruits> result = new ArrayList<Fruits>(otherFruits)
    Collections.shuffle(result, new Random(System.nanoTime()));

    // now add local
    result.addAll(new ArrayList<Fruits>(local));
    return result;
}

您应该能够执行以下操作:

List<Fruits> list = Arrays.asList(Fruits.values());
Collections.shuffle(list);
return list;

不要认为有必要使用 EnumSet、许多列表或为随机播放定义您自己的随机源。

尝试这样的事情:

    EnumSet<Fruits> fruits = EnumSet.allOf(Fruits.class);
    List<Fruits> result = new ArrayList<Fruits>(fruits);
    Collections.shuffle(result, new Random(System.nanoTime()));

    int idx = result.indexOf(CURRENT_FRUIT);
    if (idx != 0) {
        Fruits tmp = result.get(0);
        result.set(0, CURRENT_FRUIT);
        result.set(idx, tmp);
    }

    return result;