Avatar billede jespersahner Nybegynder
02. april 2006 - 17:37 Der er 12 kommentarer og
1 løsning

Collections.sort() og generics

Jeg er i tvivl om anvendelsen af f.eks. Collections.sort() og generics.

Eks.:
String[] x={"dig","med","Hej"};
List<String> x2=Arrays.asList(x);
Collections.sort(x2);

Dette kompilerer fint.

Men hvad så med:
int[] x={3,2,1};
List x2=Arrays.asList(x);
Collections.sort(x2);

Hvordan benyttes generics her? List<int[]> giver kompilerings-fejl i Collections.sort(x2).
Avatar billede arne_v Ekspert
02. april 2006 - 18:03 #1
List<int>

formoder jeg
Avatar billede arne_v Ekspert
02. april 2006 - 18:03 #2
List erstatter jo []
Avatar billede arne_v Ekspert
02. april 2006 - 18:05 #3
List<Integer>

måske - jeg kan ikke huske om den selv boxer/unboxer her
Avatar billede arne_v Ekspert
02. april 2006 - 18:12 #4
hm - jeg prøvede lige - asList driller så

        List<Integer> x2 = new ArrayList<Integer>();
        for(int i = 0; i < x.length; i++) x2.add(x[i]);

virker, men er måske ikke så elegant
Avatar billede jespersahner Nybegynder
02. april 2006 - 18:29 #5
->arne_v: Nej, jeg mente faktisk List<int[]>. Bruger man denne, kompilerer flg. fint:
int[] x={3,2,1};
List<int[]> x2=Arrays.asList(x);

Men
Collections.sort(x2);
- virker så ikke.

Umiddelbart har du jo ret i, at List<int> jo er parallelt til List<String>, men "int" er jo ikke en objekt-type, og flg. kompilerer ikke:
List<int> x2=Arrays.asList(x);

Er det ikke lidt underligt, at List<int[]> kompilerer, men at Collections.sort() ikke virker efterfølgende?
Avatar billede arne_v Ekspert
02. april 2006 - 18:41 #6
int[] x={3,2,1};
List<int[]> x2=Arrays.asList(x);

laver en list med et element af typen int[]

int[] elementer kan ikke sorteres
Avatar billede arne_v Ekspert
02. april 2006 - 18:41 #7
som jeg skrev skal du brige List<Integer> og det er bare besværligt at få arrayet
over i den
Avatar billede mwl Nybegynder
02. april 2006 - 20:00 #8
Har du brug for at det er en liste? For på den måde du gør det, konverterer du et array til en liste,  og videre til et Array i sorteringen.
Hvis det er muligt at sorte array'et før du laver det til en liste, er det klart optimalt.
Avatar billede snoop_one Nybegynder
04. april 2006 - 16:23 #9
Det er fordi collection frameworket er bygget op omkring objekter.
Så du burde kunne skrive følgende,

Integer[] x={3,2,1};
List<Integer> x2= Arrays.asList(x);
Collections.sort(x2);

Jeg håber, at det giver mere mening.
Avatar billede snoop_one Nybegynder
04. april 2006 - 16:25 #10
Jeg har liget testet ovenstående og det ser ud til at virke.
Avatar billede jespersahner Nybegynder
04. april 2006 - 18:39 #11
->snoop_one: Enig. Dit eks. vil selvfølgelig virke, da det er helt parallelt til String-varianten, og du udnytter så, at Integer er objekt-wrapper udgaven af int.

Mht. objekter og ikke-objekter er int jo en simpel type, men int[] er et objekt, og
List<int[]> x2=Arrays.asList(x);
- kompilerer fint.

Men igen:
Collections.sort(x2);
- virker så bare ikke.

Umiddelbart er det lidt underligt, at man kan lave et List-objekt, her List<int[]>, hvor Collections.sort() ikke efterfølgende kan kompilere (sort() tager jo her et List-objekt som argument), men forklaringen er jo, som Arne skriver, at int[] ikke kan sorteres, og det opdages allerede under kompileringen, hvor man vel typisk først vil få en fejl under eksekvering, hvis elementerne i List-objektet ikke er comparable.

Altså noget med, at
Integer[] i1={1,2,3};
i1[0].compareTo(i1[1]);
- giver mening, da hvert element er af type Integer, som er comparable - mens
int[] i1={1,2,3};
i1[0].compareTo(i1[1]);
- ikke dur, da elementerne er int's.

Jeg håber ikke, at diskussionen er blevet FOR akademisk eller for vrøvlet herfra for den sags skyld :-)
Avatar billede jespersahner Nybegynder
04. april 2006 - 18:40 #12
Smid gerne et svar en af jer.
Avatar billede snoop_one Nybegynder
05. april 2006 - 10:18 #13
Svar :)

Men husk også lige på, at du sortere arrays dvs. x2.getSize() giver 1, så det giver heller ikke meget mening at sortere et element ;)
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