Defo Skrevet 30. september 2013 Del Skrevet 30. september 2013 (endret) Hei! Sliter litt med å bli klok på hvordan jeg skal få til denne oppgaven her... "Lag et program som leser inn en tekststreng fra brukeren. Programmet skal telle opp og skrive ut antall forekomster det i den innleste tekststrengen er av de forskjellige bokstavene i alfabetet, altså antall a-er, antall b-er, etc" Jeg har laget en char array med bokstavene i alfabetet, og tenker meg at jeg må bruke en eller flere for-løkker til å få telt opp antall forekomster av de forskjellige bokstavene. Men hvordan skal jeg gjøre dette? Å lage for-løkker og tellevariabel for hver enkelt bokstav blir vel alt for tungvindt til å være korrekt... Håper noen kan hjelpe Her er koden min hiitil: import javax.swing.JOptionPane; public class Tekststrengchar { public static void main(String[] args) { String innlestTekst = JOptionPane.showInputDialog("Skriv inn en tekststreng: "); char[] bokstaver = {'a','b','c','d','e','f','g','h','i','j','k', 'l','m','n','o','p','q','r','s','t','u','v','w','x','y', 'z','æ','ø','å'} for(int counter=0; counter < innlestTekst.length(); counter++) { } } } Endret 30. september 2013 av Defo Lenke til kommentar
stelar7 Skrevet 30. september 2013 Del Skrevet 30. september 2013 (endret) Virker som dette ganske lett kan løses med en HashMap... HashMap<Character, Integer> chars = new HashMap<Character, Integer>(); for (char c : innlestText.toCharArray()) { Integer count = chars.get(c); chars.put(c, (count==null) ? 1 : (count + 1)); } for (char c : chars.keySet()) { Integer count = chars.get(c); System.out.println(c + ": " + count); } Endret 30. september 2013 av stelar7 Lenke til kommentar
Djn Skrevet 30. september 2013 Del Skrevet 30. september 2013 (endret) Alternativt kan du utnytte at et enkelt-tegn (en char) kan castes til tall - for de laveste 127 tegnene blir det ASCII-verdien deres; jeg er ikke sikker på hva java gjør med tegnsett og slikt om det faller utenfor. Rent praktisk: Sett av en array av lengde 26. Gjør teksten uppercase, bruk toCharArray for å få en array av chars, og gå gjennom hver av dem. Sjekk om den er mellom A og Z , og hvis den er det kan du trekke fra 'A' (A - A er 0 , Z - A er 25) for å få hvilket felt i resultat-arrayet du skal øke med én. Gitt at det vil feile på ikke-engelske bokstaver og sikkert opptil flere andre spesialtilfeller, liker jeg hashmap-koden til stelar7 bedre. Om du likevel vil, blir det noe sånt som dette: String test = "Hei og test."; test = test.toUpperCase(); int[] countArray = new int[26]; for (char ch : test.toCharArray() ) { if (ch >= 'A' && ch <= 'Z') countArray[ch-'A']++; } for (char ch = 'A' ; ch <= 'Z'; ch++) { if (countArray[ch-'A'] == 0) continue; System.out.format("%c: %d\n", ch, countArray[ch-'A']); } Den ene positive tingen jeg kan si om den løsningen er at det vil bruke en lavere og mer forutsigbar mengde minne enn en hashmap, men det er temmelig irrelevant når det er så få nøkler som her. En tredje mulighet er å bruke en liste med bokstaver (som du har), og så, for hver bokstav: * tell hvor mange ganger den finnes i input-teksten * skriv det ut Problemet er at da må du gå gjennom input-teksten like mange ganger som du har bokstaver, i stedet for bare én. Det hadde sikkert gått fint med den teksten du skal teste dette på, men det virker unødvendig å bruke 29 ganger mer tid enn du må. Endret 30. september 2013 av Djn 1 Lenke til kommentar
Defo Skrevet 30. september 2013 Forfatter Del Skrevet 30. september 2013 Takk for svar Kunnskapsnivået mitt er ikke høyt nok enda til å skjønne skikkelig hvordan begge disse løsningene fungerer i praksis, så denne løsningen vil nok være best for meg å forsøke å utføre: En tredje mulighet er å bruke en liste med bokstaver (som du har), og så, for hver bokstav:* tell hvor mange ganger den finnes i input-teksten * skriv det ut Men hvordan gjøres dette i praksis? Lenke til kommentar
Persn Skrevet 30. september 2013 Del Skrevet 30. september 2013 Husk at String er en klasse som inneholder en tabell med char-variabler. Prøv en dobbel for-løkke, den første bør gå igjennom alfabetet, den andre bør, for hver bokstav i alfabetet, telle opp hvis Stringen på sin daværende plassering i løkken inneholder bokstaven. Når for-løkke nr 2 er ferdig så skriver den ut resultatet, og for-løkke nr 1 starte på nytt for neste boktav i alfabetet. Lenke til kommentar
Defo Skrevet 30. september 2013 Forfatter Del Skrevet 30. september 2013 Husk at String er en klasse som inneholder en tabell med char-variabler. Prøv en dobbel for-løkke, den første bør gå igjennom alfabetet, den andre bør, for hver bokstav i alfabetet, telle opp hvis Stringen på sin daværende plassering i løkken inneholder bokstaven. Når for-løkke nr 2 er ferdig så skriver den ut resultatet, og for-løkke nr 1 starte på nytt for neste boktav i alfabetet. Takk så mye! Ser ut som jeg har fått det til nå med følgende løkker: for(int counter = 0; counter < bokstaver.length; counter++ ) { char bokstav = bokstaver[counter]; for(int counter2 = 0; counter2 < innlestTekst.length(); counter2++) { if(bokstav == innlestTekst.charAt(counter2)) { ++antall[counter]; } } } 1 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå