Avatar billede abc168 Nybegynder
14. april 2002 - 01:02 Der er 47 kommentarer

Hvor fejlen er ?

Jeg vil slet en Pesons navn ved BinærSøgtræ. Jeg sletter Person ved at lægger alle Person element i et array og slet navn og sætter elementer(inorder) ind i trær igen. dvs. reorganiserer binærtrær, men jeg kan ikke slet navn, som ikke er blade.Jeg ved ikke hvad der er gal med mine kode.
private String[] array;     
private int index;           

public void balancer(){
      array= new String[index-1];
      index= 0;             
      indsaetInorderIArray(rod);
      rod= genopbygTrae(0, array.length-1,null); 
      }

public void indsaetInorderIArray(Person p){
      if(p!=null){
      indsaetInorderIArray(p.vson);
      array[index++]= p.navn;
      indsaetInorderIArray(p.hson);
        }
      }
public void sletNavn(String navn){
    try{
        boolean leder=true;
        for(int i=0; i <array.length; i++){
        if(leder){
            if(navn.compareTo(array[i])==0){
                    array[i]=null;
            index--;
                    leder=false;
            }
                }
            else{
              array[index-1]= array[index];
              }
          }
          }
          catch(Exception ex){}
    }

private Person genopbygTrae(int v, int h, Person far){
      Person p= null;
      if(v<=h){
          p= new Person("  ");
          p.navn= array[(v+ h)/2];
          p.far = far;
          p.vson= genopbygTrae(v, (v+ h)/2-1, p);
          p.hson= genopbygTrae((v+ h)/2+1, h, p);
          }
      return p;
      }
Avatar billede erikjacobsen Ekspert
14. april 2002 - 01:09 #1
Det er en skør måde at gøre det på, men du skal bestemt have lov til at lege.
Tror du ikke at 

  array[index-1]= array[index];

måske skal være

  array[i]=array[i+1]

og at løkken kun skal gå til index.....nah, det er ca. her fejlen er i hvert fald.
Avatar billede abc168 Nybegynder
14. april 2002 - 01:15 #2
tak! jeg prøver lige.....
Avatar billede abc168 Nybegynder
14. april 2002 - 01:18 #3
nej! jeg kan stadigvæk ikke slette en af de sønner, men jeg godt kan slette blade. hvorfor synes du om at det er en skør måde at gøre på??
Avatar billede erikjacobsen Ekspert
14. april 2002 - 01:22 #4
Det er skørt fordi du laver en hel kopi af træet med alle navne.
Man kan jo godt slette en knude i et søgetræ uden det.

Nej, min løsning er ikke helt nok. Men kan du se at du skal kopiere
alle elementer til højre for det fundne en gang til venstre. Dermed
bliver dit array én mindre (målt med index). Og det er ikke det du gør.
Avatar billede abc168 Nybegynder
14. april 2002 - 01:29 #5
Jeg forstår ikke helt om " kopiere
alle elementer til højre for det fundne en gang til venstre". Kan du give en bedre forklaring?
Avatar billede erikjacobsen Ekspert
14. april 2002 - 01:32 #6
I dit array står der

  Peter | Poul | Palle | Pil | Puk | Pjevs

Du finder og sletter Palle. Så skal Pil, Puk og Pjevs rykke én
plads til venstre:

  Peter | Poul | Pil | Puk | Pjevs

