Задав значение от 0 до 15, верните правильный выбор между 4 флажками - PullRequest
0 голосов
/ 28 июня 2018

Я использую этот метод для возврата значения от 0 до 15 в зависимости от того, какие из моих 4 CheckBox выбран пользователем.

private int countSelectedCheck(CheckBox a, CheckBox b, CheckBox c, CheckBox d){
    CheckBox[] abcd = new CheckBox[]{a, b, c, d};
    // print binary
    int value = 0;
    for (int i = 0; i < abcd.length; i++) {
        if (abcd[i].isSelected()) {
            value += (1 << i);
        }
    }
    return value;
}

Я хотел бы сделать обратную функцию, поэтому чтобы вернуть комбинацию выбранных / невыбранных между моими 4 CheckBox, дающими значение между 0 и 15. Как я могу добиться этого эффективным способом, не повторяя много из if высказываний или других не очень эффективных решений?

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Используйте маску, делайте поразрядно и и проверяйте 0:

private void selectCheckBoxes(int value, CheckBox... array){
    for (int i = 0; i < array.length; i++) {
        array[i].setSelected((value & (1 << i)) != 0);
    }
}
0 голосов
/ 28 июня 2018
private static void checkSelected(int n, CheckBox... cbs)
{
    for (CheckBox cb : cbs)
    {
        if ((n & 1) == 1)
        {
            cb.setSelected(true);
        }
        n = n >> 1;
    }
}
0 голосов
/ 28 июня 2018

Вы можете попробовать что-то вроде этого.

import java.awt.Checkbox;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class BinaryTest {
    private final Map<Checkbox, Integer> checkboxes = new HashMap<>();

    public BinaryTest(Checkbox... boxes) {
        int i = 1;
        for (Checkbox checkbox : boxes) {
            checkboxes.put(checkbox, i);
            i = i << 1;
        }
    }

    public int getValueOfCheckboxes() {
        int value = 0;
        for (Entry<Checkbox, Integer> entry : checkboxes.entrySet()) {
            if (entry.getKey().getState()) {
                value += entry.getValue();
            }
        }

        return value;
    }

    public Set<Checkbox> getCheckboxesForValue(int value) {
        Set<Checkbox> boxes = new HashSet<>();
        for (Entry<Checkbox, Integer> entry : checkboxes.entrySet()) {
            if ((value & entry.getValue().intValue()) != 0) {
                boxes.add(entry.getKey());
            }
        }

        return boxes;
    }
}

Это должно работать для любого количества флажков. Вы помещаете их в карту. Ключ карты - флажок, а значение - двоичное целочисленное значение.

0 голосов
/ 28 июня 2018

Вы просто делаете обратную операцию:

private static CheckBox[] getArray(int n) {
    CheckBox[] abcd = new CheckBox[4];

    for (int i = 0; i < abcd.length; i++) {
        if ((n &(1 << i)) != 0) {
           abcd[i].setValue(true); // set your checkBox as checked;
        }
    }
    return abcd;
}

То, что вы здесь делаете, проверяет биты вашего параметра. Если бит в позиции i равен 1, тогда вы устанавливаете флажок как checked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...