2010-03-30 36 views
5

Tôi muốn tạo một mảng XY các số nguyên (hoặc bất kỳ kiểu nào), nhưng tôi muốn sử dụng các phương thức như "thêm", "loại bỏ", "chứa", "indexOf "tương tự như lớp ArrayList.Java: Mảng giá trị với các phương thức/khả năng tương tự như ArrayList

Có bất kỳ lớp học hiện có nào với các khả năng này không?

PS: Tôi không muốn tạo một ArrayList của ArrayList

+1

"Tôi không muốn tạo một ArrayList của ArrayList" Tại sao? Nó sẽ thực sự phù hợp với mô tả của bạn một cách hoàn hảo. Có phải vì bạn muốn sử dụng các kiểu nguyên thủy? – Searles

+0

Không. Đó là vì tôi muốn tạo các đối tượng sẽ chiếm nhiều hơn một ô, và mỗi ô có thể theo chiều dọc hoặc chiều ngang. Nếu chúng ta xem xét rằng ArrayList là dọc, tôi sẽ có vấn đề với các đối tượng theo chiều ngang, vì chúng sẽ sử dụng các vị trí khác nhau của các biến ArrayLists cùng một lúc. –

Trả lời

3

Không, AFAIK không có bất kỳ lớp nào như thế này. Nhưng Thực hiện một nên được khá dễ dàng:

class BiDimensionalArray<T>{ 
    Object[][] backupArray; 
    int lengthX; 
    int lengthY; 

    public BiDimensionalArray(int lengthX, int lengthY) { 
    backupArray = new Object[lengthX][lengthY]; 
    this.lengthX = lengthX; 
    this.lengthY = lengthY; 
    } 

    public void set(int x, int y, T value){ 
    backupArray[x][y] = value; 
    } 

    public T get(int x, int y){ 
    return (T) backupArray[x][y]; 
    } 

    public void addX(T[] valuesY) { 
    Object[][] newArray = new Object[lengthX+1][lengthY]; 
    System.arraycopy(backupArray, 0, newArray, 0, lengthX); 
    newArray[lengthX]=valuesY; 
    backupArray = newArray; 
    lengthX = lengthX+1; 
    } 
} 

Lưu ý: Các Typeparameter không được sử dụng trong nội bộ, vì không có những điều như new T[][]

CÁC CHỈNH SỬA
Added addX Phương pháp cho cuộc biểu tình
Sửa lỗi biên dịch

1

Không có loại ma trận gốc nào trong các thư viện Java chuẩn. Điều đó đang được nói, nó khá dễ dàng để tạo ra một. Các phương pháp này là không đáng kể để thực hiện và bạn có thể trả về nó với một mảng, một List hoặc bất kỳ thứ gì.

public class Matrix<T> { 
    private final List<T> values; 
    private final int rows; 

    public Matrix(int x, int y) { 
    this.rows = x; 
    values = new ArrayList<T>(x * y); 
    ] 

    public int get(int x, int y) { 
    return values.get(x * rows + y); 
    } 

    public boolean contains(T t) { 
    return values.contains(t); 
    } 

    // etc 
} 
+0

Bạn đang mong đợi 'xóa' thực sự làm gì? (Và bạn có muốn kiểm tra đối số của mình không?) –

+0

@Tom http://java.sun.com/javase/6/docs/api/java/util/List.html#remove(java.lang.Object) – cletus

+1

I có nghĩa là 'Matrix.remove'. Thứ nhất, nó chỉ loại bỏ sự đồng nhất đầu tiên, có nghĩa là bạn phụ thuộc vào cách bố trí thực hiện. Thứ hai, nó thay đổi các mục còn lại theo kiểu unMatrix nhất, và khiến 'get' ném một cách kỳ lạ. –

1

kiểm tra JAMA, từ Mathworks và NIST.

2

Từ mô tả của bạn, tôi khuyên bạn nên thử sử dụng JAMA.
Bạn cũng có thể tạo triển khai của riêng bạn cho một XY Matrix. Tuy nhiên, để làm điều này, bạn sẽ phải quyết định chính xác những gì bạn muốn từ việc thực hiện.
Nếu ma trận của bạn không có kích thước cố định, thì bạn có thể sử dụng một cái gì đó giống như định dạng 3 tuple để lưu trữ ma trận. (Biểu diễn này chỉ hiệu quả nếu ma trận của bạn thưa thớt). Bên trong, bạn sẽ sử dụng ba ArrayLists; một để lưu trữ số hàng, thứ hai để lưu trữ số cột và số thứ ba để lưu trữ giá trị thực. Theo đó, bạn sẽ viết phương thức add(int row, int column, int value), sẽ xử lý những thứ như giữ ArrayLists được sắp xếp theo số hàng, sau đó theo số cột, v.v. để tăng hiệu quả truy cập ngẫu nhiên.
Với đại diện này, bạn có thể triển khai tất cả các phương thức như remove(), , có sẵn cho ArrayList.

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