og arrayet er én mindre
Avatar billede abc168 Nybegynder
14. april 2002 - 01:37 #7
ok! tak!
men jeg skrev "array= new String[index-1];" for at oprette et nyt array, som ikke indholder den slettede værdi. Er det ikke nok?
Avatar billede abc168 Nybegynder
14. april 2002 - 01:44 #8
ellers skriver jeg "array= new String[antal()-1]; inden i metoder "balancer". men det virker ikke!!
Avatar billede erikjacobsen Ekspert
14. april 2002 - 01:46 #9
Jamen du flytter jo ikke rigtig noget ved fjernelse.
Avatar billede abc168 Nybegynder
14. april 2002 - 01:50 #10
Jeg er godt klare over at antal i arrayet bliver mindre, men hvordan flytter ?
Avatar billede abc168 Nybegynder
14. april 2002 - 01:57 #11
oh nej! jeg er lige ved at give op, og må forsætte i morgen! tak for hjælpen!
Avatar billede abc168 Nybegynder
14. april 2002 - 02:01 #12
Kan du ikke smide et par koder til mig, så jeg kan sove nu!!
Avatar billede erikjacobsen Ekspert
14. april 2002 - 02:04 #13
Du får hjælp til selvhjælp. Prøv at tage din sletNavn ud i en
separat klasse, og eksperimenter med den til den virker. Dvs.
put kendte navne i, slet ét, og med udskrfter undervejs se hvad
der sker. Det er bedre du gør det, end at jeg gør. Jeg kan nemlig
godt hvis jeg gider :) Du skal lære det.
Avatar billede abc168 Nybegynder
14. april 2002 - 02:13 #14
Jeg har en udtag metode som er
public void udtag(String s)
    {
    udtag_hjaelpemetode(s, rod);
    }
    private void udtag_hjaelpemetode(String s, Person p)
    {
          try{
        if(p!=null)
        {
            if(p.vson.navn.compareTo(s)==0) p.vson=null;
            else if(p.hson.navn.compareTo(s)==0)  p.hson=null;
            udtag_hjaelpemetode(s, p.vson);
            udtag_hjaelpemetode(s, p.hson);
        }
            }
          catch(Exception e){}
    }
jeg kan godt slette en blade med ikke sønner.
så finder jeg sletNavn() til at slette sønner inden in et array, men det virker ikke!!!
ok! jeg giver op nu! godnat!
Avatar billede erikjacobsen Ekspert
14. april 2002 - 02:16 #15
Ryst hovedet godt inden du går i gang igen. Du blander mange ting
sammen - og det vigtigste er at du ved hvad du vil, næstvigtigst
hvordan det skal se ud i Java.
Avatar billede abc168 Nybegynder
14. april 2002 - 02:22 #16
Hvordan blander jeg mange ting samme?  hvis jeg har udtag() så skal jeg faktisk ikke have sletNavn(), men hvordan kan jeg slette Person navn, når den ikke er blade?
Avatar billede abc168 Nybegynder
14. april 2002 - 23:12 #17
Jeg tror, at jeg aldrig kan lære java!!! jeg har brugt hele dagen til for at finde fejlen. Det er så smertefuld!!!!! Hjælp!!!!
Avatar billede erikjacobsen Ekspert
14. april 2002 - 23:15 #18
Du skal ikke tro du er i gang med at lære Java, du er i gang med
at lære at programmere. Og det handler om at tænke logisk - og i
passende små skridt.

Lad mig lave en sletNavn til dig som eksempel - altså slette et navn
i en liste. Men jeg vil altså bruge en ArrayList i stedet for
et array. Det er smartere. 2 secs
Avatar billede abc168 Nybegynder
14. april 2002 - 23:19 #19
Jeg har lavet en slet metoder.
public void sletNavn(Person p){
try{
        for(int i=0; i <array.length; i++){
          if(p.navn.compareTo(array[i])==0)
                  {
                    array[i]= array[i+1];
            index--;
                    }
                }
        }
        catch(Exception a){}
        }
det er måske forkert!
Avatar billede erikjacobsen Ekspert
14. april 2002 - 23:24 #20
Ja, du flytter kun én gang. Jeg ved ikke om du skal bruge et array, men
se her et eksempel på brugen af ArrayList. Det er et færdigt program,
der kører:


import java.util.*;

public class SletEtNavn {


  static ArrayList liste = new ArrayList();


  public static void sletNavn(ArrayList liste,String navn){
    boolean found=false;
    int i=0;
    while (!found && i<liste.size()) {
      if (navn.equals((String)liste.get(i))) {
        found=true;
      } else {
        i++;
      }
    }
    if (found) {
      liste.remove(i);
    }
  }


