如何减少代码中 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;
我有一个像这样的 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;