如何从排序列表中获取第一个元素?

问题描述:

我用Collections.sort(playersList);来排序List。所以,我认为playersList现在已经排序。但是,我怎样才能得到列表的第一个元素? playersList[0]不起作用。如何从排序列表中获取第一个元素?

playersList.get(0) 

Java具有有限的运算符多态性。因此,您在List对象上使用get()方法,而不是数组索引操作符([]

您必须访问列表的方式与Java中的数组稍有不同。有关更多信息,请参见javadocsList接口。

playersList.get(0) 

不过,如果你想找到playersList最小的元素,你不应该进行排序,然后得到的第一个元素。与仅搜索列表中的一次以找到最小的元素相比,此运行速度非常缓慢。

例如:

int smallestIndex = 0; 
for (int i = 1; i < playersList.size(); i++) { 
    if (playersList.get(i) < playersList.get(smallestIndex)) 
     smallestIndex = i; 
} 

playersList.get(smallestIndex); 

上面的代码将在O(n)代替O(n log n)时间找到的最小元素。

+1

我徘徊为什么这样的基本操作应该编程。为什么Java不提供只返回数组中最小值的函数? – Roman 2010-03-24 08:58:25

+2

Roman,有这样一个方法,Collections.min(http://java.sun.com/javase/7/docs/api/java/util/Collections.html#min%28java.util.Collection%29)。 – 2010-03-24 15:10:59

这要看是什么类型列表,对于ArrayList使用:

list.get(0); 

LinkedList使用:

list.getFirst(); 

如果你喜欢array方法:

​​
+2

不好的建议。 LinkedList实现了List接口,不需要使用特殊的方法(我会惊讶于两者之间有任何性能差异)。并调用toArray()是浪费 - 您可能无故将该列表分配到一个新的数组中! – Kip 2010-03-23 20:57:58

+0

@Kip,奇怪的评论;尽管LinkedList类没有实现第一个和最后一个方法。如果您有充分的理由使用LinkedList,则不应仅仅因为它们不在List接口中而使用它的方法。如果列表本身在排序后不需要,并且与OP要求的最接近,那么数组示例可能非常有用。如果不知道相关源代码的上下文,则无法确定该建议的有效性。 – rsp 2010-03-23 21:44:39

+0

为什么排序后你是否需要列表很重要?在任何情况下(或者即使列表从未排序)调用toArray()只是为了获取第一个元素(可能)不必要地创建整个数组。 – Kip 2010-03-24 03:18:38

Matthew's answer是正确的:

list.get(0); 

要做到你尝试过什么:

list[0]; 

,你将不得不等待,直到Java 7 is released:

devoxx conference http://img718.imageshack.us/img718/11/capturadepantalla201003cg.png

这里是由马克莱因霍尔德一个有趣的presentation关于Java 7

它看起来像parle YS网站目前下来,稍后再试:(

+1

这似乎并没有真正把它变成java 7 – Gunner 2012-02-10 20:28:39

如果您收藏不是List(因此不能使用get(int index)),那么你可以使用迭代器:

Iterator iter = collection.iterator(); 
if (iter.hasNext()) { 
    Object first = iter.next(); 
} 

如果你只是想要得到的,而不是分类整理,然后让第一个元素(O(N log N)),您可以用最低的清单,做线性时间使用min

<T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) 

这看起来在f粗糙首先,但看看你以前的问题,你有一个List<String>。总之:min适用于它。

对于长回答:所有superextends东西在泛型类型的限制是什么乔希布洛赫调用佩奇原则(旁边通常呈现给阿诺德的照片 - 我不是在开玩笑!)

生产者延伸消费者超级

它实质上使仿制药更强大,因为制约更加灵活,同时仍保留类型安全(见:what is the difference between ‘super’ and ‘extends’ in Java Generics

使用Java 8流,您可以将列表变成流,并使用.findFirst()方法获取列表中的第一项。

List<String> stringsList = Arrays.asList("zordon", "alpha", "tommy"); 
Optional<String> optional = stringsList.stream().findFirst(); 
optional.get(); // "zordon" 

.findFirst()方法将返回Optional其可以或可以不包含一个字符串值(它可以不包含值,如果stringsList为空)。

然后打开项目从可选使用.get()方法。