2016-11-21 3 views
0

Ich schreibe ein Projekt, das erfordert, dass ich einen Graph-Traversal-Algorithmus über eine gitterartige Struktur aus Unit s verwende. Ich schaffe das Gitter so dass jede Einheit des Gitters Verweise auf die jeder seiner Nachbarn hat:Referenzieren einer Position in einem Array anstelle der darin enthaltenen Daten. (Java)

class Unit { 
    boolean type, visited; 
    Unit up, left, down, right; 
    Unit(Unit u, Unit l, Unit d, Unit r) { 
     up = u; 
     left = l; 
     down = d; 
     right = r; 
    } 
} 

I erstellen ein Raster von Unit s durch ein neues Unit Objekt zu jeder Position mit den Nachbarn in der Zugabe von Form von Verweisen auf andere Stellen im Netz:

Unit[][] grid = new Unit[height][width]; 

for (int i = 0; i < height; ++i) { 
    for (int j = 0; j < width; ++j) { 
     grid[i][j] = new Unit(
      i == 0 ? null : grid[i - 1][j], 
      j == 0 ? null : grid[i][j - 1], 
      i == height - 1 ? null : grid[i + 1][j], 
      j == width - 1 ? null : grid[i][j + 1] 
     ); 
    } 
} 

Leider, wenn ein Teil des Gitter Unit s geschaffen, ihre Nachbarn sind null so haben sie die richtige Referenz nicht halten. Um dies zu lösen, führe ich einfach den gesamten Algorithmus erneut aus, so dass jedes Rasterelement gefüllt ist, aber das scheint eine sehr ineffiziente und hässliche Lösung zu sein.

Was Ich mag würde zu tun ist, um das Unit Objekt als „dynamisch“ Index des Gitters zu halten, so, wenn eine bestimmte Position des Nachbar Referenz in dem entsprechenden Unit s auch aktualisiert werden würde, dann aktualisiert wird. Dies wirkt als eine Art Versprechen durch das Raster, dass, wenn eine Position (i, j) gefüllt wird, die benachbarten Unit s die aktualisierte Information haben wird.


Vielen Dank an alle, die mir helfen können, dies zu lösen!

P.S. Ich weiß, dass ich die Indizes in das Raster in der Unit Klasse für die Nachbarn speichern kann, aber das würde mich auf das spezifische Raster beschränken, das ich in diesem Beispiel habe, und es würde es notwendig machen, den Aufruf zu machen, das Element jedes Mal zu erhalten, wenn es aktualisiert wird . Ich möchte es nicht in einem zweidimensionalen Array speichern, wie ich es hier mache, also möchte ich ein verallgemeinerbares System.

Antwort

1

Wenn Sie Ihre erste Unit mit Ihrem Konstruktor erstellen, gibt es keine benachbarten Einheiten, daher beziehen sich Ihre Referenzen auf Null. Sie können stattdessen überprüfen, ob eine benachbarte Zelle eine Nullreferenz enthält (wobei die Werte der benachbarten Zellen i und j berücksichtigt werden), und wenn dies der Fall ist, erstellen Sie eine new Unit().

+0

Aber wenn ich diese 'neuen Unit()' s erstelle, haben sie auch noch keine Nachbarn instanziiert. Außerdem würde es für fast jede "Einheit" Kontrollen geben, da die meisten von ihnen durch die Definition des Problems noch nicht geschaffen wurden. –

+0

Sie haben Recht, dass für jede Einheit Prüfungen durchgeführt werden. Das ist im Wesentlichen das, was Sie fragen, nicht wahr? Grundsätzlich möchten Sie sagen, wenn eine benachbarte Zelle bereits eine Einheit zugewiesen hat, dann verwenden Sie diese Referenz in meinem Konstruktor, andernfalls erstellen Sie eine neue Instanz von Unit. Daher würde ich vorschlagen, den Aufruf an Ihren Konstruktor anzupassen, um diese Prüfungen durchzuführen und Objekte bei Bedarf zu instanziieren –

Verwandte Themen