# while Schleife in Plugin stoppt nicht



## CodeIt (15. Nov 2017)

Hallo,
ich schreibe ein Plugin für Gephi in welchem die Label von Knoten in Abhängigkeit von den Labeln der Nachbarknoten verändert werden. Dadurch soll Clustering unterstützt werden.
Sobald sich die Label nicht mehr verändern soll das Programm stoppen.
Und genau hier liegt das Problem, es stoppt nicht.
Ich benutze den ColumnObserver und die overserver.hasColumnChanged() Methode.
Der entscheidene Teil des Codes wäre wie folgt:


```
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();

    Column col = nodeTable.getColumn(prob);
    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }
    ColumnObserver observer = col.createColumnObserver(true);

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean changed = true;
    while(changed){
    for (Node n: nodes){
         ....
        n.setLabel(newLabel); 
    }

    if (observer.hasColumnChanged()){
        change = true;
    }else{
        change = false;
    }
```

Die Abfrage von changed folgt innerhalb der While Schleife und außerhalb der For Schleife. Wenn ich innerhalb der For Schleife abfrage, wird diese ja nur einmal durchlaufen.
Hat jemand eine Idee?


----------



## thet1983 (15. Nov 2017)

CodeIt hat gesagt.:


> *if* (observer.hasColumnChanged()){
> change = *true*;
> }*else*{
> change = *false*;
> }


sorry hat jetzt nichts mit deinem Problem zutun ( glaube ich ) aber sowas ist echt pervers..

```
observer.hasColumnChanged()
```
gibt ja einen boolean zurück oder?

```
change = observer.hasColumnChanged();
```

ich würde mal den debugger zurate ziehen oder sysout´s auf der konsole ausgeben um zu schauen wann false eintritt und warum.


----------



## mrBrown (15. Nov 2017)

Wird columnChanged eigentlich irgendwann mal zurückgesetzt?


----------



## CodeIt (15. Nov 2017)

Nein ColumnChanged wird nicht zurückgesetzt


----------



## mrBrown (15. Nov 2017)

Dann ist doch klar, dass es immer true ergibt, wenn es irgendwann mal eine Änderung gab...

Ich würde den Observer in der while-Schleife erstellen, dann dürfte der nur bei Änderungen innerhalb eines durchlaufs Aktualität werden.
Und zusätzliche eine do-while


----------



## CodeIt (15. Nov 2017)

ok, dank mrBrown, wo würdest Du die do-while setzen?


----------



## mrBrown (15. Nov 2017)

CodeIt hat gesagt.:


> ok, dank mrBrown, wo würdest Du die do-while setzen?


Da, wo jetzt die while ist?
(Wobei for vielleicht doch besser geeignet ist, um den Scope einzuschränken, einfach mal ein bisschen probieren, bin grad nur am Handy)


----------



## CodeIt (15. Nov 2017)

Stoppt leider nach wie vor nicht. Habe den Code wie folgt abgegeändert:

```
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();

    Column col = nodeTable.getColumn(prob);
    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }  

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean changed = true;
    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
             ....
            n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
    }while(changed);
```

Hab ich noch irgendwas vergessen?


----------



## mrBrown (15. Nov 2017)

`changed` wird nirgends geändert.


----------



## CodeIt (15. Nov 2017)

ich habe nur die Variable change, welche ich vor Abfrage von hasColumnChanged auf false setze.  Ein changed?


----------



## mrBrown (15. Nov 2017)

Vor der while wird changed deklariert und im while dann als Bedingung genutzt.


Wie funktioniert denn überhaupt der ColumnObserver?


----------



## CodeIt (15. Nov 2017)

Kurz und bündig, das ist der ColumnObserver   https://gephi.org/gephi/0.9.1/apidocs/org/gephi/graph/api/ColumnObserver.html


----------



## mrBrown (15. Nov 2017)

Zeig doch noch mal deinen aktuellen, kompilierenden Code 


Wenn der keine Fehler enthält, funktioniert der Observer offensichtlich anders als gedacht.


----------



## CodeIt (15. Nov 2017)

Würde gerne den kompletten Code zeigen, geht aber nicht weil....... Du versteht evtl. auch so.
Vielleicht sollte ich nach einem anderen Weg zum Abbruch suchen? Vielleicht hast Du einen Vorschlag


----------



## mrBrown (15. Nov 2017)

Zumindest der Ausschnitt von grade in richtig wäre schön und ging ja grad auch...
Wie schon gesagt, gibt es da sowohl `change` als auch `changed` und Klammern fehlen - all das wären mögliche Fehlerquellen


----------



## CodeIt (15. Nov 2017)

```
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();
    Column col = nodeTable.getColumn(prob);

    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean change = true;

    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
        ....
        n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
    }while(change);
```


Vielen Dank das Du dir soviel Zeit nimmst. Habe mich bemüht den Code jetzt besser darzustellen. Leider finde ich hier keine Vorschau um den Code nochmal zu überprüfen.


----------



## mrBrown (15. Nov 2017)

CodeIt hat gesagt.:


> Vielen Dank das Du dir soviel Zeit nimmst. Habe mich bemüht den Code jetzt besser darzustellen. Leider finde ich hier keine Vorschau um den Code nochmal zu überprüfen.


Unter weitere Einstellungen gibts ne Vorschau.

Warum kopierst du den Code nicht einfach? Beim abtippen schleichen sich zu viele Fehler ein, da sind ja immer noch welche drin...


----------



## CodeIt (15. Nov 2017)

Ich seh jetzt eigentlich keinen Fehler mehr, aber vielleicht habe ich auch schon Sehstörungen vom vielen rumprogrammieren.


----------



## CodeIt (15. Nov 2017)

```
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();
    Column col = nodeTable.getColumn(prob);

    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean change = true;

    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
            ....
            n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
        }
    }while(change);
    …
    ...
}
```

Ich finde jetzt ist er aber bildschön. sorry


----------



## mrBrown (15. Nov 2017)

CodeIt hat gesagt.:


> Ich seh jetzt eigentlich keinen Fehler mehr, aber vielleicht habe ich auch schon Sehstörungen vom vielen rumprogrammieren.


Das letzte else war nicht geschlossen...
`graph.Model.getGraph` sieht auch dezent falsch aus...


Ich tippe mal drauf, das ColumnObserver nicht das macht, was du willst.


----------



## CodeIt (15. Nov 2017)

ja den Eindruck habe ich auch. Bleibt mir wahrscheinlich nur noch die Suche nach einer anderen Lösung


----------



## truesoul (16. Nov 2017)

Hallo.

Du erstellst in der do while immer ein neuen Observer. Ich denke dass solltest du wohl außerhalb machen. 

Grüße


----------



## mrBrown (16. Nov 2017)

truesoul hat gesagt.:


> Du erstellst in der do while immer ein neuen Observer. Ich denke dass solltest du wohl außerhalb machen.


Du hast die bisherigen Posts nicht gelesen, oder?


In dem Fall setzt aber hasChanged das ganze zurück,  was natürlich nicht im Javadoc zu der Methode steht -.-


----------



## truesoul (16. Nov 2017)

mrBrown hat gesagt.:


> Du hast die bisherigen Posts nicht gelesen, oder?



Doch habe ich aber diesen Satz überlesen. Passiert


----------

