亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Java 8 流過濾包含另一個列表中的一個或多個字符串的字符串列表

使用 Java 8 流過濾包含另一個列表中的一個或多個字符串的字符串列表

一只甜甜圈 2022-06-23 10:40:32
我想使用 TextField 中的字符串來過濾列表。我在 TextField 上使用 KeyReleased 事件來過濾每個鍵上的列表。當我輸入一個單詞時,下面的代碼會過濾列表,但是當我按空格并開始輸入另一個單詞時,列表會變空。我對流有點陌生。我不知道我做錯了什么。private ObservableList<Products_Data> productList;@FXML       private JFXTextField searchField;@FXML       private TableView<Products_Data> productTable;@FXMLvoid searchKeyReleased(KeyEvent event) {    String searchText = searchField.getText();    List<String> searchableWords = Arrays.asList(searchText.toLowerCase().trim().split("\\s+"));    List<Products_Data> filteredList =  searchableWords.stream()        .flatMap(i ->productList.stream()        .filter(j -> j.getPartDesc().toLowerCase().contains(i)))        .collect(Collectors.toList());    ObservableList<Products_Data> productFilteredList = FXCollections.observableArrayList(filteredList);    productTable.setItems(productFilteredList);}----------public class Products_Data {    private final StringProperty partDesc = new (this,"PartDesc",null);    public Products_Data() {}    public final StringProperty getPartDescProperty() {return partDesc;}    public final String getPartDesc(){return partDesc.get();}    public final void setPartDesc(String partDesc) {             getPartDescProperty().set(partDesc);    }}
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

我在您的 Stream 代碼中看不到根本問題。您編寫的方式不是很有效,它允許匹配多個單詞的元素在結果列表中多次出現。也許,您設置結果的 UI 無法處理這個問題。


我將從輸入的文本中創建一個過濾器,如果元素中出現任何單詞,它將匹配,使用不區分大小寫的匹配,而不是將每個字符串重復轉換為小寫。例如,使用這樣的實用方法:


static final Pattern SPACE = Pattern.compile("\\s+");


public static <T> Predicate<T> getFilter(Function<? super T, String> f, String words) {

    String regex = SPACE.splitAsStream(words)

        .map(Pattern::quote).collect(Collectors.joining("|"));

    Predicate<String> sp = Pattern.compile(regex, Pattern.CASE_INSENSITIVE).asPredicate();

    return t -> sp.test(f.apply(t));

}

可以用作


List<Products_Data> filteredList = productList.stream()

    .filter(getFilter(Products_Data::getPartDesc, searchField.getText()))

    .collect(Collectors.toList());


查看完整回答
反對 回復 2022-06-23
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

你的匹配核心應該是這樣的:


productList.stream().filter(

    product -> searchableWords.stream().allMatch(

        searchWord -> product.getPartDesc().toLowerCase().contains(searchWord)

    )

)


查看完整回答
反對 回復 2022-06-23
  • 2 回答
  • 0 關注
  • 383 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號