Java:对目录的条目进行排序

Java:对目录的条目进行排序,java,sorting,Java,Sorting,我正在尝试实现一个比较器来对菜单项进行排序。它们应该像章节和分章一样排序。因此,每个项都知道它的父项。如果两个或多个项目具有相同的父项,则应将其排序在位置编号之后: public class menuItem { private menuItem parent; private int position; (constructor, getters&setters, ...) } public ArrayList<menuItem> getMenu(){ menu

我正在尝试实现一个比较器来对菜单项进行排序。它们应该像章节和分章一样排序。因此,每个项都知道它的父项。如果两个或多个项目具有相同的父项,则应将其排序在位置编号之后:

public class menuItem {
 private menuItem parent;
 private int position;
 (constructor, getters&setters, ...)
}

public ArrayList<menuItem> getMenu(){
  menuItem m1 = new menuItem(null, 0);
  menuItem m1_1 = new menuItem(m1, 0);
  menuItem m1_2 = new menuItem(m1, 1);
  menuItem m1_2_1 = new menuItem(m1_2, 0);
  menuItem m1_2_2 = new menuItem(m1_2, 1);
  menuItem m2 = new menuItem(null, 1);
  menuItem m2_1 = new menuItem(m2, 0);
  menuItem m2_2 = new menuItem(m2, 1);

  ArrayList<menuItem> menu = new ArrayList<>();
  //add all menuItems to menu
  return menu;
}
在上面的代码中,所有菜单项都是按其在页面上的显示顺序创建的。但是,如果它们随机添加到菜单中,我如何对它们进行排序?

(所有伪代码)对于每个项目,从根开始构建一个表示位置的
列表:

List<Integer> toPositions(MenuItem i) {
    List<Integer> positions = new LinkedList<>();
    while (i != null) {
        position.addFirst(i.getPosition());
        i = i.getParent();
    }
    return positions;
}
列出地形(MenuItem i){
列表位置=新建LinkedList();
while(i!=null){
position.addFirst(i.getPosition());
i=i.getParent();
}
返回位置;
}
然后比较MenuItem的位置很容易:

int compare(MenuItem a, MenuItem b) {
    return comparePosition(toPositions(a), toPositions(b));
}

int comparePosition(List<Integer> a, List<Integer> b) {
    if (a.isEmpty() && b.isEmpty()) {
        return 0;
    } else if (a.isEmpty()) {
        return 1;
    } else if (b.isEmpty()) {
        return -1;
    } else  {
        int aFirst = a.removeFirst();
        int bFirst = b.removeFirst();
        if (aFirst != bFirst) {
            return aFrist-bFirst;
        } else {
            return comparePosition(a, b);  // compare remaining list
        }
    }
}
int比较(菜单项a、菜单项b){
返回比较位置(拓扑位置(a)、拓扑位置(b));
}
整数比较(列表a、列表b){
if(a.isEmpty()&&b.isEmpty()){
返回0;
}如果(a.isEmpty()){
返回1;
}else如果(b.isEmpty()){
返回-1;
}否则{
int aFirst=a.removeFirst();
int bFirst=b.removeFirst();
如果(affirst!=bFirst){
第一次返回;
}否则{
返回comparePosition(a,b);//比较剩余列表
}
}
}

我相信对于迭代方法来说,代码可以更短。将其留给您的实践。

如果您的
菜单项
提供了获取项目级别数和获取特定级别位置等方法,则可以进一步简化逻辑。把它留给你自己练习:)如果答案解决了你的问题,考虑接受它
int compare(MenuItem a, MenuItem b) {
    return comparePosition(toPositions(a), toPositions(b));
}

int comparePosition(List<Integer> a, List<Integer> b) {
    if (a.isEmpty() && b.isEmpty()) {
        return 0;
    } else if (a.isEmpty()) {
        return 1;
    } else if (b.isEmpty()) {
        return -1;
    } else  {
        int aFirst = a.removeFirst();
        int bFirst = b.removeFirst();
        if (aFirst != bFirst) {
            return aFrist-bFirst;
        } else {
            return comparePosition(a, b);  // compare remaining list
        }
    }
}