我有一排按钮,其中一些按钮可见。因此,我想对这些按钮进行排序,以便将它们添加到以可见的按钮开始的面板中。
所以我创建了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);
答案 0 :(得分:4)
当你返回0时,你说两把钥匙相等。由于地图不允许重复,因此返回0会导致重复删除。在您的情况下,您只有两个选项true
和false
,因此您永远不会有两个以上的密钥。
但是,你说这个集合是“空的”,这表明它不是你的比较器,但你没有在集合中添加任何内容。
你想要做的是
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
。您甚至在声明它之前设置比较器。这无法编译。