簡體   English   中英

具有唯一字符串的JavaFX TreeView

[英]JavaFX TreeView with unique Strings

我想要一個javaFx TreeView它具有唯一的字符串標簽以及非常大的字符串列表。

@Override
public void initialize(URL location, ResourceBundle resources) {
    myTreeView.setRoot(new TreeItem());
    myTreeView.setShowRoot(false);
}

public void addUniqueItem(String item) {
    List<TreeItem> treeNodes = myTreeView.getRoot().getChildren();

    if (!treeNodes.contains(item)) {
        treeNodes.add(new TreeItem<>(item));
        treeNodes.sort((o1, o2) -> ((String)o1.getValue()).compareTo((String)o2.getValue()));
    }
}

現在,此addUniqueItem無法正常工作。 因為,由於類型不匹配, treeNodes.contains(item)始終返回false。

所以我有三個問題。

  1. 如何在此處更正contains功能。
  2. 因為這是我從myTreeView.getRoot().getChildren()獲得的列表,所以包含是O(n)搜索,因此可能非常慢。 如何通過將其SetSet或任何其他container來使其更快?
  3. 我認為我的整個方法是錯誤的。 如何實現可以唯一添加字符串節點的TreeView
--ROOT
----CH1
----CH5
.......
----CH10

現在再次添加CH1 ,不會更改任何內容。

編輯:一個臨時可行的解決方案是,我在HashSet保留了相同名稱的副本副本,並在其中搜索以發現它已經存在或不存在。 然后相應地更新TreeView

  1. 如何在此處更正包含功能。

通過使用Stream,您可以輕松地編寫自己的contains方法,例如

if(treeNodes.stream().noneMatch(treeItem -> item.equals(treeItem.getValue())
  1. 因為這是我從myTreeView.getRoot()。getChildren()獲得的列表,所以包含是O(n)搜索,因此可能非常慢。 如何通過將其設置為Set或任何其他容器來使其更快?

您正確的包含方法需要迭代列表,因此復雜度為O(n)。 例如,使用HashSet將給您O(1)的復雜性。

但是,請勿在每次調用addUniqItem方法時構建Set並對其進行搜索。 因為您將需要遍歷列表以構造集合,然后搜索集合。

因此,您可以像這樣在您的課程中添加一個字段:

private Set<String> uniqItemSet = new HashSet<>();

並像這樣使用它:

    public void addUniqueItem(String item) {

    if (uniqItemSet.add(item)) {
        treeNodes.add(new TreeItem<>(item));
        treeNodes.sort((o1, o2) -> ((String)o1.getValue()).compareTo((String)o2.getValue()));
    }
}
  1. 我認為我的整個方法是錯誤的。 如何實現可以唯一添加字符串節點的TreeView?

如編輯信息所示,您處在正確的位置。 但是也許您正在尋找ListView,因為您正在構建沒有層次結構的樹。

編輯:thx fabian的改進

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM