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