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

时间:2015-04-13 15:14:11

标签: java sorting

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

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;
}

比较

@Override
public int compare(menuItem o1, menuItem o2) {
  **?**
}

在上面的代码中,所有菜单项都按顺序创建,因为它们应该出现在页面上。但如果将它们随机添加到菜单中,我该如何对它们进行排序?

1 个答案:

答案 0 :(得分:1)

(所有伪代码)对于每个项目,构造一个代表位置的List<Integer>,从根开始:

List<Integer> toPositions(MenuItem i) {
    List<Integer> positions = new LinkedList<>();
    while (i != null) {
        position.addFirst(i.getPosition());
        i = i.getParent();
    }
    return positions;
}

然后比较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
        }
    }
}

我相信迭代方法的代码可以更短。留给你练习。