Avatar billede preben.m Nybegynder
17. maj 2003 - 02:42 Der 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

Squares Klasse
---------------------------------------

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);
  }
Avatar billede preben.m Nybegynder
17. maj 2003 - 11:30 #1
Svar som kildekode, hvis der er behov for mere kode bare skriv et indlæg, så vil jeg copy paste det.... (!);
Avatar billede ulrikm Nybegynder
17. maj 2003 - 13:38 #2
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 );
        }
    }
}
Avatar billede ulrikm Nybegynder
17. maj 2003 - 13:56 #3
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 );
                }
            }
        }
    }
Avatar billede preben.m Nybegynder
17. maj 2003 - 14:08 #4
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
Avatar billede ulrikm Nybegynder
17. maj 2003 - 14:32 #5
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 );
                }
            }
        }
    }
Avatar billede ulrikm Nybegynder
17. maj 2003 - 14:36 #6
og
                  neighbour.getNeighbours( result,
                        terningVærdi-1 );

i løkken skal være:

                  neighbour.getNeighbours( result, visited,
                        terningVærdi-1 );
Avatar billede preben.m Nybegynder
17. maj 2003 - 14:42 #7
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]]

Tak for dine svar dine points er snart på vej
Avatar billede ulrikm Nybegynder
17. maj 2003 - 14:49 #8
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 );
                }
            }
        }
    }
Avatar billede preben.m Nybegynder
17. maj 2003 - 14:55 #9
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 ????
Avatar billede preben.m Nybegynder
17. maj 2003 - 14:57 #10
Du her mere en fortjent dine points, Jeg er overlykkelig ;-)
Avatar billede ulrikm Nybegynder
17. maj 2003 - 14:58 #11
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.
Avatar billede preben.m Nybegynder
17. maj 2003 - 15:12 #12
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.
Avatar billede ulrikm Nybegynder
17. maj 2003 - 18:40 #13
Nej, jeg tror ikke jeg kender Jacob og Christian - jeg "droppede ud" for 2 år siden.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester