簡體   English   中英

排序依據,更好-哈希圖,樹圖,自定義實現

[英]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元素而做的所有事情,因此很可能以后我將不會在結構中搜索某些內容

這是我認為您要的內容,但希望我的回答可以幫助您,即使並非完全如此:

  1. 以“ Day為鍵進行快速查找
  2. 查找的結果應排序(即訂購同一天的多次)
  3. 可以查看所有主題按其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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM