06. december 2003 - 13:05Der er
28 kommentarer og 1 løsning
String-liste til Int-liste.
Hvis jeg denne liste i SML: ["7,1,5", "8,-2,1", "0,3,4", "0,5,-1", "10,5,3", "7,-8,1", "-5,8,0", "4,5,6"] hvordan får jeg så lavet den om til en liste som indeholder helttal (int) så jeg kan arbejde med tallene. Skal nok gøres så det bliver en liste af lister, måske!
følgende skal bruges funktion til at explode en string funktion til at rense kommaer ud af den explodede string og samtidig gøre hvert char til sin egen string funktion til at lave string om til int option for derefter at finde option funktion til at køre ovenstående..
(* Danner en Char liste fra en String *) fun StringToCharListe x = explode x
(* Fjerner kommaer samt sætter minuset sammet med Char´en for tallet *) fun OnlyInt x = let fun RemoveComma [] = [] | RemoveComma (y::ys) = if y = #"," then RemoveComma ys else y::RemoveComma ys fun PasteMinus [] = [] | PasteMinus (z::zs) = if z = #"~" then (implode[z,hd zs])::PasteMinus (tl zs) else (implode [z])::PasteMinus zs in PasteMinus(RemoveComma x) end
(* Danner en int liste af en string indeholdende tre int sepereret med to kommaer *) fun ExtractIntFromString x = [valOf(Int.fromString(List.nth(x,0))),valOf(Int.fromString(List.nth(x,1))),valOf(Int.fromString(List.nth(x,2)))]
(* Danner en int liste fra en liste af strings som beskrevet ovenfor *) fun IntListeFromStringListe x = let fun GetInt [] = [] | GetInt (y::ys) = (ExtractIntFromString(OnlyInt(StringToCharListe y)))::GetInt ys in GetInt x end
val IntListe = IntListeFromStringListe stringListe ;
Jeg har lavet en lille fejl. Uddata er: "[0.0,5.0,5.0][0.0,-5.0,5.0][0.0,-5.0,-5.0][0.0,5.0,-5.0][10.0,5.0,5.0][10.0,-5.0,5.0][10.0,-5.0,-5.0][10.0,5.0,-5.0]" : string
Så det endelige data skal nok være en liste af lister med tal af typen Real i. Hjælper det eller skal vi stadig snakke over mail?
ahh jo så er det jo en forskel - men jeg må desværre springe fra her, da det mistænkelig meget minder om noget jeg har eksamens opgave i nu! og vil ikke risikere at få at vide jeg har lavet eksamens snyd :o( .... sorry men held og lykke
(* Danner en Char liste fra en String *) fun StringToCharListe x = explode x
(* Fjerner kommaer samt sætter minuset sammet med Char´en for tallet *) fun OnlyInt x = let fun RemoveComma [] = [] | RemoveComma (y::ys) = if y = #"," then RemoveComma ys else y::RemoveComma ys fun PasteMinus [] = [] | PasteMinus (z::zs) = if z = #"~" then (implode[z,hd zs])::PasteMinus (tl zs) else (implode [z])::PasteMinus zs in PasteMinus(RemoveComma x) end
(* Danner en int liste af en string indeholdende tre int sepereret med to kommaer *) fun ExtractIntFromString x = [valOf(Real.fromString(List.nth(x,0))),valOf(Real.fromString(List.nth(x,1))),valOf(Real.fromString(List.nth(x,2)))]
(* Danner en int liste fra en liste af strings som beskrevet ovenfor *) fun IntListeFromStringListe x = let fun GetInt [] = [] | GetInt (y::ys) = (ExtractIntFromString(OnlyInt(StringToCharListe y)))::GetInt ys in GetInt x end
Ja sorry - men vil ikke risikere noget Der står jo højt at man ikke må udveksle program dele men kun må diskutere... Sååå ved ikke rigtig. Vil helt være på den sikre side
Det er samme koncept som det øverste: Hvis du har en streng så explode den Kør derefter rekursivt på elementerne (som er chars) Rekursionen går ud på at du starter fra venstre og drøner mød højre imens du undersøger dine Chars (enten som if then else - eller som case) Fra du når et #"[" til du når et #"]" skal alt imellem implodes og sættes foran et nyt kald til halen Således får streng om til en liste af strenge
fun listeFraStreng x =let val y = explode x fun fjernklamme []=[] | fjernklamme (z::zs)=if z=#"[" then fjernklamme zs else z::fjerklamme zs fun danliste []=[] | danliste (q::qs)=if q<>#"]" then q::danliste qs else danliste qs fun rettil [] =[] | rettil (w::ws)= (implode w)::rettil ws in rettil(danliste(fjernklamme x) end
det er muligt den ikke gør det helt korrekt Men ideen er vel at hvis [ og ] er overflødige - så først fjerne den ene Dernæst danne en liste som skilles af den anden klamme og så huske at implode det rigtige sted i programmet så der ikke kommer en liste med kun et stort element
fun listeFraStreng x = let val y = explode x fun fjernklamme [] = [] | fjernklamme(z :: zs) = if z = #"[" then fjernklamme zs else z :: fjerklamme zs fun danliste [] = [] | danliste(q :: qs) = if q <> #"]" then q :: danliste qs else danliste qs fun rettil [] = [] | rettil(w :: ws) = (implode w) :: rettil ws in rettil(danliste(fjernklamme y) end;
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.