Gå til innhold

[Løst] Hvordan telle opp antall forekomster av array indekser?


Anbefalte innlegg

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 av Defo
Lenke til kommentar
Videoannonse
Annonse

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 av stelar7
Lenke til kommentar

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 av Djn
  • Liker 1
Lenke til kommentar

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

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

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];
	}
    }
}

  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...