Avatar billede hbbd Nybegynder
08. januar 2002 - 17:28 Der er 17 kommentarer og
1 løsning

Beregning af gennemsnit?

Hvad skal jeg gøre for at beregne et karaktergennemsnit, som er gemt i en ArrayList? Hvordan skal metoden til det se ud?
Avatar billede el_gnu Nybegynder
08. januar 2002 - 17:44 #1
noget a la

double snit(ArrayList k)
{
  double sum = 0;
  for (int i=0 ; i<k.size() ; i++)
    sum += k.get(i);
  return sum/k.size();
}
Avatar billede mosquito Nybegynder
08. januar 2002 - 18:02 #2
et eksempel med array af int..

public class testing
{
    public static void main(String[] arguments)
    {
        int[] arrayMedTal = {10,20,30,50};

        int index = 0;
        int sum = 0;
        int gns = 0;
       
        for(index = 0; index<arrayMedTal.length; index++)
        {
            sum = sum + arrayMedTal[index];
        }
        gns = sum / (index+1);
        System.out.println(\"Summen af tal i array: \" + sum);
        System.out.println(\"Antal tal i array: \" + index);
        System.out.println(\"Gennemsnit: \" + gns);
    }
}
Avatar billede greybeard Nybegynder
08. januar 2002 - 18:13 #3
Der er lidt besværligt at bruge ArrayList til det formål.
Da en ArrayList kun kan indeholde objekter, skal  du wrappe og unwrappe dine karakterer.
Ved du ikke på forhånd, hvor mange karakterer du skal bruge, så du kan bruge et Array istedet?
Avatar billede el_gnu Nybegynder
08. januar 2002 - 18:14 #4
mosquito => du har da fået rimelig gode karakterer (20,30,50) ;-P
Avatar billede hbbd Nybegynder
08. januar 2002 - 18:49 #5
Nej jeg ved ikke antallet af karaktere på forhånd. Da der skulle kunne tilføjes og fjerns karakter løbende..
Avatar billede greybeard Nybegynder
08. januar 2002 - 19:52 #6
Forudsat at din liste indeholder wrapped integers

    public double gennemsnit(ArrayList list) {
        double sum = 0;
        for ( int i = 0 ; i < list.size() ; i++ ) {
            sum += ((Integer)(list.get(i))).intValue();
        }
        return( sum/list.size() );
    }
Avatar billede kirky Nybegynder
08. januar 2002 - 19:53 #7
greybeard => Er det ikke muligt at bruge metoden toArray på en list?
Avatar billede greybeard Nybegynder
08. januar 2002 - 20:00 #8
Jo, men for at gemme karakterene i en ArrayList skal de wrappes. Det vil de stadig være, hvis man efterfølgende bruger toArray(), og så er der ikke meget vundet.
Avatar billede hbbd Nybegynder
08. januar 2002 - 20:07 #9
greybeard => men hvordan wrapper man så objekterne? Er det komplekst at gøre?
Avatar billede greybeard Nybegynder
08. januar 2002 - 20:50 #10
import java.util.*;

public class Gennemsnit {
    static ArrayList list =  new ArrayList();
   
    public static void main( String[] argv ){
        list.add(new Integer(7));
        list.add(new Integer(9));
        list.add(new Integer(8));
        list.add(new Integer(11));
        list.add(new Integer(5));
        list.add(new Integer(10));
        list.add(new Integer(7));
        list.add(new Integer(6));
        System.out.println( new Gennemsnit().gennemsnit(list) );
    }
   
    public double gennemsnit(ArrayList list) {
        double sum = 0;
        for ( int i = 0 ; i < list.size() ; i++ ) {
            sum += ((Integer)(list.get(i))).intValue();
        }
        return( sum/list.size() );
    }
}
Avatar billede disky Nybegynder
09. januar 2002 - 08:37 #11
greybeard:

Du kan da bare regne på Double som er et objekt så er det ikke noget problem.




Forresten er det en god ting at bruge en Iterator til at gå igennem en Collection istedet for en for løkke. Man kan ligeså godt bruge den funktionalitet der er lavet til formålet.
Avatar billede greybeard Nybegynder
09. januar 2002 - 08:49 #12
disky >> Hvad angår Iteratoren er jeg da enig, men jeg finder ikke væsentligt, sålænge det ikke er en flertrådet app.

Den med at regne på Double som objekt må du forklare nærmere. Så vidt jeg kan se er der ikke metoder til arimetik i wrapperklasserne??
Avatar billede disky Nybegynder
09. januar 2002 - 09:13 #13
greybeard:

Du har selvfølgelig helt ret med Double, jeg er ikke vågen endnu.

Men hvorfor man kun skal bruge iterator i en flertrådet app. må du gerne lige forklare.

Så vidt jeg kan se er den ikke Synchronized.

At Iterator så bagved går ca. det samme som en for løkke, så synes jeg det er bedre at anvende de medbragte metoder. Men det er smag og behag.
Avatar billede greybeard Nybegynder
09. januar 2002 - 09:36 #14
Så vidt jeg husker er kaster Iteratoren en Exception, hvis der ændres i de bagved liggende data.
D.v.s. den beskytter ikke mod fejl, men den sørger for at de opdages, så der ikke kommer inkonsistente data.

Jeg siger heller ikke at man kun skal bruge den ved flertrådede apps, kun at jeg er tilbøjelig til at vælge den nemmeste metode - mindre tastearbejde og mindre overhead - når jeg ikke kan se en direkte gevinst.
Jeg er doven af natur, og jeg dyrker det:-))
Avatar billede disky Nybegynder
09. januar 2002 - 09:41 #15
hmm, det kan jeg nu ikke lige finde i API\'en at den skulle gøre.

Det er forresten også en ikke pæn måde at opdage tråd problemmer på, Synchronize ville nok være noget bedre, så der ganske enkelt ikke sker sådanne ting.

Hehe, jeg synes nu Iterator er nemmere end for løkken :)

En helt anden ting hvis man bruger en for løkke skulle man tage og finde ud af .size() før man laver løkken, ellers skal den beregne størrelsen for hvert gennemløb, og det giver dårlig performance.
Avatar billede greybeard Nybegynder
09. januar 2002 - 09:48 #16
Hvis du har ret i at den finder size() for hvert gennemløb, så har du afgjort ret.

Men hvis du kigger på http://www.eksperten.dk/spm/155294
så er der noget der tyder på at compileren gør arbejdet for dig.
Avatar billede disky Nybegynder
09. januar 2002 - 09:54 #17
Compileren kan under ingen omstændigheder gøre det, måske kan JVM\'en hvilket jeg tvivler på.

For hvad hvis size() ændrer sig, JVM\'en kan ikke bare gætte sig til om det sker eller ej.

I følge et glimrende foredrag på JavaOne sidste år, er det en vigtig ting at flytte den ud hvis man ved der ikke ændres på size under gennemløbet af for løkken.
Avatar billede greybeard Nybegynder
09. januar 2002 - 11:58 #18
Du har ret. Det skal jeg have i baghovedet fremover.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis