[英]Sorting HashMap into TreeMap: custom Comparator removes values with the same key
[英]Sorting by, which is better - hashmap, treemap, custom implementation
我有一個ArrayList of Subjects
並且它們具有參數Date
,我想將它們分組為Day
對象的排序數組(也許不是數組,但仍然是排序的結構),因此每個Day
都有參數Date
並且對象將只包含具有該日期的主題。 所以我想做的就是以某種方式按日期對它們進行分組,然后將其獲取。 我看到了使用HashMap進行分組的實現,但是后來我對結構進行了分組,但是沒有進行排序,因此在此之后,我應該將其轉換為ArrayList。 或也許我應該使用TreeMap,它會執行相同的操作,但是會返回排序后的結構,或者最好的方法是簡單地編寫自己的排序器,該排序器將獲取ArrayList<Subject>
並返回ArrayList<Day>
。 我也可以使用LinkedHashMap
所以現在我不知道哪個更好,我應該選擇什么? 重要的是,很可能不會放置新值或從結構中刪除值,而只會得到它們。
UPD:如果我使用地圖,則“ Date
將是關鍵,“ Day
對象將是值。
說“得到它們”是指遍歷它們。
我為了用此信息填充UI元素而做的所有事情,因此很可能以后我將不會在結構中搜索某些內容
這是我認為您要的內容,但希望我的回答可以幫助您,即使並非完全如此:
Day
為鍵進行快速查找 Day
排序的可能性 這是一個選擇。 使用Map
,一個相關聯Day
至排序列表Subjects
,所以Map<Day, List<Subject>>
。 由於不需要添加映射,因此可以在開始時構建映射,然后在進行任何查找之前對其進行排序。 這是一個大綱:
Map<Day, List<Subject>> buildMap(List<Subject> subjects) {
Map<Day, List<Subject>> map = new HashMap<Day, List<Subject>>();
// create a list of subjects for each day
for (Subject subject : subjects) {
if (!map.containsKey(subject.getDate().getDay())) {
map.put(subject.getDate().getDay(), new ArrayList<Subject>());
}
map.get(subject.getDate().getDay()).add(subject);
}
// go through and sort everything now that you have grouped them
for (Day day : map.keySet()) {
Collections.sort(map.get(day));
}
return map;
}
如果還需要“獲取”整個地圖中排序的每個條目,則可以維護排序的日期列表。 像這樣:
List<Day> buildSortedDaysList(Map<Day, List<Subject>> map) {
List<Day> sortedDays = new ArrayList<Day>(map.keySet());
// again, many ways to sort, but I assume Day implements Comparable
Collections.sort(sortedDays);
return sortedDays;
}
然后,您可以將其包裝在一個類中,我建議您創建一個更好的名稱:
class SortedMapThing {
Map<Day, List<Subject>> map;
List<Day> orderedDays;
SortedMapThing(List<Subject> subjects) {
map = buildMap(subjects);
orderedDays = buildSortedDaysList(map);
}
List<Subject> getSubject(Day day) {
return map.get(day);
}
List<Subject> getAllSubjects() {
List<Subject> subjects = new ArrayList<Subject>();
for (Day day : orderedDays) {
subjects.addAll(map.get(day));
}
return subjects;
}
}
此實現使工作提前進行,並為您提供了高效的查找速度。 如果我對您的問題稍有誤解,那么您應該可以相應地進行調整。 如果我完全誤解了你的問題...我會很難過的。 干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.