2008-12-03 43 views
5

Điều này sẽ dễ dàng đối với nhiều người trong số các bạn, nhưng đối với tôi nó chỉ là một chút rỉ sét cần phải bị sứt mẻ khi tôi quay trở lại với mã Java cơ bản. Sử dụng mảng kết hợp đẫm máu quá lâu bằng các ngôn ngữ khác đã khiến tôi trở nên tốt đẹp và hư hỏng. : PCọ vẽ cấu trúc dữ liệu (Java)

Vấn đề của tôi rất đơn giản: Tôi đang lưu trữ một tập hợp các đối tượng, mỗi đối tượng chứa một chuỗi và một số, trong một danh sách. Tôi muốn mỗi đối tượng được chèn vào danh sách này sẽ được sắp xếp theo thứ tự bảng chữ cái theo chuỗi của nó. Tôi cũng muốn có thể lấy các đối tượng từ danh sách theo chuỗi của họ. Tôi muốn làm điều này một cách chính thức và/hoặc hiệu quả nhất có thể.

Có điều gì đó đã có sẵn trong thư viện chuẩn Java không?

+0

Đáng ngạc nhiên là Javadocs cung cấp thông tin phong nha về cách sử dụng và hiệu suất của các cấu trúc dữ liệu có sẵn. Nếu bạn tra cứu các giao diện Map, Set và List, chúng sẽ hướng dẫn bạn đến các triển khai khác nhau có sẵn. Tôi không biết bạn đang sử dụng phiên bản nào, vì vậy tôi không liên kết trực tiếp. –

Trả lời

8

có một tuyệt vời writeup on java collections bao gồm hầu hết nhu cầu của bạn.

lời khuyên ngắn về vấn đề này: sử dụng TreeMap (Trình so sánh c) với Công cụ so sánh tùy chỉnh. khóa ist chuỗi, giá trị là đối tượng hỗn hợp có chuỗi và số

+0

Cảm ơn bạn đã liên kết đến Bộ sưu tập Java. Tôi đã tìm kiếm một cái gì đó trong Java so sánh với mô tả của Strostrup về C++ STL, và điều này có vẻ như nó là nó. – Rich

3

Âm thanh đó như là SortedMap. Với chuỗi là khóa và Số làm giá trị.

+0

Ah ok. Cảm ơn. Điều đó dễ hơn tôi mong đợi. –

+0

Nó xuất hiện SortedMap một giao diện mà cần phải được thực hiện, bằng cách (mà TreeMap xuất hiện để làm). –

2

Ngoài SortedMap, bạn có thể có một

TreeSet<Pair<String, Number>>
nơi bạn cung cấp bộ so sánh để sắp xếp các cặp (hoặc làm cho lớp Pair của bạn thực hiện Comparable và thực hiện ở đó).

Điều này giữ cho các đối tượng tách biệt với cấu trúc dữ liệu, và trong khi cho một ví dụ tầm thường như thế này, nó không phải là vấn đề lớn, bạn có thể tưởng tượng rằng một TreeSet <MyObject> trong đó MyObject thực hiện So sánh dễ dàng hơn. kỳ hạn.

+0

Tôi nghĩ rằng nó có giá trị bằng văn bản một số bài kiểm tra eh, bây giờ bạn có SortedMap, TreeSet và TreeMap gợi ý! Tôi nghĩ rằng TreeXYZ sẽ nhanh hơn để nhận được trình lặp, Maps nhanh hơn để chèn/truy xuất. Vì vậy, có lẽ TreeMap là lựa chọn tốt nhất tổng thể. – JeeBee

+0

Tôi có thể làm điều đó sau khi đọc xong chúng. Cảm ơn. –

+0

@JeeBee: TreeMap là Bản đồ duy nhất triển khai giao diện SortedMap trong API tiêu chuẩn Java. – Powerlord

1

Nếu bạn có giá trị chuỗi trùng lặp giữa các đối tượng trong danh sách, bạn có thể muốn xem Google Collections' TreeMultimap. Với TreeMultimap, không chỉ các phím được sắp xếp mà tất cả các giá trị có cùng khóa cũng được lưu trữ trong một bộ sưu tập.

Multimap<String, Pair> mm = new TreeMultimap<String, Pair>(
     new Comparator<String>(){...}, 
     new PairComparator()); 
mm.put("A", new Pair("A", 1)); 
mm.put("B", new Pair("B", 2)); 
mm.put("B", new Pair("B", 3)); 
Collection values = mm.values(); 
    // values are [Pair("A", 1), Pair("B", 2), Pair("B", 3)] 
Collection bValues = mm.get("B"); 
    // bValues are [Pair("B", 2), Pair("B", 3)] 
-1

Tôi đã làm một cái gì đó tương tự như vậy, tôi đã sử dụng ArrayList để lưu trữ chúng đối tượng và viết bộ so sánh để phân loại ArrayList.

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