排序方式,更好 - hashmap,treemap,自定义实现

时间:2016-11-08 20:56:12

标签: java sorting arraylist hashmap treemap

我有一个Subjects的ArrayList,它们有参数Date,我想将它们分组为Day个对象的排序数组(可能不是数组,但仍然是排序结构),所以每个Day都有参数Date,而对象只包含具有此日期的主题。所以我想做的事情是以某种方式按日期对它们进行分组然后得到它们。我看到使用HashMap进行分组的实现,但后来我有分组结构但没有排序,所以之后我应该将它转换为ArrayList。或者也许我应该使用TreeMap,它会做同样的但是给我回排序结构,或者最好的方法就是编写我自己的排序器,它将获得ArrayList<Subject>并返回ArrayList<Day>。我也可以使用LinkedHashMap也可以使用

所以现在我不知道什么是更好的,我应该选择什么?重要的是,我很可能不会从结构中添加新值或删除值,我只会得到它们。

UPD:如果我使用地图,则Date将成为关键,Day对象将成为价值。

通过说“得到他们”,我的意思是迭代他们。

所有这些我正在做的是为了用这些信息填充我的UI元素,所以我很可能以后不会在我的结构中搜索某些东西

1 个答案:

答案 0 :(得分:1)

以下是我认为你要求的内容,但希望我的答案可以提供帮助,即使它不完全是:

  1. 使用failAfter作为密钥进行快速查找
  2. 应该对该查找的结果进行排序(即,订购同一天的多次)
  3. 可以查看按Day
  4. 排序的所有科目

    这是一个选项。使用DayMapDay的排序列表相关联,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;
    }
    

    此实现将工作放在首位,为您提供高效的查找速度。如果我稍微误解了你的问题,你应该能够相应地调整它。如果我完全误解了你的问题......我会很难过。干杯!