2009-03-25 27 views
341

Tôi đang tìm một lớp trong java có liên kết khóa-giá trị, nhưng không sử dụng băm. Dưới đây là những gì tôi hiện đang làm:Lớp Java triển khai Bản đồ và giữ thứ tự chèn?

  1. Thêm giá trị vào Hashtable.
  2. Nhận trình lặp cho Hashtable.entrySet().
  3. Lặp lại tất cả các giá trị và:
    1. Nhận Map.Entry cho trình lặp.
    2. Tạo đối tượng thuộc loại Module (một lớp tùy chỉnh) dựa trên giá trị.
    3. Thêm lớp học vào JPanel.
  4. Hiển thị bảng điều khiển.

Vấn đề với điều này là tôi không có quyền kiểm soát thứ tự mà tôi lấy lại các giá trị, vì vậy tôi không thể hiển thị các giá trị theo thứ tự đã cho (không có thứ tự mã hóa cứng).

Tôi sẽ sử dụng một ArrayList hoặc Vector cho điều này, nhưng sau đó trong mã tôi cần phải lấy các đối tượng Module cho một khóa nhất định, mà tôi không thể làm với một ArrayList hoặc Vector.

Có ai biết lớp Java miễn phí/mã nguồn mở sẽ thực hiện việc này hay cách để lấy giá trị từ số Hashtable dựa trên thời điểm chúng được thêm?

Cảm ơn!

+1

Bạn không cần phải sử dụng mục nhập/bản đồ.thử. bạn có thể lặp qua các khóa và giá trị bằng cách sử dụng hashtable.keys như một liệt kê hoặc bằng cách sử dụng hashtable.keyset.iterator. –

+4

Tôi đã tự do thay đổi tiêu đề, vì không sử dụng băm không thực sự là vấn đề, nhưng vẫn giữ trật tự chèn. –

Trả lời

552

Tôi đề xuất một số LinkedHashMap hoặc TreeMap. A LinkedHashMap giữ các phím theo thứ tự chúng được chèn vào, trong khi TreeMap được sắp xếp theo số Comparator hoặc thứ tự tự nhiên Comparable thứ tự của các phần tử.

Vì nó không phải giữ các yếu tố được sắp xếp, LinkedHashMap sẽ nhanh hơn đối với hầu hết các trường hợp; TreeMap có hiệu suất O(log n) cho containsKey, get, putremove, theo Javadocs, trong khi LinkedHashMapO(1) cho mỗi.

Nếu API của bạn chỉ dự kiến ​​thứ tự sắp xếp có thể dự đoán, trái ngược với thứ tự sắp xếp cụ thể, hãy xem xét sử dụng giao diện hai lớp này triển khai, NavigableMap hoặc SortedMap. Điều này sẽ cho phép bạn không rò rỉ các triển khai cụ thể vào API của bạn và chuyển sang một trong các lớp cụ thể đó hoặc thực hiện hoàn toàn khác theo ý muốn sau đó.

+2

Điều này sẽ không có tác dụng đối với tôi bởi vì, theo javadocs, điều này chỉ cho các giá trị đặt hàng (thông qua các giá trị() gọi). Có cách nào để có được phiên bản Map.Entry đặt hàng? –

+1

@CoryKendall: TreeMap có hoạt động không? Nó được cho là được sắp xếp theo các khóa, không phải bởi các giá trị. –

+1

Sai lầm của tôi, tôi nghĩ Bộ không được phân loại. –

1

Tôi không biết đó có phải là mã nguồn mở hay không, nhưng sau một chút googling, tôi đã tìm thấy this implementation of Map using ArrayList. Nó có vẻ là tiền Java 1.5, vì vậy bạn có thể muốn chung hóa nó, điều này sẽ dễ dàng. Lưu ý rằng việc triển khai này có quyền truy cập O (N), nhưng điều này không phải là vấn đề nếu bạn không thêm hàng trăm tiện ích vào JPanel của mình, điều mà bạn không nên làm.

5

Bạn có thể duy trì Map (để tra cứu nhanh) và List (để đặt hàng) nhưng LinkedHashMap có thể là đơn giản nhất. Bạn cũng có thể thử một số SortedMap ví dụ: TreeMap, trong đó có bất kỳ thứ tự nào bạn chỉ định.

13

Nếu một bản đồ bất biến phù hợp với nhu cầu của bạn sau đó có một thư viện bằng google gọi guava (xem thêm guava questions)

Guava cung cấp một ImmutableMap với trật tự lặp người dùng chỉ định đáng tin cậy. Điều này ImmutableMap có O (1) hiệu suất cho containsKey, nhận được. Rõ ràng đặt và loại bỏ không được hỗ trợ.

ImmutableMap đối tượng được tạo bằng cách sử dụng các phương pháp tiện lợi tĩnh thanh lịch of()copyOf() hoặc đối tượng Builder.

2

LinkedHashMap sẽ trả về các phần tử theo thứ tự chúng được chèn vào bản đồ khi bạn lặp qua các phím Số(), mục nhậpSet() hoặc giá trị() của bản đồ.

Map<String, String> map = new LinkedHashMap<String, String>(); 

map.put("id", "1"); 
map.put("name", "rohan"); 
map.put("age", "26"); 

for (Map.Entry<String, String> entry : map.entrySet()) { 
    System.out.println(entry.getKey() + " = " + entry.getValue()); 
} 

này sẽ in các yếu tố theo thứ tự chúng được đưa vào bản đồ:

id = 1 
name = rohan 
age = 26 
0

Bất cứ khi nào tôi cần phải duy trì trật tự tự nhiên của sự vật được biết trước thời hạn, tôi sử dụng một EnumMap

các phím sẽ là enums và bạn có thể chèn theo bất kỳ thứ tự nào bạn muốn nhưng khi bạn lặp lại nó sẽ lặp lại theo thứ tự enum (thứ tự tự nhiên).

Ngoài ra khi sử dụng EnumMap, sẽ không có xung đột nào có thể hiệu quả hơn.

Tôi thực sự thấy rằng việc sử dụng enumMap làm cho mã dễ đọc. Đây là số example

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