  public static void main(String args[]) {
    liste.add("Peter");
    liste.add("Poul");
    liste.add("Børge");

    System.out.println(liste);

    sletNavn(liste,"Poul");

    System.out.println(liste);
  }

}
Avatar billede abc168 Nybegynder
14. april 2002 - 23:37 #21
tak! Men jeg skal slette en navn fra binærTræ. Jeg tænker om at jeg kan flytte alle navn til et array( inorder) og slet en pågælende navn, og genopbygge en trær igen. Dvs, da jeg sletter en, som ikke er blade, så skal jeg reorganiserer træet.
Avatar billede erikjacobsen Ekspert
14. april 2002 - 23:42 #22
Det er præcis det jeg hjælper dig med. Men det er for besværligt at bruge et array.
Flyt dem til en ArrayList, slet navnet, og byg træet op igen. Kan du ikke se at
mit lille eksempel kan hjælpe dig på vej?
Avatar billede abc168 Nybegynder
15. april 2002 - 00:16 #23
tak! jeg skal lige prøve den! men kan du se hvad der er gal med de koder, som jeg skrev??

public void udtag(Person p){
            if(p.navn.compareTo(actuel.navn)==0){
              sletNavn(p);
            }
            else{
        udtag_hjaelpemetode(p.navn, rod);}
        }
    private void udtag_hjaelpemetode(String s, Person p)
    {
          try{
        if(p!=null){
        if(p.vson.navn.compareTo(s)==0) p.vson=null;
        else if(p.hson.navn.compareTo(s)==0) p.hson=null;
        udtag_hjaelpemetode(s, p.vson);
        udtag_hjaelpemetode(s, p.hson);
        }
            }
          catch(Exception e){}

        }
/******* tael om hvor mange element i trae **********/
      public int antal()
      {
          return tael(rod);
      }
      public int tael(Person p) {
                  if(p==null)  return 0;
                  return 1+ tael(p.vson)+ tael(p.hson);
          }
/********** balancer træ ***************/
private String[] array;     
private int index;           
private int ctr;

public void balancer(Person px){
      ctr= antal()-1;
      array= new String[ctr];
      index= 0;             
      indsaetInorderIArray(rod);
      udtag(px);
      rod= genopbygTrae(0, ctr-1, null );
      rod= actuel= null;          //slet den gammel træ
      }

public void indsaetInorderIArray(Person p){

      if(p!=null){
      indsaetInorderIArray(p.vson);
      array[index++]= p.navn;
      indsaetInorderIArray(p.hson);
        }
      }
public void sletNavn(Person p){
try{
        for(int i=0; i <array.length; i++){
          if(p.navn.compareTo(array[i])==0)
                  {
                    array[i]= array[i+1];
            index--;
                    }
                }
        }
        catch(Exception a){}
        }

private Person genopbygTrae(int v, int h, Person far){
      Person p= null;
      if(v<=h){
          p= new Person("  ");
          p.navn= array[(v+ h)/2];

          p.far = far;

          p.vson= genopbygTrae(v, (v+ h)/2-1, p);
          p.hson= genopbygTrae((v+ h)/2+1, h, p);
          }
      return p;
      }
  }
Avatar billede erikjacobsen Ekspert
15. april 2002 - 00:19 #24
fejlen er her

for(int i=0; i <array.length; i++){
          if(p.navn.compareTo(array[i])==0)
                  {
                    array[i]= array[i+1];
            index--;
                    }
                }
        }

Du kigger på alle elementer med for-løkken, ok.
Finder du navnet, flytter du det efterfølgende navn én frem, og
det er såmænd godt nok, men du gør det ikke for alle efterfølgende
navne i dit array. Endvidere rammer du ved siden af, hvis du fandt
navnet som det sidste,
Avatar billede abc168 Nybegynder
15. april 2002 - 00:27 #25
hvordan kan jeg gøre for alle efterfølgende navne?
hvordan skal det være?
Avatar billede erikjacobsen Ekspert
15. april 2002 - 00:29 #26
det gider jeg ikke hjælpe dig med :)

brug mit forslag med ArrayList - eller la' være ....
Avatar billede abc168 Nybegynder
15. april 2002 - 00:43 #27
Jeg har ikke styret på ArrayList. Nu skal jeg læse java dokumentation for at finde ud af at indsætte alle personer i liste. men jeg vil stadigvæk prøve at få min gamle program virker.
Avatar billede erikjacobsen Ekspert
15. april 2002 - 00:44 #28
Det skal du være velkommen til
Avatar billede abc168 Nybegynder
15. april 2002 - 01:02 #29
Hvordan genopbygger en trær fra Arraylist og inorder??
Avatar billede erikjacobsen Ekspert
15. april 2002 - 01:04 #30
Indsæt med add.metoden (se mit eksempel)
Udtræk også som mit eksempel
Avatar billede abc168 Nybegynder
15. april 2002 - 01:10 #31
ved ikke alligevel!! Der er ikke genopbygge inorder i dit eks.!!

