我正在尝试使用比较器来对菜单项进行排序。它们应该像章节和子章节一样进行排序。因此每个项目都知道它的父项。如果两个或多个项目具有相同的父项,则应在位置编号后对其进行排序:
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) {
**?**
}
在上面的代码中,所有菜单项都按顺序创建,因为它们应该出现在页面上。但如果将它们随机添加到菜单中,我该如何对它们进行排序?
答案 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
}
}
}
我相信迭代方法的代码可以更短。留给你练习。