【问题标题】:ObservableList returns sublist that matchesObservableList 返回匹配的子列表
【发布时间】:2019-04-04 03:16:40
【问题描述】:

我不太清楚这个问题该如何表达,所以请耐心等待。

我有一个ObservableList 的用户定义对象,其中包含几个 getter 方法,例如:

public String getName() { return this.name; }
public int getId() { return this.id; }

我想要做的是能够通过搜索子字符串从我的主要可观察列表中返回一个子列表。因此,如果我有一些包含这些名称的类:

car
carrol
castro
bret

我将如何获取所有对象的ObservableList<MyClass>,其中由getName() 检索的名称参数包含“ca”的子字符串,如下所示:

car
carrol
castro

或“汽车”的子字符串,如:

car
carrol

到目前为止,这是我的方法:

 public ObservableList<Part> searchBySubstring(String sub, ObservableList<Part> full){
    ObservableList<Part> newParts = FXCollections.observableArrayList();

    for(int i = 0; i < full.size(); i++){
        if(full.get(i).getPartName().contains(sub))
            newParts.add(full.get(i));
    }
    return newParts;
}

【问题讨论】:

  • 您可以创建另一种方法来执行该任务或执行该任务。
  • 你能把你的整个代码贴在这里,然后我可以更新它并发布答案
  • 在此处粘贴您的整个代码 - 可能不是全部
  • 我主要是在寻找一种内置功能的方法,我用非内置的方式更新了 OP。

标签: java observablelist


【解决方案1】:

如果您只想创建原始ObservableList 的“快照”,那么您已经在做的就是这样做的方法。您可以更改代码以使用 for-each 循环或流,但我认为这更像是一种风格选择。

For-Each 循环:

ObservableList<Part> search(String sub, ObservableList<Part> full) {
    ObservableList<Part> result = FXCollections.observableArrayList();
    for (Part part : full) {
        if (part.getPartName().contains(sub)) {
            result.add(part);
        }
    }
    return result;
}

流:

ObservableList<Part> search(String sub, ObservableList<Part> full) {
    return full.stream()
            .filter(part -> part.getPartName().contains(sub))
            .collect(Collectors.toCollection(FXCollections::observableArrayList));
}

但是,如果您希望 ObservableList 随着原始 ObservableList 的更改而更新,请使用 FilteredList。在这种情况下,您只需要创建FilteredList 一次 并根据需要更新Predicate

String sub = ...;
ObservableList<Part> full = ...;
FilteredList<Part> filtered = full.filtered(part -> part.getPartName().contains(sub));
// or use new FilteredList<>(...);

// Then, to "re-search" the list...
String newSub = ...;
filtered.setPredicate(part -> part.getPartName().contains(newSub));

FilteredList 将随着元素被添加到原始ObservableList 或从原始ObservableList 中删除而更新。如果您希望它在 Part(已经在列表中)的名称更改时更新,那么您需要做两件事:

  1. PartpartName 公开为Observable,例如StringProperty
  2. 通过observableArrayList(Callback)observableList(List,Callback) 使用提取器构造原始ObservableList

使用提取器的示例:

ObservableList<Part> parts = FXCollections.observableArrayList(
        part -> new Observable[]{part.partNameProperty()});

CallbackCallback&lt;E, Observable[]&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多