对特殊有序数组进行排序

时间:2014-11-28 15:53:58

标签: java arrays algorithm sorting

背景

我正在处理的应用程序有一个大菜单。但是,它们没有排序。这是由以前的开发人员构建的。现在我被要求以正确的顺序制作菜单。

菜单包含很多项目。每个项目都有子菜单。子菜单也可以有自己的子菜单。 以下是一个例子。

enter image description here

根据现有程序,给出了以下项目数组。 (菜单是基于此数组创建的。)

[A,D,E,B,C,F,H,G]

您可以看到父节点后跟其子节点,然后是兄弟节点。

我的想法:

我有两种方法。一种是更改现有程序,以便它首先以正确的顺序输出数组。其次是对现有程序生成的数组进行排序。为了不搞乱现有的功能。我更喜欢第二种方式,即改变生成的数组的顺序。

我的问题:

因此,我想对数组进行排序,使其看起来像

[A,B,C,d,E,F,G,H]

这样最终的菜单如下所示:

enter image description here

我们非常感谢所提供的任何代码。我正在使用Java,但也欢迎任何其他语言或伪代码。

更新

对不起,我没有说清楚。我试图让问题变得简单,这样你就不需要知道太多无用和分散注意力的信息。不知怎的,我错过了一些你可能需要知道的重要信息。

以下是我需要了解的更多信息。

数组中的项是Object。该对象具有菜单级别和父ID。

例如,

  • 菜单A的级别为0,没有父级。
  • 菜单D的父级是菜单A,级别为1.
  • 菜单C的父级是菜单B.菜单C的级别是2

我希望此更新可以帮助您更多地了解我的问题。

1 个答案:

答案 0 :(得分:0)

由于它是一个类似树的结构,你可以利用自定义比较函数来利用它,并执行以下操作:

(类似Python的伪代码)

'''
Assuming Menu is defined or can be transformed to be as follows:
class Menu():
    #submenus is a list of menus under a menu
    def __init__(submenus):
        self.submenus = submenus
        # other menu members
'''
# menus is a list of top level menu items.
# cmp is the comparison fxn for two menus
def sort_menus(menus,cmp)
    all_sorted_menus = []
    sort_menus_helper(menus,cmp,all_sorted_menus)
    return all_sorted_menus

def sort_menus_helper(menus,cmp,all_sorted_menus=None):
    if all_sorted_menus is None:
       all_sorted_menus = []
    sorted_menus = menus.sort(cmp=cmp)
    for menu in menus:
        sorted_menus.append(menu)
        sort_menus(menu.submenus,cmp,all_sorted_menus)