查找Java中4个CheckBox的有序选择

时间:2018-06-27 08:51:27

标签: java javafx permutation

我有4个CheckBox,用户可以选择全部或全部不选择。顺序很重要,因此有16种可能的不同组合。我希望有一个高效的函数,该函数可以读取CheckBox es,并根据组合返回一个从0到15的值。 JavaFX中已经实现了什么吗?

编辑

我正在尝试实施@fabian的解决方案

 private static int countSelectedCheck(CheckBox[] maskCheckBoxes){

    // print binary
    int value = 0;
    for (int i = 0; i < maskCheckBoxes.length; i++) {
        if (maskCheckBoxes[i].isSelected()) {
            value += (1 << i);
        }
    }
    System.out.println(value);

    return value;
}

但是我遇到了例外。

1 个答案:

答案 0 :(得分:1)

如果要以4位二进制数读取复选框状态,则有16种可能性。

如果您全部选择4个CheckBox,并考虑选择顺序,则有4! = 24种可能性。不选择任何一种是另一种可能性,并且如果您允许选择任意数量的CheckBox,则将获得另外24个用于精确选择3个CheckBox es和另外12个用于精确选择2个CheckBox es和另外4个用于选择恰好1个CheckBox总计为65 = 24 + 24 + 12 + 4 + 1的对象。

保存选择顺序的最简单方法是将CheckBox个e(或标识它们的值)存储在List中。

下面的示例打印选择为二进制数的选择,并显示选择的顺序。

@Override
public void start(Stage primaryStage) throws IllegalAccessException {
    VBox container = new VBox();
    final List<CheckBox> selectionOrder = new ArrayList<>();
    final int checkBoxCount = 4;

    for (int i = 0; i < checkBoxCount; i++) {
        final CheckBox cb = new CheckBox();
        cb.setUserData(i);
        cb.selectedProperty().addListener((o, oldValue, newValue) -> {
            if (newValue) {
                selectionOrder.add(cb);
            } else {
                selectionOrder.remove(cb);
            }
        });
        container.getChildren().add(cb);
    }

    Button btn = new Button("print");
    btn.setOnAction(evt -> {
        System.out.println(selectionOrder.stream().map(c -> c.getUserData().toString()).collect(Collectors.joining(", ", "{ ", " }")));
        // print binary
        int value = 0;
        for (CheckBox cb : selectionOrder) {
            value |= (1 << ((Integer) cb.getUserData()));
        }
        System.out.println(value);
    });

    container.getChildren().add(btn);

    Scene scene = new Scene(container);
    primaryStage.setScene(scene);
    primaryStage.show();
}

如果您实际上不需要选择的顺序,建议您删除列表,将监听器移至selected属性,而不要设置userData而是存储{{1} } CheckBox中的es,您可以这样做

CheckBox[] array