मैं सोच रहा हूं कि ऑब्जर्वेबल लिस्ट ऑब्जेक्ट के लिए कई फिल्टर लगाने का सबसे अच्छा कार्यान्वयन क्या है।

मेरे पास निम्नलिखित वस्तुएं हैं:
ComboBox<स्ट्रिंग> cbYear
टेक्स्टफ़ील्ड tfSearch
ऑब्जर्वेबल लिस्ट <ऑर्डरइटम> डेटा।

मुझे cbYear के मान और tfSearch के मान के आधार पर डेटा सूची को फ़िल्टर करने की आवश्यकता है।

यहाँ मैंने आवश्यकता को प्राप्त करने के लिए क्या किया है, लेकिन मुझे आश्चर्य है कि क्या कोई आसान तरीका है ...

private void initializeFilterTable() {
    
    FilteredList<OrderItem> dataFiltered = new FilteredList<>(data, p -> true);

    tfSearch.textProperty().addListener((obs, oldVal, newVal) -> {
        String year = cbYear.getSelectionModel().getSelectedItem();
        Predicate<OrderItem> filter = filters(newVal, year);
        dataFiltered.setPredicate(filter);
    });
    
    cbYear.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
        Predicate<OrderItem> filter = filters(tfSearch.getText(), newVal);
        dataFiltered.setPredicate(filter);
    });
    
    SortedList<OrderItem> dataSorted = new SortedList<>(dataFiltered);
    dataSorted.comparatorProperty().bind(table.comparatorProperty());
    table.setItems(dataSorted);
}



private Predicate<OrderItem> filters(String search, String year) {
    
    String lower = search.trim().toLowerCase();
    
    Predicate<OrderItem> searchFilter = order -> {

        if (lower == null || lower.isEmpty())
            return true;
    
        if (order.getCustomerName().toLowerCase().contains(lower))
            return true;
        else if (order.getOrderNumber().toLowerCase().contains(lower))
            return true;
        else if (order.getPDA_TypeStr().toLowerCase().contains(lower))
            return true;
        else if (order.getCount4UStr().toLowerCase().contains(lower))
            return true;
        else if (order.getCity().toLowerCase().contains(lower))
            return true;
        else if (order.getContactName().toLowerCase().contains(lower))
            return true;
        else if (order.getSoftware().toLowerCase().contains(lower))
            return true;
        else if (order.getPDA_Type() == 2 && "אנדרואיד".contains(lower))
            return true;
        else if (order.getStatusStr().toLowerCase().contains(lower))
            return true;
    
        return false;
    };
    
    
    Predicate<OrderItem> yearFilter = order -> {
        
        if (year.equals("הכל"))
            return true;
        
        else if (year.equals(String.valueOf(order.getYear())))
            return true;
        
        return false;
    };

    return searchFilter.and(yearFilter);
}
-1
Dolev Hadar 8 सितंबर 2021, 19:49
1
कृपया नमूना डेटा (अंग्रेजी डेटा) प्रदान करें, कोड से गैर-अंग्रेज़ी वर्णों को हटा दें, कोड को एक स्टैंड-अलोन निष्पादन योग्य बनाने के लिए संपादित करें, और खोज के लिए अप्रासंगिक फ़ील्ड को हटा दें। संक्षेप में, एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण बनाएं और प्रदान करें। चूंकि यह सूचियों पर सिर्फ एक प्रश्न है, बिना किसी यूआई कोड के करना संभव होना चाहिए।
 – 
jewelsea
8 सितंबर 2021, 19:57
कृपया जावा नामकरण सम्मेलनों से चिपके रहें (कोई अंडरस्कोर नहीं)
 – 
kleopatra
9 सितंबर 2021, 05:29

1 उत्तर

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

आप फ़िल्टर की गई सूची को फ़िल्टर कर सकते हैं। यह तर्क के दो टुकड़ों को अलग रखता है।

FilteredList<OrderItem> filteredByText = new FilteredList<>(data, p -> true);
FilteredList<OrderItem> filteredByYear = new FilteredList<>(filteredByText, p -> true);

tfSearch.textProperty().addListener((obs, oldVal, newVal) -> filteredByText.setPredicate(p -> {
    String lower = newVal.trim().toLowerCase();
    if (lower == null || lower.isEmpty())
        return true;

    if (order.getCustomerName().toLowerCase().contains(lower))
        return true;
    else if (order.getOrderNumber().toLowerCase().contains(lower))
        return true;
    else if (order.getPDA_TypeStr().toLowerCase().contains(lower))
        return true;
    else if (order.getCount4UStr().toLowerCase().contains(lower))
        return true;
    else if (order.getCity().toLowerCase().contains(lower))
        return true;
    else if (order.getContactName().toLowerCase().contains(lower))
        return true;
    else if (order.getSoftware().toLowerCase().contains(lower))
        return true;
    else if (order.getPDA_Type() == 2 && "אנדרואיד".contains(lower))
        return true;
    else if (order.getStatusStr().toLowerCase().contains(lower))
        return true;

    return false;
}));


cbYear.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, year) -> filteredByYear.setPredicate(p -> {
    if (year.equals("הכל"))
        return true;
    
    else if (year.equals(String.valueOf(order.getYear())))
        return true;
    
    return false;
}));

SortedList<OrderItem> dataSorted = new SortedList<>(filteredByYear);
dataSorted.comparatorProperty().bind(table.comparatorProperty());
table.setItems(dataSorted);
3
James_D 8 सितंबर 2021, 20:00