2012-04-30 40 views
0

我需要采取ArrayList<Conference> conferences,其中Conference包含public Date beginDate参数,并按如下方式排序:首先,将单独的会议分成代表beginDate的唯一月份的桶,以及然后在桶内排序beginDate本身。我相信这是一个普遍的需要,所以我希望这里有人会有一些提示。用于将Java对象排序成桶的算法,然后在桶内排序

我的想法如下。请告诉我为什么这是次优:) :)

  1. 创建一个HashMap<Date, ArrayList<Conference>>
  2. 迭代conferences并使用特殊的静态函数查找它们的beginDate的月份的第一天,检查是否有ArrayList<Conference>用于该Date。然后将它们添加到ArrayListDate(它都应该是相同的,因为first_day_of_month(any_day_in_month)是相同的。
  3. 遍历HashMap的每个ArrayList构件和使用一个标准的排序过程按照日期到ArrayList排序。

这似乎不是必需的更复杂,但请让我知道为什么它是坏的,什么可以做修复它

编辑:另外,如果它很重要,我最终需要所有这些ArrayList的加回将会进入的ArrayAdapter commonsware's MergeAdapter ... :(

+0

我必须说我最终在一个完全无关的领域做了完全相同的事情。 'HashMap >>'。它工作得很好,即使每次添加新条目时都需要遍历BigDecimal键,以确保我不会重复一个值。 – Sheriff

回答

3

如果按从一开始的日期排序,则该月的条目将随后以任一方式排序。在初始排序后,如果条目是新月的第一个条目,则可以遍历所有条目并进行人为的“拆分”。我甚至不确定你需要做这样的区分(可能因为这个问题有点含糊)。

该算法的总复杂度为O(nlog n),其中n是元素的数量,当然没有更好的解决方案。

注意顺便说一句这个算法比你提出的操作复杂性更好。

+0

我想我需要差异化,因为我需要使用不同的适配器来添加到一个'MergeAdapter',它可以处理视图和适配器的顺序阵列...所以你说的是排序前面,然后当我找到第一个新月,将它添加到新的数组列表中? –

+0

@ jshin47是的,基本上就是这样。只需用'找到每一个新月份'替换'第一个新月份'即可更准确。 –