Java 仅将集合的一部分放入数组
我有一份足球运动员名单,共33人,称为“球员”。它们都有不同的统计数据,我创建了一个比较器来比较这些统计数据。我想做的是创建两个单独的数组,分别获得前11名和后11名玩家。然后我可以根据这些做不同的计算。以下是我所拥有的: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
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
,而这两种解决方案都排序并创建一个数组。