Avatar billede javanic Nybegynder
09. februar 2004 - 22:22 Der er 17 kommentarer og
2 løsninger

Opret Hob af objekter

Jeg sidder og skal lave en mindre kalender, hvor de enkelte aftaler tildeles en prioritering og indsættes i nn hob/heap (altså én hob pr. dag i kalenderen).

Min hob er oprettet som et array (indtil videre), og jeg vil så gerne kunne indsætte objekter efter deres prioritet i denne hob.

Er der nogen der kan give mig lidt fif :)
Avatar billede arne_v Ekspert
09. februar 2004 - 22:37 #1
ArrayList er mere dynamisk end et array
Avatar billede javanic Nybegynder
09. februar 2004 - 22:51 #2
i know, men hvordan indsætter jeg et reelt objekt efter prioritet i hob'en - det er mere det der er mit problem.
Hvis jeg f.eks. skulle indsætte objektet "x" bestående af (aftale, prioritet), hvordan ville min insert() (altså løkken)så skulle se ud ?
Avatar billede arne_v Ekspert
09. februar 2004 - 22:52 #3
Du bruger array index som prioritet ?
Avatar billede javanic Nybegynder
09. februar 2004 - 23:00 #4
vil det så sige at jeg skal bruge et 2-dimensionelt array -  skal vel have referencen med ?
Avatar billede arne_v Ekspert
09. februar 2004 - 23:03 #5
En mulighed var 2 ArrayList's: en med referancer og en med prioritet
Avatar billede arne_v Ekspert
09. februar 2004 - 23:04 #6
Men måske var det pænere med en ArrayList og så indsætte objekter som indeholder
2 atributter: prioritet og det egentlige objekt
Avatar billede javanic Nybegynder
09. februar 2004 - 23:09 #7
det er lige præcis det jeg har leget med, men kan ikke lige få det til at spille...

Jeg havde tænkt lidt på en insert alá:

public void insert(Aftale n)
{
  currentSize++;         
  hob[currentSize] = n; 

  aftale temp                        ; 
  int i = currentSize                ; 
  int parrent = (currentSize -1 ) /2  ;


while (i > 0 && hob[i].getPriotitet < hob[parrent].getPriotitet) 
{
  temp = (Aftale) hob[i] ; 
  hob[i] = hob[parrent]  ; 
                                 
  hob[parrent] = temp ;
  i = parrent        ;                           
  parrent = (i-1)/2  ; 
}

}

- hvor en aftale består af (navn, prioritet) !

Er jeg helt forkert på den eller hvad ? :(
Avatar billede arne_v Ekspert
09. februar 2004 - 23:16 #8
Jeg ville nok bare lave en ArrayList.

Aftale (navn + prioritet) bliver bare add'et.

Og enten kunne man så bare løbe igennem den ArrayList efter den højeste/laveste
prioritet når man skulle bruge den.

Eller man kunne være doven og sortere den.

pointen er at det kræver næste ingen kode at lave.
Avatar billede javanic Nybegynder
09. februar 2004 - 23:25 #9
jamen, hvis vi snakker en hob, skal de pågældende aftale jo indsættes på den rigtige plads/node i selve insert-metoden.

Hvis jeg bare add'er objekterne til hoben, vil jeg jo ikkr overholde "syntaxen" for et/en heap.
Avatar billede arne_v Ekspert
09. februar 2004 - 23:30 #10
Hvis det er et krav i opgaven at data skal indsættes i data strukturen efter
prioritet, så duer det naturligvis ikke.

Så vil jeg nok foreslå at du laver din egen dobbelt linket liste.

Med previous og next referancer.
Avatar billede javanic Nybegynder
09. februar 2004 - 23:37 #11
Man kan vel lige så godt udnytte at array'ets index kan bruges i formlen for en hob/heap.

Altså at "parrent" til "i" kan findes ved i/2, og børnene ved 2*i og 2*i+1
Avatar billede dsj Nybegynder
10. februar 2004 - 15:26 #12
Hvis du ønsker at have aftalerne i en prioriteret rækkefølge, kunne det være du skulle tage et kig på TreeSet, der er en sorteret struktur.

Så lader du klassen aftale implementere Comparable og tilføjer følgende metode på Aftale:

public int compareTo(Object o) {
  int result = 1;
  if (o instanceof Aftale) {
    Aftale a = (Aftale)o;
    if (getPriotitet() < a.getPriotitet())
      result = -1;
    else if (getPriotitet() < a.getPriotitet())
      result = 0;
  }
  return result;
}
Avatar billede dsj Nybegynder
10. februar 2004 - 15:27 #13
Rettelse:

public int compareTo(Object o) {
  int result = 1;
  if (o instanceof Aftale) {
    Aftale a = (Aftale)o;
    if (getPriotitet() < a.getPriotitet())
      result = -1;
    else if (getPriotitet() == a.getPriotitet())
      result = 0;
  }
  return result;
}
Avatar billede dsj Nybegynder
10. februar 2004 - 15:32 #14
Hvordan compareTo skal udformes afhænger selvfølgelig af, hvordan du angiver aftalernes prioritet. Den jeg har vist, antager at 0 er højest prioritet og højeste værdi er lavest prioritet.
Avatar billede ulrikm Nybegynder
10. februar 2004 - 16:50 #15
Det lyder som om du gerne vil bruge en prioritetskø - her er et eksempel:
<http://olli.informatik.uni-oldenburg.de/heapsort_SALA/english/Aufgaben/Programmieren/prog_lsg.html>

Du skal bare oprette en Node klasse selv:

class AftaleNode implements Node
{
  private String aftaleNavn;
  private int prioritet;

  Node( int prioritet, aftaleNavn )
  {
      this.prioritet = prioritet;
      this.aftaleNavn = aftaleNavn;
  }

  public String getAftaleNavn()
  {
      return aftaleNavn;
  }

  public boolean isGreaterThan( Node node )
  {
      if( node instanceof AftaleNode )
      {
        return prioritet > ((AftaleNode)node).prioritet;
      }
      return false;//hmm
  }
}
Avatar billede javanic Nybegynder
10. februar 2004 - 22:14 #16
dsj => Det skal implementeres vha. en minimums hob, men derfor kan jeg vel godt bruge din kode, right ?
(går ud fra at metoden skal kaldes i min while-betingelse i insert-metoden, eller...??)

ulrikm => tak for linket

men i har begge fat i noget af det jeg skal bruge, prøver lige at kigge på det, men foreløbig tak :o)...ALLE tre
Avatar billede dsj Nybegynder
11. februar 2004 - 00:39 #17
Du skal ikke kalde nogen metoder. Du add'er blot Aftale-objekterne til en TreeSet-instans, og vupti ligger de i rigtig rækkefølge, defineret ud fra compareTo-metoden.
Avatar billede javanic Nybegynder
11. februar 2004 - 09:57 #18
thnaks, løste det dog ved at lave en rekursiv "swap-metode" i min insert,...men jeg vil helt sikkert prøve at se om det ikke er mere optimalt med din comparableTo :o)

Håber at det er iorden at jeg splitter pointene mellem jer begge 2, efter som at det var deraf jeg fik inspirationen ;o)

ulrikm -> ligger du lige et svar
Avatar billede ulrikm Nybegynder
11. februar 2004 - 17:34 #19
Jep
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