Java:对目录进行排序 [英] Java: Sort entries for table of contents

查看:324
本文介绍了Java:对目录进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to implement a comparator to sort my menu items. They should be sorted like chapters and subchapters. Therefore each item knows its parent. If two or more items have the same parent, it should be sorted after the position number:

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) {
  **?**
}

在上面的代码中,所有菜单项都是按应在页面上显示的顺序创建的.但是,如果将它们随机添加到菜单中,该如何对其排序?

In the code above, all menu items are created in order as they should appear on the page. But how do I sort them if they are added to menu randomly?

推荐答案

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

(All pseudo-code) For each item, construct a List<Integer> which represent the positions, start from root:

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

然后比较MenuItem的位置很容易:

Then comparing the position of MenuItem is easy:

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

我认为,对于迭代方法,代码甚至可以更短.留给您练习.

I believe code can be even shorter for a iterative approach. Leave it for your practice.

这篇关于Java:对目录进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