2010-10-01 25 views
31

Trong Java, tôi sử dụng LinkedHashMap cho mục đích này. Các tài liệu của Java LinkedHashMap là rất rõ ràng rằng nó có "thứ tự lặp lại dự đoán" và tôi cần giống nhau trong Scala.Scala Map thực thi các mục nhập theo thứ tự chèn?

Scala có ListMapLinkedHashMap, nhưng tài liệu về những gì họ làm chính xác là kém.

Câu hỏi: Số LinkedHashMap hoặc ListMap của Scala có thực hiện để sử dụng cho mục đích này không? Nếu không, các tùy chọn khác có sẵn bên cạnh việc sử dụng trực tiếp LinkedHashMap của Java?

+2

chỉ cần lưu ý, tôi không khuyên bạn nên sử dụng các lớp ListMap của scala nói chung. Chúng có độ phức tạp thời gian tuyến tính cho hầu hết các hoạt động. Vì vậy, trừ khi bản đồ của bạn là nhỏ, logic sử dụng listmaps sẽ thực sự kéo. http://docs.scala-lang.org/overviews/collections/performance-characteristics.html –

Trả lời

38

Từ trang LinkedHashMap Scaladoc:

  • "Lớp này thực hiện các bản đồ có thể thay đổi cách sử dụng một Hashtable Các iterator và tất cả các phương pháp traversal này yếu tố lớp lần theo thứ tự họ chèn vào.."
+0

Ah, có vẻ như tôi không thể đọc tài liệu đúng cách. Cảm ơn! – ebruchez

13

Sự khác biệt giữa hai là LinkedHashMap là có thể thay đổi trong khi ListMap là không thay đổi. Nếu không, cả hai đều là MapLike và cũng giữ nguyên thứ tự chèn.

+2

Có cả ListMap bất biến và ListMap có thể thay đổi. – Michelle

+0

sự khác biệt khác là 'ListMap' có [phức tạp tuyến tính trong tra cứu và chèn] (https://docs.scala-lang.org/overviews/collections/performance-characteristics.html) –

3
  • LinkedHashMap là theo thứ tự nó đã được bổ sung
  • (không thay đổi) ListMap là theo thứ tự ngược nó đã được bổ sung (tức là người cuối cùng nói thêm là lần đầu tiên)

LinkedHashMap chỉ thực hiện như một bản đồ có thể thay đổi Danh sách bản đồ được thực hiện trong cả các gói có thể thay đổi và không thay đổi được, tuy nhiên chỉ có ListMaps không thay đổi duy trì thứ tự ngược. (bảng liệt kê có thể thay đổi không duy trì trật tự)

+0

đây là một bài viết tốt đẹp mà phá vỡ triển khai bản đồ khác nhau trong scala http://alvinalexander.com/scala/how-to-choose-map-implementation-class-sorted-scala-cookbook –

+0

ListMap thậm chí không duy trì thứ tự theo thứ tự ngược lại như bạn đang nói. Nó ngẫu nhiên hiển thị từ danh sách. – Nandakishore

+1

Trên thực tế tài liệu của scala api là sai. Và nó khác nhau giữa bất biến.ListMap và mutable.ListMap – Michelle

2

ListMap không giữ lại thứ tự chèn.

enter image description here

Chỉ LinkedHashMap duy trì trật tự của các yếu tố cách chúng được chèn vào.

enter image description here

Nếu bạn muốn duy trì trật tự tại danh mục otherthan Bản đồ bạn có thể sử dụng LinkedList

enter image description here

+0

bạn đang đánh giá các sơ đồ có thể thay đổi nhưng hầu hết mọi người sử dụng các danh sách không thay đổi được thực hiện hoàn toàn khác –

4

Đối với LinkedHashMap, câu trả lời là khá rõ ràng rằng nó giữ gìn trật tự của chèn.

Nhưng đối với ListMap, có vẻ như có một số nhầm lẫn ở đây.

Thứ nhất, có hai ListMap.

  • scala.collection.mutable.ListMap
  • scala.collection.immutable.ListMap.

Thứ hai, tài liệu cho ListMap có điều gì đó sai trái như tôi đã thử.

mutable.ListMap

Trình tự thực tế không phải là thứ tự chèn như nó nói.

Và nó cũng không phải là thứ tự đảo ngược của chèn. Kết quả tôi đã thử là [ra, thứ hai, thứ nhất, thứ ba]

Một bản đồ có thể thay đổi đơn giản được hỗ trợ bởi danh sách, do đó, nó duy trì thứ tự chèn.

immutable.ListMap

Khi tài liệu nói rằng, thứ tự là thứ tự chèn.

Một điều cần chú ý là nó được lưu trữ nội bộ theo thứ tự chèn ngược. Và thứ tự được lưu trữ nội bộ và thứ tự chuyển đổi/truyền tải là hai thứ. Thứ tự được lưu trữ bên trong quyết định độ phức tạp của các phương thức tra cứu như đầu/cuối/đuôi/init /.

Lớp này triển khai bản đồ không thay đổi bằng cấu trúc dữ liệu dựa trên danh sách. Liệt kê các trình vòng lặp bản đồ và các phương thức truyền tải truy cập các cặp khóa-giá trị trong lần đầu tiên whey được chèn vào.

Mục nhập được lưu trữ nội bộ theo thứ tự chèn ngược, có nghĩa là khóa mới nhất nằm ở đầu danh sách.

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