2010-03-23 43 views

Trả lời

74
playersList.get(0) 

Java có đa hình điều hành giới hạn. Vì vậy, bạn sử dụng phương pháp get() trên các đối tượng List, chứ không phải toán tử chỉ mục mảng ([])

9

Bạn phải truy cập danh sách hơi khác với mảng trong Java. Xem javadocs cho giao diện List để biết thêm thông tin.

playersList.get(0) 

Tuy nhiên, nếu bạn muốn tìm phần tử nhỏ nhất trong playersList, bạn không nên sắp xếp thành phần nhỏ nhất và sau đó lấy phần tử đầu tiên. Điều này chạy rất chậm so với chỉ tìm kiếm một lần thông qua danh sách để tìm phần tử nhỏ nhất.

Ví dụ:

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 mã trên sẽ tìm phần tử nhỏ nhất trong O(n) thay vì O(n log n) thời gian.

+1

Tôi đi lang thang tại sao một hoạt động cơ bản nên được lập trình. Tại sao Java không cung cấp một hàm trả về một giá trị tối thiểu từ mảng? – Roman

+2

Roman, có một phương thức như vậy, Collections.min (http://java.sun.com/javase/7/docs/api/java/util/Collections.html#min%28java.util.Collection%29). –

3

Điều đó phụ thuộc vào những gì gõ danh sách của bạn, cho ArrayList sử dụng:

list.get(0); 

cho LinkedList sử dụng:

list.getFirst(); 

nếu bạn thích cách tiếp cận array:

list.toArray()[0]; 
+2

lời khuyên xấu. LinkedList thực hiện giao diện Danh sách, không cần sử dụng một phương thức đặc biệt (và tôi sẽ ngạc nhiên vì có bất kỳ sự khác biệt về hiệu năng nào giữa hai phương thức này). Và gọi toArray() là lãng phí - bạn có thể phân bổ danh sách vào một mảng mới không có lý do! – Kip

+0

@Kẹo, nhận xét kỳ lạ; lớp LinkedList không triển khai thực hiện các phương thức đầu tiên và cuối cùng. Nếu bạn có lý do chính đáng để sử dụng LinkedList, bạn không nên hạn chế sử dụng các phương thức của nó chỉ vì chúng không có trong giao diện Danh sách. Ví dụ mảng có thể hữu ích nếu danh sách chính nó là không cần thiết sau khi sắp xếp, và gần nhất với những gì OP hỏi. Nếu không biết bối cảnh của mã nguồn được đề cập, bạn không thể xác định tính hợp lệ của lời khuyên. – rsp

+0

tại sao việc bạn có cần danh sách sau khi sắp xếp có quan trọng không? trong cả hai trường hợp (hoặc thậm chí nếu danh sách không bao giờ được sắp xếp) gọi toArray() chỉ để lấy phần tử đầu tiên (có thể) không cần thiết tạo ra toàn bộ mảng. – Kip

1

Matthew's answer là chính xác:

list.get(0); 

Để làm được những gì bạn đã cố gắng:

list[0]; 

bạn sẽ phải đợi cho đến khi Java 7 is released:

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

Dưới đây là một thú vị presentation Mark Reinhold về Java 7

Có vẻ như parle ys trang web hiện đang xuống, hãy thử sau :(

+1

Điều này dường như không thực sự biến nó thành java 7 – Gunner

0

Nếu bộ sưu tập của bạn không phải là một List (và do đó bạn không thể sử dụng get(int index)), sau đó bạn có thể sử dụng iterator:

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

Nếu bạn chỉ muốn nhận được tối thiểu là một danh sách, thay vì phải lọc nó và sau đó nhận được phần tử đầu tiên (O(N log N)), bạn có thể sử dụng làm điều đó trong thời gian tuyến tính sử dụng min:

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

Điều đó có vẻ gnarly tại f trước tiên, nhưng nhìn vào các câu hỏi trước đây của bạn, bạn có một List<String>. Tóm lại: min hoạt động trên đó.

Đối với câu trả lời dài: tất cả những thứ superextends trong những ràng buộc kiểu chung chung là những gì Josh Bloch gọi là nguyên tắc PECS (thường được trình bày bên cạnh một hình ảnh của Arnold - Tôi không đùa!)

Nhà sản xuất mở rộng, người tiêu dùng Siêu

Nó chủ yếu làm cho Generics mạnh mẽ hơn, vì những hạn chế rất linh hoạt hơn trong khi vẫn giữ gìn an toàn kiểu (xem: what is the difference between ‘super’ and ‘extends’ in Java Generics)

2

Sử dụng các luồng Java 8, bạn có thể biến danh sách của mình thành một luồng và lấy mục đầu tiên trong danh sách bằng cách sử dụng phương thức .findFirst().

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

Phương pháp .findFirst() sẽ trả về một Optional có thể có hoặc không có thể chứa một giá trị chuỗi (nó có thể không chứa một giá trị nếu stringsList là trống).

Sau đó, để tháo vật phẩm khỏi tùy chọn Sử dụng phương thức .get().

Các vấn đề liên quan