Java 仅将集合的一部分放入数组

Java 仅将集合的一部分放入数组,java,arrays,sorting,set,Java,Arrays,Sorting,Set,我有一份足球运动员名单,共33人,称为“球员”。它们都有不同的统计数据,我创建了一个比较器来比较这些统计数据。我想做的是创建两个单独的数组,分别获得前11名和后11名玩家。然后我可以根据这些做不同的计算。以下是我所拥有的: Set<Player> ascending = new TreeSet<>(comparator); Collections.addAll(ascending, players); Player[] sorted = ascen

我有一份足球运动员名单,共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];
    }
设置升序=新树集(比较器);
集合。addAll(升序,玩家);
播放器[]排序=升序.toArray(新播放器[升序.size()]);
玩家[]topEleven=新玩家[11];
玩家[]bottomEleven=新玩家[11];

对于(int i=0;i您可能希望使用
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);
设置升序=新树集(比较器);
Set descending=新树集(comparator.reversed());
集合。addAll(升序,玩家);
集合。添加所有(下降,玩家);
Player[]topEleven=Arrays.copyOfRange(升序.toArray(),0,10);
Player[]bottomEleven=Arrays.copyOfRange(descending.toArray(),0,10);

或者像@drp所说的,您可以对列表对象使用
子列表
方法。

您可能需要使用
数组。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);
设置升序=新树集(比较器);
Set descending=新树集(comparator.reversed());
集合。addAll(升序,玩家);
集合。添加所有(下降,玩家);
Player[]topEleven=Arrays.copyOfRange(升序.toArray(),0,10);
Player[]bottomEleven=Arrays.copyOfRange(descending.toArray(),0,10);

或者像@drp所说的,您可以在列表对象上使用
子列表
方法。

如果您想继续使用
设置,您可以这样做:

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<Player> ascending = new ArrayList<>();
Collections.addAll(ascending, players);
ascending.sort(comparator)
Player[] topEleven = ascending.subList(0, 10).toArray(new Player[11]);
List升序=新建ArrayList();
集合。addAll(升序,玩家);
升序排序(比较器)
玩家[]topEleven=升序。子列表(0,10)。toArray(新玩家[11]);

如果您想坚持使用
设置,您可以这样做:

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<Player> ascending = new ArrayList<>();
Collections.addAll(ascending, players);
ascending.sort(comparator)
Player[] topEleven = ascending.subList(0, 10).toArray(new Player[11]);
List升序=新建ArrayList();
集合。addAll(升序,玩家);
升序排序(比较器)
玩家[]topEleven=升序。子列表(0,10)。toArray(新玩家[11]);

使用Java 8,您可以使用流:

Player[] topEleven = ascending.stream().limit(11).toArray(Player[]::new);
此外,您还可以使用流进行排序,因为它不会修改原始的
播放器

Player[] topEleven = players.stream()
                            .sorted(comparator)
                            .limit(11)
                            .toArray(Player[]::new);

使用Java 8,您可以使用流:

Player[] topEleven = ascending.stream().limit(11).toArray(Player[]::new);
此外,您还可以使用流进行排序,因为它不会修改原始的
播放器

Player[] topEleven = players.stream()
                            .sorted(comparator)
                            .limit(11)
                            .toArray(Player[]::new);

使用数组而不是
java.util.List
?如果不是,我建议使用列表,因为你保存了一些转换逻辑,列表中有很多方便的方法,可以让你的生活更轻松。@dpr:是的,我让玩家列表非常有条理,并让玩家四处走动。选择n进程由数组中的特定位置使用(即,玩家[12])。据我所知,这在列表中是不可能的。但我可能错了!@ShaddAnderson要么我没有抓住你的重点,要么你没有找到方法
java.util.List.get(n)
。也许你把这和
java.util.Set
混淆了,后者不提供通过索引访问元素的可能性。实际上,我使用数组而不是列表的唯一情况是。使用数组,并且你有什么具体的理由使用数组而不是
java.util.List
?如果没有,我建议使用列表作为索引您保存了一些转换逻辑,列表中有许多方便的方法,可以让您的生活更轻松。@dpr:是的,我会使玩家列表非常有序,并经常移动玩家。选择过程由阵列中的特定位置使用(即,玩家[12])。据我所知,这在列表中是不可能的。但我可能是错的!@ShaddAnderson要么我没有抓住你的重点,要么你没有抓住方法
java.util.List.get(n)
。也许你把这和
java.util.Set
混淆了,后者不提供通过索引访问元素的可能性。实际上,我使用数组而不是列表的唯一情况是。这正是我想要的效率。我只是对流没有太多了解。不过,我肯定要检查它们。make e一切看起来都更加快速和简单。在您的情况下,这可能无关紧要,但与“通常”相比,Java8流被认为是不高效/快速的处理集合的方式。@dpr:对于33名玩家的数组来说,速度损失可以忽略不计,而代码可读性和简单性的提高是巨大的。此外,与您的解决方案相比,根本没有损失,因为“设置到流”转换相当于
集合。addAll
,而这两种解决方案都排序并创建一个数组。这是我所追求的确切效率。我只是对流没有太多的了解。不过,我一定要去看看。这会让一切看起来更加快速和简单。对你来说,这可能无关紧要,但与“通常”相比,Java8流并不被认为是高效/快速的处理集合的方式。@dpr:对于33名玩家的数组来说,速度损失可以忽略不计,而代码可读性和简单性的提高是巨大的。此外,与您的解决方案相比,根本没有损失,因为“设置到流”转换相当于
集合。addAll
,而这两种解决方案都排序并创建一个数组。