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?
Trả lời
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ã.
hashCode của bạn có thể tràn - tuy nhiên bạn * đã * đã nhận xét nó cho phù hợp ... :) – Esko
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
Có quan trọng trong hashCode() x + y == y + x không? – Adam
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.
Vector bị phản đối khá nhiều và đã được thay thế bằng ArrayList. – Yoni
@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
đã học được điều gì đó, cảm ơn! – moritz
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
Tôi nghĩ rằng nó được sử dụng khi chúng ta muốn có mảng 1-D động –
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
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
.
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.
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.
Bạn có thể làm thử nghiệm với ArrayList
có ArrayList
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.
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.
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.
- 1. Bộ sưu tập giống Java trong PHP
- 2. Bộ sưu tập tuyển tập có mảng
- 3. Loại kết nối Java, biến, mảng và bộ sưu tập
- 4. Mapping bộ sưu tập sử dụng AutoMapper
- 5. tùy serialization các bộ sưu tập java sử dụng xStream
- 6. Bộ sưu tập lười biếng trong Java
- 7. Tôi làm cách nào để tìm hiểu cách sử dụng bộ sưu tập commons Java?
- 8. Sử dụng API bộ sưu tập để xáo trộn
- 9. Tạo một bộ sưu tập (mảng) trong Sass để sử dụng trong vòng lặp @for
- 10. Bộ sưu tập rác java
- 11. Sắp xếp bộ sưu tập trong bộ sưu tập bằng cách sử dụng LINQ
- 12. Làm thế nào để xử lý null khi sử dụng bộ sưu tập Java loại
- 13. Bộ sưu tập/Mảng chứa phương pháp
- 14. Tôi nên sử dụng giao diện bộ sưu tập nào trong .NET cho COM-interop?
- 15. Đối tượng Dereferencing trong một mảng cho Bộ sưu tập rác Java
- 16. Cách sử dụng bộ sưu tập rác để xóa tệp?
- 17. Sử dụng Google-bộ sưu tập MapMaker?
- 18. Tôi nên sử dụng loại bộ sưu tập nào?
- 19. Bộ sưu tập Bootstrapping cho hiệu suất
- 20. Bạn đề xuất thư viện Bộ sưu tập Java nào?
- 21. Bộ sưu tập Java để cho phép thêm và xóa trong khi đang lặp lại
- 22. bộ sưu tập java so với bản đồ trong khung bộ sưu tập
- 23. Khi nào sử dụng EventListenerList thay vì một bộ sưu tập chung của người nghe
- 24. Bộ sưu tập để chuỗi sử dụng LINQ
- 25. Bộ sưu tập chính và bộ sưu tập nhỏ của Java
- 26. Sử dụng Bộ sưu tập chung của Google trong GWT
- 27. mảng hoặc bộ sưu tập đối tượng trong VBA Excel
- 28. LINQ hiệu suất cho bộ sưu tập
- 29. NewLISP có sử dụng bộ sưu tập rác không?
- 30. bộ sưu tập nào C# để sử dụng thay cho Danh sách <KeyValuePair <string, double >>?
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? –