2017-09-17 3 views
0

Ich möchte ein javaFxTreeView mit eindeutigen String-Etiketten mit einer sehr großen Liste von Strings.JavaFX TreeView mit eindeutigen Strings

@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())); 
    } 
} 

Jetzt funktioniert diese addUniqueItem nicht. Denn treeNodes.contains(item) gibt immer false zurück, da die Typen nicht übereinstimmen.

Also habe ich drei Fragen.

  1. Wie die contains Funktion hier korrigieren.
  2. Da es eine Liste ist, die ich von myTreeView.getRoot().getChildren() die enthält, ist O (n) Suche, kann folglich sehr langsam sein. Wie kann ich es schneller machen, indem ich es Set oder irgendein anderes container mache?
  3. Ich denke, meine ganze Herangehensweise ist falsch. Wie implementiere ich eine TreeView, die einen String-Knoten eindeutig hinzufügen kann?
--ROOT 
----CH1 
----CH5 
....... 
----CH10 

Jetzt Hinzufügen CH1 wieder, würde nichts ändern.

Bearbeiten: Eine temporäre funktionierende Lösung ist, dass ich eine Kopie der gleichen Namen in einem HashSet und suchte dort, um zu finden, dass es bereits existiert oder nicht. dann aktualisiert die TreeView entsprechend.

Antwort

1
  1. Wie die Funktion contains hier korrigieren.

von Stream können Sie ganz einfach Ihre eigene enthält Verfahren, wie die

if(treeNodes.stream().noneMatch(treeItem -> item.equals(treeItem.getValue()) 
    schreiben kann
  1. Wie es ist eine Liste, die ich aus MyTreeView immer bin .getRoot(). getChildren() das enthält ist O (n) Suche, kann daher sehr langsam sein. Wie kann ich es schneller machen, indem ich es zu einem Set oder einem anderen Container mache?

Sie haben Recht enthält Methode müssen die Liste daher eine O (n) Komplexität zu durchlaufen. Mit einem HashSet zum Beispiel erhalten Sie O (1) Komplexität.

Aber erstellen Sie kein Set und suchen Sie jedes Mal, wenn Sie Ihre addUniqItem-Methode aufrufen. Weil Sie die Liste iterieren müssen, um die Menge zu konstruieren, und dann die Menge durchsuchen.

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

und es so benutzen:

So können Sie ein Feld in der Klasse wie das hinzufügen

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. Ich denke, Mein Ansatz ist falsch. Wie implementiere ich eine TreeView, die einen String-Knoten eindeutig hinzufügen kann?

Sie sind auf dem richtigen Weg, wie Sie Ihre Nachricht bearbeiten sagt. Aber vielleicht suchen Sie nach einem ListView, da Sie einen Baum ohne Hierarchie erstellen.

Edit: thx fabian zur Verbesserung

+0

Sie brauchen nur einen einzigen Methodenaufruf für eine Set-Methode in der 'addUniqueItem' Methode:' if (uniqItemSet.add (Punkt)) {...} treeNodes.add ' – fabian

+0

Ich brauche einen Baum, Hierarchie wurde nicht hinzugefügt, um es einfach zu halten. Yeah funktioniert für jetzt. Danke für die Antwort. – Ultraviolet

+0

Als akzeptiert markieren, wenn es hilft;) – user43968

Verwandte Themen