2017-11-22 37 views
6

Tôi có một danh sách các bản đồ như dưới đây. Tôi muốn sắp xếp các bản đồ bên trong danh sách theo thứ tự tùy chỉnh trong Java 8.Bản đồ sắp xếp tùy chỉnh trong Java 8

Ví dụ, Dưới đây là danh sách các bản đồ.

[{model=Ferrari}, 
{model=Tesla}, 
{model=Benz}, 
{model=Honda}] 

Nếu tôi sắp xếp danh sách bản đồ trên bằng cách sử dụng mã bên dưới, Sắp xếp theo thứ tự bảng chữ cái.

l.sort(Comparator.comparing((Map<String,String> mp) -> mp.get("model"))); 

cho đầu ra bên dưới.

[{model = Benz}, {model = Ferrari}, {model = Honda}, {model = Tesla}]

Nhưng tôi cần phải sắp xếp bản đồ này dựa trên thứ tự (Không Thứ tự chữ cái): Honda, Tesla, Benz, Ferrari

Có cách tiếp cận nào tốt hơn chúng ta có thể đạt được loại tùy chỉnh trong Java 8 không?

+0

Nếu bạn muốn có một trật tự tùy chỉnh, nó phải được định nghĩa ở đâu đó. Ví dụ: bạn có thể thêm một mục nhập thứ hai vào mỗi bản đồ của bạn, "order = 1" hoặc một cái gì đó. –

+3

Nếu bạn đặt '[" Honda "," Tesla "," Benz "," Ferrari "]' vào danh sách, bạn có thể sắp xếp theo chỉ mục của mô hình trong danh sách đó. – khelwood

+0

@khelwood thats ý tưởng tốt. Hãy để tôi thử đề xuất của bạn. –

Trả lời

6

Bạn nên xác định thứ tự ưa thích của mình ở đâu đó bên ngoài mã này. Đặt nó vào một số loại danh sách và sau đó biến nó thành Map of modelName -> index.

Map<String,Integer> modelOrder = ..... 

khi đó, bạn có thể thêm một lần tra cứu để lấy thứ tự để so sánh.

l.sort(Comparator.comparing((Map<String,String> mp) -> 
    modelOrder.get(mp.get("model")))); 

Điều này sẽ phát nổ nếu bạn không biết mô hình chưa biết. Bạn có thể làm sửa chữa nhanh chóng bởi một cái gì đó giống như

l.sort(Comparator.comparing((Map<String,String> mp) -> 
    modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE))); 

để đưa mô hình chưa được biết ở phút cuối, nhưng họ sẽ không được sắp xếp với nhau (vì vậy ngay cả cùng một mô hình chưa biết có thể được xen kẽ bởi những người khác chưa biết).

Edit:

Khi mọi người gợi ý trong các ý kiến, nó có thể được giải quyết độc đáo với .thenComparing

l.sort(Comparator 
    .comparing((Map<String,String> mp) -> modelOrder.getOrDefault(mp.get("model"),Integer.MAX_VALUE)) 
    .thenComparing((Map<String,String> mp) -> mp.get("model"))); 
+1

Nên có thể sử dụng một cái gì đó như '(dài) (Math.abs (mp.get (" model "). hashCode())) + modelOrder.size() 'làm giá trị mặc định để sắp xếp các ẩn số. Việc sử dụng lâu dài là để ngăn chặn tràn từ hashcode, và modelOrder.size() nên đảm bảo nó sau khi các mô hình được biết đến. Nói chung điều này có thể là một chút overkill – phflack

+0

Hoặc chỉ cần sử dụng 'thenComparing (modelOrder.get (mp.get (" mô hình "))' để so sánh các chuỗi nếu họ không có trong danh sách (sau khi so sánh 'getOrDefault()'). –

+0

@Didier L: bạn có thể tránh thực hiện tra cứu bản đồ bổ sung, 'Comparator.comparing (mp -> mp.get (" model "), Comparator.compareInt ((String s) -> modelOrder.getOrDefault (s, Integer.MAX_VALUE)) .thenComparing (Comparator.naturalOrder())) ' – Holger

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