0

我有一排按钮,有些是可见的,有些不可见。所以我想对这些按钮进行排序,以便将它们添加到以可见按钮开头的面板中。

所以我创建了 LinkedHashMap ,如果按钮可见,则添加 true ,否则添加 false 。然后我创建了我的比较器,按值(布尔值)对这个地图进行排序,只有在它之后,我才将按钮添加到 TreeMap 的面板中。但是 TreeMap 最后是空的。

这是我所做的:

private Map<Widget, Boolean> panelButtons = new HashMap<Widget, Boolean>();
private Map<Widget, Boolean> panelSortedButtons = new TreeMap<Widget, Boolean>(comparator);
private ButtonsComparator comparator = new ButtonsComparator(panelButtons);

//UI initialization: buttons are added using addToPanel() method - described below

for(Widget widget : panelSortedButtons.keySet()) { //panelSortedButtons is empty
    panel.add(widget);
}

//----------------

//All buttons are added via this method
public void addToPanel(Widget widget, boolean isVisible) {
    panelButtons.put(widget, isVisible);
}

//----------------

private class ButtonsComparator implements Comparator<Widget>{
    Map<Widget, Boolean> buttons;

    public ButtonsComparator(Map<Widget, Boolean> buttons) {
        this.buttons = buttons;
    }

    @Override
    public int compare(Widget widget1, Widget widget2) {
        return buttons.get(widget1).compareTo(buttons.get(widget2));
    }
}

如果有什么遗漏?

更新

我明白我的错,我必须用来自 HashMap 的数据填充我的 TreeMap。与 John B. 所展示的方式相同。

panelSortedButtons.putAll(panelButtons);
4

4 回答 4

4

当您返回 0 时,您说两个键相等。由于地图不允许重复,返回 0 会导致该重复被删除。在您的情况下,您只有两个选项truefalse因此您永远不会拥有两个以上的密钥。

但是,您说该集合是“空的”,这表明它不是您的比较器,但您没有向集合中添加任何内容。

看起来你想做的是

List<Widget> widgets = new ArrayList<Widget>(panelButtons.keySet());
Collections.sort(widget, comparator);

您可以将具有重复项的元素添加到这样的列表中,然后对它们进行排序而不会丢失元素,即使它们是“相同的”

于 2013-02-01T16:23:22.310 回答
2

您从未WidgetsTreeMap. 您使用 a 创建了一个空TreeMapComparator但我看不到您在该地图中添加任何元素的位置。

编辑:

试试这个

//UI initialization
panelSortedButtons.putAll(panelButtons);

for(Widget widget : panelSortedButtons.keySet()) { //panelSortedButtons is empty
  panel.add(widget);
}
于 2013-02-01T16:24:54.200 回答
1

该方法compare永远不会在上面的代码中使用。此外,当您实现时,Comparable您应该覆盖该方法compareTo,而不仅仅是compare.

此外,我从未见过您实际上向您拥有的收藏添加任何内容。

于 2013-02-01T16:22:36.637 回答
0

您需要使用TreeMap(Comparator<? super K> comparator)之前定义的构造函数Comparator。您甚至在声明它之前就设置了比较器。这无法编译。

于 2013-02-01T16:30:03.477 回答