Поиск упорядоченного выбора из 4 флажков в Java - PullRequest
0 голосов
/ 27 июня 2018

У меня есть 4 CheckBox es, и у пользователя есть возможность выбрать все или ни одного из них. Порядок имеет значение, поэтому существует 16 возможных различных комбинаций. Я хотел бы иметь эффективную функцию, которая читает CheckBox es и возвращает мне значение от 0 до 15 в зависимости от комбинации. Что-то уже реализовано в JavaFX?

EDIT

Я пытаюсь реализовать решение @ 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 голосов
/ 27 июня 2018

Было бы 16 возможностей, если вы хотите прочитать состояния флажка как двоичное число с 4 цифрами.

Если вы выберете все 4 CheckBox и рассмотрите порядок выбора, вы получите 4! = 24 возможностей. Выбор «нет» - еще одна возможность, и если вы позволите выбрать произвольное число CheckBox es, вы получите еще 24 для выбора точно 3 CheckBox es и еще 12 для выбора ровно 2 CheckBox es и еще 4 для выбора точно 1 CheckBox суммирование до 65 = 24 + 24 + 12 + 4 + 1.

Самым простым решением для сохранения порядка выбора было бы сохранение CheckBox es (или их значений) в 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, а вместо этого хранить CheckBox в * 1022. * что позволяет делать

int value = 0;
for (int i = 0; i < array.length; i++) {
    if (array[i].isSelected()) {
        value |= (1 << i);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...