只将一部分集合放入数组中

时间:2016-06-26 18:49:37

标签: java arrays sorting set

我有一个名为“玩家”的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];
    }

这是有效的,但它很笨重,可能效率不高。有更好的方法吗?

3 个答案:

答案 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]);