繁体   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