执行包含多个列表的扩展合并排序

时间:2018-04-22 12:27:33

标签: java sorting mergesort

最近我一直在研究一些数据结构来记录我的日常活动。

我的方法是创建一个类似树的排序系统。就像"货币" class可以包含子类,例如" Allowance"," Food and drinks"和"租"。这些标签中的每一个都可能包含更多的子标签,例如" Allowance"将有"年度津贴","每月津贴"和"每日津贴"。

这些子标签中的每一个都将包含一个引用(我在这里用Java执行此操作,意味着不允许指针运算)到其他子标签之前和之后,例如"每月津贴&# 34;将previousSibling指向"年度津贴"并且nextSibling指向"每日津贴"。

每个标记还包含一些实例(让我们称之为#34;事件")记录特定的操作,例如标记" Allowance"可能有一个实例记录了银行每年收到的金额。

所有这些都很好,我已经对它们进行了编码,但在显示数据时,我遇到了问题。我想要的是总结4月21日到4月22日期间特定时间间隔内的赚钱和花钱。我计划对它们进行排序,然后选择4月21日到22日之间的事件范围。当你只处理单个标签中的事件时,这没关系。我想要的是收集所有标签中的所有事件,这些标签是某个指定标签的子标签,例如我想收集所有" Allowance"标签,以及它的3个子标签'事件

我计划通过合并排序方法来解决这个排序问题:首先,我对"年度津贴","每月津贴"的事件进行排序。和"每日津贴"。然后我排序"津贴","食物和饮料","租"然后"货币"。假设我们已经对其子项已经排序进行排序,我需要做的事情类似于:

ArrayList<Event> list = new ArrayList<>();

//assuming yearlyAllowance.events is an ArrayList<Event>
list.add(yearlyAllowance.events.get(0));
list.add(monthlyAllowance.events.get(0));
list.add(dailyAllowance.events.get(0));
list.add(allowance.events.get(0));

//helper method
sortByTime(list);
ArrayList<Event> finalList = new ArrayList<>();

while(!list.isEmpty()){
  finalList.add(list.get(0));
  Event tmpEvent = list.get(0);
  list.remove(0);
  //slipping the next event in tmpEvent in, should take O(ln(n)) time on average as list is sorted and we're binary inserting them
  if(tmpEvent.nextSibling != null){
    insertBinary(list, tmpEvent.nextSibling);
  }
}

所以在这里,我基本上在几个列表上同时进行合并排序,这意味着在每个阶段,我将一堆排序列表合并在一起。我遵循这种方法是因为我可以将每个标记标记为已排序,这意味着我不必对所有内容进行重新排序,例如在我对金额类进行排序后重新排序Allowance标记简单地从Monetary标签及其子标签中收集所有事件。事件并对它们进行排序。

有更好的方法吗?我这样做是一个Android应用程序,所以我真的需要速度才能向用户显示信息。

1 个答案:

答案 0 :(得分:1)

您不需要对所有事件进行排序,因为您只需要一个事件间隔。更好的方法是在指定的时间间隔内查找事件,并在排序之前将它们添加到列表中。在将事件添加到最终列表之前,您只需要有一个if语句。