2010-01-12 18 views
11

Tôi muốn sử dụng một bộ sưu tập thay cho mảng 2D để tôi không cần phải cung cấp kích thước của nó tại thời điểm khai báo và tôi có thể thêm nhiều phần tử như tôi muốn động.Bộ sưu tập nào để sử dụng thay cho mảng 2D trong Java?

+1

Bạn sẽ sử dụng mẫu nào để truy cập các phần tử trong mảng? Truy cập ngẫu nhiên, toàn bộ hàng, toàn bộ cột? –

Trả lời

7

Sự cố với Danh sách> là bạn phải chỉnh sửa lại mỗi hàng nếu bạn muốn đặt lại ma trận của mình.

Nếu bạn muốn sử dụng một ma trận thưa thớt, hoặc có thể một ma trận vô hạn bạn có thể làm một cái gì đó như:

class SparseMatrix<X> { 
    private Map<Coord, X> values = new HashMap<Coord, X>(); 

    public SparseMatrix() { 
    } 

    public X get(int x, int y) { 
    return values.put(new Coord(x,y)); // null if there's no value 
    } 

    public void set(int x, int y, X value) { // you can use null (like in a List) 
    values.set(new Coord(x,y), value); 
    } 

    private static class Coord { 
    int x; int y; 
    public Coord(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (other instance of Coord) { 
      Coord o = (Coord) other; 
      return o.x == x && o.y == y; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return o.x + o.y; // or some more clever implementation :) 
    } 

    } 
} 

Edit:Apache Commons HashCodeBuilder là một công cụ tuyệt vời để tạo ra băm-mã.

+1

hashCode của bạn có thể tràn - tuy nhiên bạn * đã * đã nhận xét nó cho phù hợp ... :) – Esko

+0

Xem sắc nét !!! Có một phương thức tiện ích: java.util.Arrays.hashCode (int []) tạo mã băm cho một int [] nhưng tất nhiên, sẽ không tốt nếu tạo một mảng mỗi khi hashChode là cần thiết (hoặc có nó tạo ra). Có lẽ chúng ta có thể sao chép nó thực hiện cho chỉ hai số nguyên: (31 + o.x) * 31 + o.y. Nhưng có vẻ như nó vẫn tràn ... (tôi nghĩ nó không quan trọng, nó có phải là cyclic không?). – helios

+0

Có quan trọng trong hashCode() x + y == y + x không? – Adam

0

Cá nhân tôi đang sử dụng lớp học Vector cho mục đích đó, mặc dù các yêu cầu khác nhau cuối cùng có thể quy định việc sử dụng các lớp học chuyên biệt khác.

+0

Vector bị phản đối khá nhiều và đã được thay thế bằng ArrayList. – Yoni

+2

@mortiz - 'java.util.Vector' nói chung nên tránh - an toàn chủ đề của nó không phải là rất hữu ích cho hầu hết các kịch bản đa luồng và chỉ cần thêm phí vào sử dụng đơn luồng. Hầu hết mọi người sử dụng 'ArrayList' làm kiểu' List' mặc định của họ thay vào đó. – McDowell

+0

đã học được điều gì đó, cảm ơn! – moritz

0

java.util.ArrayList là lựa chọn ưa thích của tôi.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

+0

Tôi nghĩ rằng nó được sử dụng khi chúng ta muốn có mảng 1-D động –

+0

Bạn có thể có một ArrayList rằng mỗi phần tử của nó sẽ là một ArrayList khác (như rsp và tôi đang đề xuất trong các câu trả lời của chúng ta). Bằng cách này, một ArrayList cũng có thể được sử dụng cho các mảng 2D. – Alex

0

nhập java.util.ArrayList;

ArrayList là những gì bạn muốn, bạn không cần phải thiết lập kích thước của nó vào thời điểm sáng tạo và bạn có thể thêm các yếu tố động bằng cách sử dụng phương pháp add.

2

Cách đơn giản nhất là sử dụng bộ sưu tập lồng nhau ... nói (giả sử giá trị của bạn Strings) List<List<String>> mà sau đó có thể được sử dụng như thế này:

List<List<String>> fakeArray = new ArrayList<List<String>>(); 

// Pretend you fill it with values between these calls 
String retrieve = fakeArray.get(0).get(0); 

Edit: Đây là ban đầu là một Map<String,List<String>> mà thực sự doesn' t có ý nghĩa trong bối cảnh này.

Tuy nhiên, bạn có thể muốn xem liệu Google Collections hoặc Apache Commons Collections có thứ gì đó chuyên biệt hơn mà bạn có thể sử dụng hay không.

0

Nó phụ thuộc vào những gì bạn đang cố gắng làm, nhưng tôi muốn giới thiệu ArrayList. Nó nhanh hơn Vector. Trừ khi bạn quan tâm đến việc đồng bộ hóa! Nếu bạn muốn nó như là một danh sách 2 chiều, thì bạn tạo một ArrayList và mỗi phần tử của danh sách này sẽ là một ArrayList khác.

0

Bạn có thể làm thử nghiệm với ArrayListArrayList s làm các mục. Nếu điều đó không làm những gì bạn muốn, nó sẽ cung cấp cho instight trong những gì bạn cần để xây dựng cho mình.

2

Bạn muốn làm gì với ứng dụng này? Tôi có lẽ chỉ đơn giản là sử dụng một Collection<Collection<Element>> (nơi Bộ sưu tập có thể được thay thế bằng Danh sách).

Hoặc bạn có thể tạo lớp của riêng bạn với các metod để lặp qua các hàng hoặc cột hoặc tất cả các phần tử nếu cần.

0

Tùy thuộc vào cách bạn muốn sử dụng cấu trúc dữ liệu. Các tùy chọn của bạn là:

  • Hai danh sách; đó là công việc của bạn để đồng bộ hóa giữa chúng.
  • Bản đồ; thay vì quan hệ khóa-giá trị, các mục nhập bản đồ của bạn sẽ đơn giản là các đối tượng.
  • Danh sách các mảng đối tượng 2 ô; mỗi mục trong danh sách sẽ là một mảng đối tượng kích thước 2.

EDIT: tôi hoàn toàn hiểu sai câu hỏi; Tôi nghĩ rằng đó là khoảng một mảng 2D có chiều rộng 2.

Có đọc đúng câu hỏi (Tôi hy vọng :-)), tôi đồng ý với những người đã liệt kê danh sách.

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