मैं एक प्रोग्राम बनाने की कोशिश कर रहा था जहाँ आप चेकबॉक्स के रूप में नाम जोड़ सकते हैं। उन्हें चेक करके और यादृच्छिक बटन दबाकर सभी नाम 2 अलग-अलग सूची दृश्यों में रखे जाएंगे (प्रत्येक नाम केवल एक बार रखा जा सकता है और प्रत्येक सूची दृश्य में समान नाम या 1 और नाम होना चाहिए)। मुझे नहीं पता कि इसे "ऑनरैंडम" खंड में कैसे लिखा जाना चाहिए।

package sample;


import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import java.util.Objects;


public class Controller {

    @FXML
    private Button add;
    @FXML
    private Button delete;
    @FXML
    private VBox vbox;
    @FXML
    private TextField text;
    @FXML
    private Button random;
    @FXML
    private ListView listview1;
    @FXML
    private ListView listview2;
    @FXML
    private CheckBox cb;




    @FXML
    void initialize() {

    }

    @FXML
    public void onEnter(ActionEvent e){
        CheckBox cb = new CheckBox(text.getText());
        vbox.getChildren().add(cb);
        if (text.getText().matches("")) {
            vbox.getChildren().remove(cb);
        }
    }

    @FXML
    public void onAdd(ActionEvent e) {
        CheckBox cb = new CheckBox(text.getText());
        vbox.getChildren().add(cb);
        if (text.getText().matches("")) {
            vbox.getChildren().remove(cb);
        }
    }
    @FXML
    public void onDelete(ActionEvent e) {
        vbox.getChildren().removeIf(child -> ((CheckBox) child).isSelected());
    }

    @FXML
    public void onRandom(ActionEvent e) {
        vbox.getChildren()
                .stream()
                .map(item -> (CheckBox) item)
                .filter(item -> item.isSelected())
                .filter(value -> Objects.nonNull(value))
                .forEach(value -> {
                    listview1.getItems().add(value.getText());
                    listview2.getItems().add(value.getText());
                });
        }
}

यह नीचे सिर्फ परीक्षण के लिए है।

.forEach(value -> {
                    listview1.getItems().add(value.getText());
                    listview2.getItems().add(value.getText());
                });

यह रही मेरी FXML फ़ाइल https://pastebin.com/9v8e0c0Y

1
Chlebek 22 जिंदा 2020, 18:36

1 उत्तर

सबसे बढ़िया उत्तर

Collections.shuffle, फिर पहले आधे को एक ListView में और बाकी को दूसरे में जोड़ें।

// do not use raw types
@FXML
private ListView<String> listview1;
@FXML
private ListView<String> listview2;
...

private final Random randomNumberGenerator = new Random();
List<String> items = new ArrayList<>(); // copy children to new list

// the following loop imho is easier to comprehend than the Stream implementation
for (Node child : vbox.getChildren()) {
    CheckBox cb = (CheckBox) child;
    if (cb.isSelected) {
        items.add(cb.getText());
    }
}

Collections.shuffle(items, randomNumberGenerator);
final int size = items.size();
final int half = size / 2;

// add first half to first ListView and second half to second ListView
listview1.getItems().setAll(items.sublist(0, half));
listview2.getItems().setAll(items.sublist(half, size));

ध्यान दें कि Stream पर कुछ विधि कॉल वास्तव में आपके मामले में अनावश्यक हैं:

.filter(value -> Objects.nonNull(value))

Parent की children सूची के लिए null की जांच करना कभी भी आवश्यक नहीं है। सूची कार्यान्वयन null को उस सूची में सम्मिलित होने से रोकता है। पिछला फ़िल्टर उन मामलों में एनपीई फेंक सकता था जहां वह भविष्यवाणी करता है false वैसे भी। ऐसे मामलों में जहां आपको इस तरह की भविष्यवाणी की आवश्यकता है, आप कोड को छोटा करने के लिए एक विधि संदर्भ का उपयोग कर सकते हैं:

.filter(Objects::nonNull)
2
fabian 22 जिंदा 2020, 17:24