17. maj 2003 - 02:42Der er
12 kommentarer og 1 løsning
Finde nabo - trivial persuit
jeg har behov for at vide hvilke felter der ligger i en afstand fra 1-6 fra det pågældne objekt, objektet indeholder en vector med de nærmeste naboer,
Der er tale om to klasser
Board indeholder objekter af typen Square i Vectoren Square, Square indeholder en Vector med Squars nabo objekterne, jeg vil gerne have en metode der kan bruges således
getNeigbour(Square, TerningVærdi) returnere Vector med Squars i afstanden TerningVærdi, Vectoren skal kun indeholde Squars der befinder sig i afstanden TerningVærdi som er af typen Int.
getNeigbour skulle gerne være en metode i enten Square eller Board
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Det kan vel forholdsvist nemt laves som nedenfor hvor alle naboer som passer samles op i "result":
public void getNeighbours( java.util.Vector result, int terningVærdi ) { if( terningVærdi == 1 ) // Det antages at terningværdi > 0. // Tilføj alle umiddelbare naboer - de kan alle // nås ved terningkast = 1 { for( int i = 0; i < neighbours.size(); i++ ) { result.add( neighbours.get(i) ); } } else // tilføj de naboer som kan nås, når vi går et // skridt videre (terningVærdi-1) { for( int i = 0; i < neighbours.size(); i++ ) { Square neighbour = (Square)neighbours.get(i); neighbour.getNeighbours( result, terningVærdi-1 ); } } }
Hov, jeg var vist lidt hurtig på aftrækkeren. Hvis nu A og B er naboer vil A vel have B i sin naboliste OG B have A i sin naboliste. Så dur ovenstående ikke, da man kun må gå i én retning. Det kan dog hurtigt repareres ved at hold øje med at man ikke 'går tilbage til en fuser' - 'fusere' opsamles i "visited":
public void getNeighbours( java.util.Vector result, java.util.Hashtable visited, int terningVærdi ) { if( terningVærdi == 1 ) // Det antages at terningværdi > 0. // Tilføj alle umiddelbare naboer - de kan alle // nås ved terningkast = 1 { for( int i = 0; i < neighbours.size();i++ ) { result.add( neighbours.get(i) ); } } else // tilføj de naboer som kan nås, når vi går et // skridt videre (terningVærdi-1) { visited.put( this, this ); for( int i = 0; i < neighbours.size();i++ ) { Square neighbour = (Square)neighbours.get(i); if( visited.get(neighbour) == null ) { neighbour.getNeighbours( result, terningVærdi-1 ); } } } }
Hej Ulrik hvad med Vector result hvorledes kan jeg få fat i den, jeg går ud fra at jeg skal placere metoden i square, kan jeg ikke få den til at gøre således result ^ public Vector getNeigbour(Square sq,int TerningVærdi)
Altså retunere de mulige naboer i afstanden terningVærdi
Du kan lave en "driver" metode, også i Square klassen:
public java.util.Vector getNeighbours( int terningVærdi ) { java.util.Vector result = new java.util.Vector(); getNeighbours( result, new java.util.Hashtable(), terningVærdi); return result; }
og så evt. gøre void getNeighbours( java.util.Vector,java.util.Hashtable,terningVærdi ) private.
så har du hele Square klassen:
public class Square //implements Gint
{ private int type; //måske brugt private Vector neighbours = new Vector(); private BoardPosition boardPosition = new BoardPosition(0,0,0);
public Vector getNeighbours() { return this.neighbours; }
public void addNeigbour(Square sq) { this.neighbours.addElement(sq); }
public java.util.Vector getNeighbours( int terningVærdi ) { java.util.Vector result = new java.util.Vector(); getNeighbours( result, new java.util.Hashtable(),terningVærdi); return result; }
private void getNeighbours( java.util.Vector result, java.util.Hashtable visited, int terningVærdi ) { if( terningVærdi == 1 ) // Det antages at terningværdi > 0. // Tilføj alle umiddelbare naboer - de kan alle // nås ved terningkast = 1 { for( int i = 0; i < neighbours.size();i++ ) { result.add( neighbours.get(i) ); } } else // tilføj de naboer som kan nås, når vi går et // skridt videre (terningVærdi-1) { visited.put( this, this ); for( int i = 0; i < neighbours.size();i++ ) { Square neighbour = (Square)neighbours.get(i); if( visited.get(neighbour) == null ) { neighbour.getNeighbours( result, terningVærdi-1 ); } } } }
Jeg har prøvet det det ser ud til at virke men den returnere også sig selv som nabo
public java.util.Vector getNeighbours( int terningVærdi ) { java.util.Vector result = new java.util.Vector(); getNeighbours( result, new java.util.Hashtable(),terningVærdi); return result; }
private void getNeighbours( java.util.Vector result, java.util.Hashtable visited, int terningVærdi ) { if( terningVærdi == 1 ) // Det antages at terningværdi > 0. // Tilføj alle umiddelbare naboer - de kan alle // nås ved terningkast = 1 { for( int i = 0; i < neighbours.size();i++ ) { result.add( neighbours.get(i) ); } } else // tilføj de naboer som kan nås, når vi går et // skridt videre (terningVærdi-1) { visited.put( this, this ); for( int i = 0; i < neighbours.size();i++ ) { Square neighbour = (Square)neighbours.get(i); if( visited.get(neighbour) == null ) { neighbour.getNeighbours( result,visited, terningVærdi-1 ); } } } }
Square Category Square "Folk og Steder", Board position : [1,1,1] har naboer [Extra throw at Board position : [4,5,1], Category Square "Folk og Steder", Board position : [1,1,1], Category Square "Folk og Steder", Board position : [1,1,1], Extra throw at Board position : [1,2,6], Category Square "Folk og Steder", Board position : [1,1,1], Question Square "Sport og Fritid" , Board position : [7,4,1]]
hov, endnu en fejl :-( - det er vist mere kompliceret end som så.. I "if( terningværdi == 1 ) er der jo også mulighed for at gå tilbage, så nu tror jeg endelig vi har den færdige version:
private void getNeighbours( java.util.Vector result, java.util.Hashtable visited, int terningVærdi ) { if( terningVærdi == 1 ) // Det antages at terningværdi > 0. // Tilføj alle umiddelbare naboer - de kan alle // nås ved terningkast = 1 { for( int i = 0; i < neighbours.size();i++ ) { Object neighbour = neighbours.get(i); if( visited.get(neighbour) == null ) { result.add( neighbour ); } } } else // tilføj de naboer som kan nås, når vi går et // skridt videre (terningVærdi-1) { visited.put( this, this ); for( int i = 0; i < neighbours.size();i++ ) { Square neighbour = (Square)neighbours.get(i); if( visited.get(neighbour) == null ) { neighbour.getNeighbours( result, visited, terningVærdi-1 ); } } } }
Du er fandeme' hurtig !!!! Jeg har hvergang nået et stykke af vejen og så tabt overblikket, hvorefter jeg har slettet det igen og igen jeg tror efterhånden jeg har brugt 15 timer, en af mine venner 7, og en anden 3. Du er sku lidt af en haj !!! Hvor har du lært det ????
tak, tak - jeg er bachelor i datalogi fra københavns universitet - hvilket betyder at man lærer at programmere rekursivt, før man lærer nogen om løkker.. Derudover har Java været min hobby de sidste 5 år, og så bliver man hurtig til at kode.
Java er nyt for mig jeg har før programmeret C og ASM til uProc., men aldrig objektorinteret kun minimalt i C++. Jeg går på IHK med mit første fag som du nok har gættet er java. jeg prøvet rekursivt kald men resulteret i out of mem. exception, så den droppet jeg efter nogle timer, men en ting er sikket
JEG HAR LAVET EN (NOK MANGE) FEJL
Kender du en Jacob Pedersen og Christan Ulrik Søtrup som vidst nok er færdige til sommer.
Nej, jeg tror ikke jeg kender Jacob og Christian - jeg "droppede ud" for 2 år siden.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.