Tôi có một danh sách các Chuỗi. Tôi muốn đánh giá từng chuỗi dựa trên hàm trả về gấp đôi. Sau đó, tôi muốn 5 chuỗi đầu tiên, dựa trên giá trị được tính toán của chúng. Nếu có ít hơn 5, tôi muốn tất cả chúng (theo thứ tự). Giả sử các chuỗi là các hợp chất hóa học và hàm tính toán khối lượng. Hàm này tốn kém về mặt tính toán; Tôi cần phải đánh giá nó một lần cho mỗi chuỗi. (Tuy nhiên, tôi chỉ đang tạo nên dữ liệu ở đây.)Giá trị N đầu tiên của một Bản đồ <K, V> được sắp xếp theo giá trị
H2O => 18.5
C12H11O22 => 109.1
HeNe => 32.0
H2SO4 => 54.37
HCl => 19.11
4FeO3 => 82.39
Xe6 => 281.9
Chương trình phải trả lại năm chuỗi đầu tiên được sắp xếp theo thứ tự theo giá trị tương ứng. Đối với dữ liệu mẫu này: H20, HCl, HeNe, H2SO4, 4FeO3
. Trên thực tế, tôi không thực sự quan tâm đến thứ tự; Tôi chỉ cần năm cái thấp nhất theo thứ tự bất kỳ.
Tôi đã nghĩ về cách tôi làm điều này trong Perl. Đó chỉ là một vài dòng:
foreach $s (@str) {
$strmap{$s} = f($s);
}
@sorted = sort { $strmap{$a} <=> $strmap{$b} } keys %strmap;
return @sorted[0, 4]
Nhưng tôi cần làm điều đó trong Java. Và điều đó khiến tôi phát điên.
Trước tiên, tôi đã thử điền một số HashMap<String, Double>
, sau đó sử dụng Collections.sort
với trình so sánh tùy chỉnh, giống như phiên bản Perl. Nhưng phạm vi trên Comparator ngăn không cho nó đề cập đến HashMap để tra cứu các giá trị.
Sau đó, tôi đã thử một TreeMap<String, Double>
, nhưng nó chỉ sắp xếp theo khóa và không có số tiền co giật có thể làm cho nó để đặt hàng các mục theo giá trị.
Vì vậy, tôi đã thử một TreeMap<Double, String>
. Nó sẽ loại bỏ các mục với cùng một đôi. Tuy nhiên, khả năng có các chuỗi ánh xạ tới cùng một Đôi là thấp, vì vậy tôi đã nhấn tiếp. Việc thêm các mục vào TreeMap là không có vấn đề gì, nhưng tôi đã gặp phải các vấn đề cố gắng trích xuất các giá trị từ nó.
Bản đồ cây cung cấp phương thức được gọi là subMap
, nhưng thông số của nó là các khóa phân định tập hợp con. Tôi không biết chúng là gì; Tôi chỉ muốn năm người đầu tiên trong số họ. Vì vậy, tôi đã thử sử dụng phương thức values
để lấy tất cả các giá trị trong TreeMap, hy vọng chúng sẽ theo thứ tự. Sau đó, tôi chỉ có thể nhận được mười đầu tiên.
ArrayList<String> strs = (ArrayList<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
Không. Lỗi thời gian chạy: không thể truyền TreeMap $ Values vào ArrayList.
List<String> strs = (List<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
Tương tự. Lỗi thời gian chạy cố gắng thực hiện dàn diễn viên. OK, hãy chỉ gán cho Bộ sưu tập ...
Collection<String> strs = treemap.values();
return new ArrayList<String>(strs.subList(0, 5));
Xin lỗi, subList
không phải là một phương pháp thu thập.
Collection<String> strs = treemap.values();
ArrayList<String> a = new ArrayList<String>(strs);
return new ArrayList<String>(a.subList(0, 5));
Cuối cùng, thứ gì đó hoạt động! Nhưng hai cấu trúc dữ liệu bổ sung chỉ để có được năm yếu tố đầu tiên? Và tôi không quá hoang dại về việc sử dụng Double làm chìa khóa cho TreeMap.
Có giải pháp nào tốt hơn không?
Bạn có thể vui lòng cung cấp một số mẫu để hiểu câu hỏi tốt hơn – asifsid88
Dữ liệu mẫu? Hoặc mẫu mã của những thứ tôi đã thử? –
Theo dữ liệu mẫu tôi có ý nghĩa cho một tập hợp các đầu vào, đầu ra mong đợi là gì – asifsid88