public void balancer(Person px){
      ArrayList liste = new ArrayList();
      liste.add(px);
      sletNavn(px.navn);

    ?? rod= genopbygTrae(0, i, null );
      rod= actuel= null;          //slet den gammel træ
      }


      public void sletNavn(ArrayList liste,String navn){
          boolean found=false;
          int i=0;
          while (!found && i<liste.size()) {
            if (navn.equals((String)liste.get(i))) {
              found=true;
            } else {
              i++;
            }
          }
          if (found) {
            liste.remove(i);
          }
        }
Avatar billede erikjacobsen Ekspert
15. april 2002 - 01:17 #32
Genopbyg træet: brug get på samme indexer som du allerede gør
Avatar billede abc168 Nybegynder
16. april 2002 - 01:03 #33
Hej! Jeg bruger ArrayList, men det virker stadigvæk ikke rigtig. Kan du se fejlen i de nye koder?
public void udtag(Person p)
    {
            if(p.navn.compareTo(actuel.navn)==0)
            {
              sletNavn(liste, p.navn);
            }
            else{
        udtag_hjaelpemetode(p.navn, rod);}
        }
    private void udtag_hjaelpemetode(String s, Person p)
    {
          try{
        if(p!=null)
        {
            if(p.vson.navn.compareTo(s)==0) p.vson=null;
            else if(p.hson.navn.compareTo(s)==0) p.hson=null;
            udtag_hjaelpemetode(s, p.vson);
            udtag_hjaelpemetode(s, p.hson);
        }
            }
          catch(Exception e){}
        }
/******* tael om hvor mange element i trae **********/
      public int antal()
      {
          return tael(rod);
      }
      public int tael(Person p)           
      {
                  if(p==null)  return 0;
                  return 1+ tael(p.vson)+ tael(p.hson);
          }
/********** balancer træ ***************/
private ArrayList liste ;

public void balancer(Person px, String s){
      ArrayList liste = new ArrayList();
      liste.add(px);
      sletNavn(liste, s);
      rod= genopbygTrae(0, liste.size(), null );
      rod= actuel= null;          //slet den gammel træ
      }
      public void sletNavn(ArrayList liste,String navn){
          boolean found=false;
          int i=0;
          while (!found && i<liste.size()) {
            if (navn.equals((String)liste.get(i))) {
              found=true;
            } else {
              i++;
            }
          }
          if (found) {
            liste.remove(i);
          }
        }
private Person genopbygTrae(int v, int h, Person far){
      Person p= null;
      if(v<=h){
          p= new Person("  ");
          p.navn= (String)liste.get((v+ h)/2);
          p.far = far;
          p.vson= genopbygTrae(v, (v+ h)/2-1, p);
          p.hson= genopbygTrae((v+ h)/2+1, h, p);
          }
      return p;
      }
  }
Avatar billede abc168 Nybegynder
16. april 2002 - 01:07 #34
og i stedet indsætte alle Personer i arrayet, indsætter jeg kun de navne, som ikke bliver slettet. men jeg fik de samme resultater som jeg bruger ArrayList.
public void indsaetInorderIArray(String s, Person p){

      if(p!=null && p.navn.compareTo(s)!=0){
      indsaetInorderIArray(s, p.vson);
      array[index++]= p.navn;
      indsaetInorderIArray(s, p.hson);
        }
      }
Avatar billede abc168 Nybegynder
19. april 2002 - 12:49 #35
Det lykkes for mig at udtag et navn fra Binartrær! men hvordan kan jeg gem person på træet ind database og senere hente dem igen?
Avatar billede erikjacobsen Ekspert
19. april 2002 - 12:54 #36
Der er jo mange "tvivlsomme" konstruktioner i din kode. Men
lad os tage én af dem

if (p!=null) {
  indsaetInorderIArray(s, p.vson);
  if(p.navn.compareTo(s)!=0){
      array[index++]= p.navn;
  }
  indsaetInorderIArray(s, p.hson);
}

