TreeMap没有按比较器排序

时间:2013-02-01 16:19:37

标签: java collections

我有一排按钮,其中一些按钮可见。因此,我想对这些按钮进行排序,以便将它们添加到以可见的按钮开始的面板中。

所以我创建了LinkedHashMap,如果可见则添加true,否则返回false。然后我创建了我的比较器,通过值(布尔值)对此Map进行排序,然后我将我的按钮添加到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 个答案:

答案 0 :(得分:4)

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

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

你想要做的是

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

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

答案 1 :(得分:2)

您从未将Widgets添加到TreeMap。您使用TreeMap创建了一个空的Comparator,但我看不到您向该地图添加任何元素的位置。

编辑:

试试这个

//UI initialization
panelSortedButtons.putAll(panelButtons);

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

答案 2 :(得分:1)

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

此外,我从未看到你实际上在你的收藏中添加任何东西。

答案 3 :(得分:0)

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