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

どちらかといえば何が欠けていますか?

更新しました

私は自分のせいを理解しました。TreeMapにHashMapからのデータを入力する必要がありました。ジョンBが示したのと同じ方法。

panelSortedButtons.putAll(panelButtons);
4

4 に答える 4

4

0を返すと、2つのキーが等しいと言います。マップでは重複が許可されていないため、0を返すと、その重複が削除されます。あなたの場合、選択肢は2つしかないため、キーが2つを超えることはありませんtruefalse

ただし、コレクションが「空」であると言う場合は、それがコンパレータではないことを示していますが、コレクションに何も追加していません。

あなたがやりたいと思われることは

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

このようなリストに重複して要素を追加し、「同じ」要素であっても要素を失うことなく並べ替えることができます

于 2013-02-01T16:23:22.310 に答える
2

にを追加したことはありませWidgetsTreeMap。で空TreeMapを作成しましたComparatorが、そのマップに要素を追加した場所がわかりません。

編集:

これを試して

//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、メソッドをオーバーライドする必要があります。compareTocompare

また、私はあなたが実際にあなたが持っているコレクションに何かを追加するのを見たことがありません。

于 2013-02-01T16:22:36.637 に答える
0

TreeMap(Comparator<? super K> comparator)以前に を定義したコンストラクタを使用する必要がありますComparator。コンパレータを宣言する前に設定しています。これはコンパイルできません。

于 2013-02-01T16:30:03.477 に答える