Kan du se forskellen
Avatar billede abc168 Nybegynder
19. april 2002 - 14:50 #37
Ja ! Jeg har rettet kode, derfor lykkes det for mig at udtage et navn.
Nu har jeg oprettet en database hedder "Anetræ", men hvordan laver en gem metode så jeg kan gem persons oplysning ind i databases Person tabel?
Avatar billede erikjacobsen Ekspert
19. april 2002 - 15:26 #38
Ok, du kan slette et navn i træet. :)

Må jeg spørge hvad du skal bruge det til? En skoleopgave?
Dit eget projekt?

Nu siger du database. Hvilken?

Hvis du har en database vil det være mest fornuftigt at få
den til at håndtere søgning og sletning og så videre, vha almindelige
SQL-sætninger
Avatar billede abc168 Nybegynder
20. april 2002 - 10:34 #39
Det er en trænings opgave fra skolen.  Jeg vil sikre jeg kan løse eksamsopgave, den får jeg snart.
Database: dvs. for enhver node gælder at dens venstre søn er persons biologisk mor, og at dens højre søn er personens biologisk far. Jeg skal lave et system med GUI, så bruger kan indsætte sine forældre på rigtig plads i træet,  manøvrere gennem træet. Bruger kan gennem informationerne i træet i en database for programmet lukkes- og senere hente dem igen.
Jeg har laver en database (vhaSqL-sætninger) som hedder AneTræ med en Tabel, som er Person med Persons CprNr, navn, FarsCprNr.
Mit problem nu er at lave en metode, som kan gemme Persons oplysning i database, og en hente metode, som kan hente oplysninger.
Avatar billede erikjacobsen Ekspert
20. april 2002 - 10:37 #40
Ok, skoleopgave. Det er lidt svært at hjælpe dig så, fordi jeg ikke kender det
fag/kursus du følger.

Hvad har I lært om at gemme ting? Mener du "database" når du siger det, eller er det bare
det en fil?
Avatar billede abc168 Nybegynder
20. april 2002 - 11:27 #41
Vi har lære om at gemme ting i en fil og læse fra filen igen.
Men i denne opgave skal jeg gemme informationer i træet i en database og hentes dem igen.
Avatar billede erikjacobsen Ekspert
20. april 2002 - 12:48 #42
Hvilken database?
Avatar billede abc168 Nybegynder
20. april 2002 - 12:56 #43
en database som indholder en tabel, som hedder Person med Persons oplysninger.
Og nu jeg finder jeg ud af min insætte metoder er forkert. Hvis "Bo" er barn, "Marie" og "Holger" er Bos mor og far, Så skrive jeg :
if(rod==null)
  {
    rod=nyP;
    actuel= rod;
  }
  else
  {
    if(nyP.koen.equals("k"))
    {
            tilVenstre();
            insert(nyP);
  }
else{ tilHoejre();
      insert(nyP);
    }
men det virker ikke rigtig hvis jeg vil insert "Mette" og "Niels" som "Maris" mor og far.
Avatar billede erikjacobsen Ekspert
20. april 2002 - 13:33 #44
Køn? Hvad nu? Dit søgetræ er ordnet efter navn. Så hvad er det her nu for noget :)  ??

Hvilken database ?
Avatar billede abc168 Nybegynder
20. april 2002 - 13:54 #45
oh nej! Det er mig, som blandte tinge sammen. Jeg skal lave et genetisk anetræ, der indholder en persons biologisk forfædre. Jeg skal sætte persons forældre på korrekt plads i træet. dvs. Person har mor og far, mor har mor og far, og far har mor og far..... mor til venstre og far til højre, sådan bygger et anetræ.
Databasen: at gemme informationerne i trætet i en database. Databasen er persons oplysnings database.

Jeg skal første bygge et anetræ, og gemme informationer i database(preorder), tøm træet,  indlæse preordre fra databasen.
Avatar billede erikjacobsen Ekspert
20. april 2002 - 15:00 #46
Kan du præcisere hvad du mener med "database" ?
Avatar billede abc168 Nybegynder
20. april 2002 - 16:11 #47
I Mocrisoft Access oprette en database med tabel hedder Person, Tabel person indholder persons CprNr(primær nøgler), navn, og fremmeId(fremmenøgler).
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