2009-12-28 25 views
38
public class MyGraph<V,E> extends SparseMultigraph<V,E>{ 
    private ArrayList<MyNode> myNodeList; 

    public MyNode getNode(int nodeId){ 
     myNodeList = new ArrayList<MyNode>(); 
     myNodeList = (ArrayList<MyNode>)this.getVertices(); 
     int i; 

Sau đây là những msg lỗi:Java - Làm thế nào để chuyển đổi bộ sưu tập kiểu thành ArrayList?

ngoại lệ trong chủ đề java.lang.ClassCastException "chính": java.util.Collections $ UnmodifiableCollection không thể được đúc để java.util.ArrayList .. .

Có ai giúp được không?

+0

Vòng qua và chỉ cần thêm các nút. –

+2

Vui lòng đăng thêm mã, ít nhất là các khai báo và khởi tạo của tất cả các thành phần tham gia. Lý tưởng nhất là đăng một chương trình nhỏ để biên dịch và chạy và thể hiện vấn đề của bạn. Đơn giản hóa chương trình của bạn theo cách đó thường sẽ hướng bạn đến giải pháp. – sleske

Trả lời

65

Như những người khác đã đề cập, ArrayList có một hàm tạo lấy một tập hợp các mục và thêm tất cả chúng. Đây là tài liệu hướng dẫn:

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

Vì vậy, bạn cần thực hiện:

ArrayList<MyNode> myNodeList = new ArrayList<MyNode>(this.getVertices()); 

Tuy nhiên, trong bình luận khác, bạn nói rằng đã đem lại cho bạn một lỗi biên dịch. Có vẻ như lớp MyGraph của bạn là một lớp học chung. Và vì vậy getVertices() thực sự trả về loại V, không gõ myNode.

Tôi nghĩ rằng mã của bạn sẽ trông như thế này:

public V getNode(int nodeId){ 
     ArrayList<V> myNodeList = new ArrayList<V>(this.getVertices()); 
     return myNodeList(nodeId); 
} 

Nhưng, những gì đã nói đó là một cách rất hiệu quả để trích xuất một nút. Những gì bạn có thể muốn làm là lưu trữ các nút trong một cây nhị phân, sau đó khi bạn nhận được một yêu cầu cho nút thứ n, bạn thực hiện tìm kiếm nhị phân.

+0

OK, cảm ơn! – user236691

+0

Hãy coi chừng rằng nó trả về một bản sao nông. Không phải là một tham chiếu đến danh sách thực sự. – zgulser

1

biết thêm thông tin cần thiết cho một câu trả lời dứt khoát, nhưng mã này

myNodeList = (ArrayList<MyNode>)this.getVertices(); 

sẽ chỉ việc nếu this.getVertices() trả về một (subtype của) List<MyNode>. Nếu đó là một bộ sưu tập khác (như Ngoại lệ của bạn dường như chỉ ra), bạn muốn sử dụng

new ArrayList<MyNode>(this.getVertices()) 

Điều này sẽ hoạt động miễn là loại Bộ sưu tập được trả về bởi getVertices.

+0

Nó trả về một loại colletion ... nhưng cái này new ArrayList (this.getVertices()) không hoạt động .. – user236691

18

Hãy thử mã này

Chuyển đổi ArrayList vào bộ sưu tập

ArrayList<User> usersArrayList = new ArrayList<User>(); 

    Collection<User> userCollection = new HashSet<User>(usersArrayList); 

Collection Convert to ArrayList

Collection<User> userCollection = new HashSet<User>(usersArrayList); 

    List<User> userList = new ArrayList<User>(userCollection); 
+0

Vô cùng hữu ích! –

4
public <E> List<E> collectionToList(Collection<E> collection) 
{ 
    List<E> list; 
    if (collection instanceof List) 
    { 
     list = (List<E>) collection; 
    } 
    else 
    { 
     list = new ArrayList<E>(collection); 
    } 
    return list; 
} 

Sử dụng các phương pháp trên để chuyển đổi các collec tion vào danh sách

2

Đoạn mã dưới đây sẽ thất bại:

List<String> will_fail = (List<String>)Collections.unmodifiableCollection(new ArrayList<String>()); 

này thay vào đó sẽ làm việc:

List<String> will_work = new ArrayList<String>(Collections.unmodifiableCollection(new ArrayList<String>())); 
Các vấn đề liên quan