Avatar billede aslan Nybegynder
01. maj 2002 - 18:21 Der er 9 kommentarer og
5 løsninger

Hvordan gennemløber man et linkedlist?

Jeg har dette eksempel hvor jeg gerne vil finde den bedste tid for løberne?

import java.util.*;

class Marathon
{
    LinkedList runners = new LinkedList();


    Marathon()
    {

      for(int i=0;i<1000;i++)
      {
        Runner r = new Runner(i,generere());

        runners.add(r);

      }

        System.out.println(runners);

    }
    double generere()
    {
        return Math.random()*100+60;

    }
    public static void main(String[] aslan)
    {
        new Marathon();
    }
}
class Runner
{
    int nr;
    double time;

    Runner(int n,double t)
    {

        nr = n;
        time = t;
    }
    public String toString()
    {
        return nr +" "+time;


    }
}
Avatar billede riversen Nybegynder
01. maj 2002 - 18:31 #1
vil du ikke finde den løber der har den bedste tid?
Avatar billede riversen Nybegynder
01. maj 2002 - 18:34 #2
here goes i hvert fald:

public Runner getHurtigstRunner()
{
  Runner res = (Runner) runners.get( 0 );
 
  for( int i = 1; i < runners.size(); i++ )
      if( res.time > (Runner) runners.get( i ).time )
        res = (Runner) runners.get( i );
 
  return res; 
}
Avatar billede riversen Nybegynder
01. maj 2002 - 18:37 #3
hvis der er nogle Runner'e med samme tid, får du den første i listen med den tid.
Avatar billede erve Nybegynder
01. maj 2002 - 19:44 #4
Jeg foretrækker at bruge iterator klassen til den slags.

Værsessgo:

public Runner getHurtigstRunner()
{
  Runner best=null;
  Runner current=null;
  Iterator it = runners.iterator();
  while (it.hasNext())
  {
    current = (Runner) it.next();
    if (best == null)
      best = current;
    else
    if (current.time <= best.time)
      best = current;
  }
  return best;
}
Avatar billede carstenknudsen Nybegynder
01. maj 2002 - 19:45 #5
Med en LinkedList tager det lang tid
at indicere som i riversens forslag.
Brug i stedet en iterator der vil
gennemløbe listen hurtigere, du kan
iøvrigt løbe begge veje med ListIterator.
public Runner getFastestRunner() {
Iterator iterator = runners.iterator();
Runner res = (Runner)iterator.next();
while ( iterator.hasNext() ) {
Runner r = (Runner)iterator.next();
if ( res.time > r.time )
    res = r;
}
return res;
}
PS implementeringen antager at der er mindst
et element i listen.
Avatar billede disky Nybegynder
01. maj 2002 - 20:13 #6
Du skal bruge en Iterator, de er netop lavet til det samme.
Avatar billede soelvpil Nybegynder
01. maj 2002 - 20:21 #7
En alternativ (og pæn) løsning kunne være at lade Runner implementere Comparable og lave en compareTo-metode, der sammenligner to Runner-objekter efter deres tid.

Hvis man så bruger en SortedSet i stedet for en linkedList, vil den automatisk sortere løberne efter deres tider.
Avatar billede codemon Nybegynder
01. maj 2002 - 21:05 #8
Hvis du vil have en hægtet liste der er hurtig at løbe igennem sekventielt kan du implementere din egen.

Foruden de faste pointere til første og sidste element så lav en dynamisk pointer der peger på det sidste element der blev spurt på. Derved bladres der kun et element hver gang der spørges på et nyt (hvis der spørges sekventielt 1, 2, 3, ...)

Suns implementering af en hægtet liste LinkedList vil bladre fra den ene ende og så frem (eller tilbage) hver gang, det bliver i værste fald.

1+2+3+4+5+6+...+N for nummer N 
samme som  ½(n*(n+1))

1000:    500500
100000:  5000050000 (totalt uacceptabelt)
Avatar billede aslan Nybegynder
01. maj 2002 - 22:47 #9
Mange tak for alle jeres kommentar
Avatar billede carstenknudsen Nybegynder
02. maj 2002 - 09:44 #10
codemon: Det er effektivt og hurtigt at
køre igennem LinkedList med en iterator,
kun hvis du bruger get metoden har du
problemet med langsom tilgangstid.
Iøvrigt er dine estimater for pessimistiske
idet Sun implementering (som det fremgår
af dokumentationen) kører baglæns hvis
indeks ligger i anden halvdel af listen,
så din summation bliver:
(1+2+..+N/2)*2 hvorved du får
N^2/8 (N stor). Dette har dog ingen betydning
hvis du benytter er iterator, men som du siger
er det uacceptablt at benytter random access
for en LinkedList.
Avatar billede carstenknudsen Nybegynder
02. maj 2002 - 09:59 #11
oops, der røg en 2 faktor, det skulle
være N^2/4.
Avatar billede aslan Nybegynder
02. maj 2002 - 15:05 #12
Den er vældig smart den Iterator, kan jeg egentlig bruge den i andre sammenhæng, jeg tænker på hashtabeller f.eks?
Avatar billede carstenknudsen Nybegynder
02. maj 2002 - 15:20 #13
Det er det smarte ved iteratorer,
de understøttes af en forfærdelig masse
klasser, specielt alle Collections.
Desværre understøtter HashTable det
ikke, men den understøtter dog Enumeration
som er næste det samme blot ikke så
sikkert (og med uheldige navne). Den kan
så tilgengæld med values metoden returnere
en Collection som kan levere en iterator.
Det er desværre lidt kompliceret, men
at kende Collections framework'et tillader
dig at løse mange opgaver med meget lidt kode,
idet der findes mange algoritmer der er
defineret for Collections.
PS Det er Collection interfacet jeg taler om,
der er også en klasse der hedder Collections
som indeholder søge og sorteringsalgoritmer
etc. Ovenfor har jeg benyttet Collections
som flertal af Collection.
Avatar billede aslan Nybegynder
02. maj 2002 - 15:44 #14
takker for dit hurtige svar
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