[英]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。
所以我有三個問題。
- 如何在此處更正
contains
功能。- 因為這是我從
myTreeView.getRoot().getChildren()
獲得的列表,所以包含是O(n)搜索,因此可能非常慢。 如何通過將其Set
為Set
或任何其他container
來使其更快?- 我認為我的整個方法是錯誤的。 如何實現可以唯一添加字符串節點的
TreeView
?
--ROOT
----CH1
----CH5
.......
----CH10
現在再次添加CH1
,不會更改任何內容。
編輯:一個臨時可行的解決方案是,我在HashSet
保留了相同名稱的副本副本,並在其中搜索以發現它已經存在或不存在。 然后相應地更新TreeView
。
如何在此處更正包含功能。
通過使用Stream,您可以輕松地編寫自己的contains方法,例如
if(treeNodes.stream().noneMatch(treeItem -> item.equals(treeItem.getValue())
因為這是我從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()));
}
}
我認為我的整個方法是錯誤的。 如何實現可以唯一添加字符串節點的TreeView?
如編輯信息所示,您處在正確的位置。 但是也許您正在尋找ListView,因為您正在構建沒有層次結構的樹。
編輯:thx fabian的改進
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.