我有一个名为“玩家”的33个足球运动员名单。他们都有不同的统计数据,我创建了一个比较这些统计数据的比较器。我想做的是创建两个独立的阵列,获得前11名球员,以及最后11名球员。然后,我可以根据这些进行不同的计算。这就是我所拥有的:
Set<Player> ascending = new TreeSet<>(comparator);
Collections.addAll(ascending, players);
Player[] sorted = ascending.toArray(new Player[ascending.size()]);
Player[] topEleven = new Player[11];
Player[] bottomEleven = new Player[11];
for(int i=0;i<11;i++){
topEleven[i]=sorted[i];
}
for(int i=0,j=32;i<11;i++,j--){
bottomEleven[i]=sorted[j];
}
这是有效的,但它很笨重,可能效率不高。有更好的方法吗?
答案 0 :(得分:2)
您可能希望使用Arrays.copyOfRange
方法,如下所示:
Set<Player> ascending = new TreeSet<>(comparator);
Set<Player> descending = new TreeSet<>(comparator.reversed());
Collections.addAll(ascending, players);
Collections.addAll(descending, players);
Player[] topEleven = Arrays.copyOfRange(ascending.toArray(), 0, 10);
Player[] bottomEleven = Arrays.copyOfRange(descending.toArray(), 0, 10);
或者像@drp所说,你可以在List对象上使用subList
方法。
答案 1 :(得分:2)
使用Java 8,您可以使用流:
/etc/php-fpm.d/www.conf
此外,您可以使用流进行排序,因为它无法修改原始Player[] topEleven = ascending.stream().limit(11).toArray(Player[]::new);
:
players
答案 2 :(得分:0)
如果你想坚持Set
:
final Player[] topEleven = new Player[11];
System.arraycopy(ascending.toArray(new Player[ascending.size()]), 0, topEleven,
0, topEleven.length);
final Player[] bottomEleven = new Player[11];
System.arraycopy(descending.toArray(new Player[descending.size()]), 0, bottomEleven,
0, bottomEleven.length);
或者您可以切换到使用List
并执行此操作:
List<Player> ascending = new ArrayList<>();
Collections.addAll(ascending, players);
ascending.sort(comparator)
Player[] topEleven = ascending.subList(0, 10).toArray(new Player[11]);