21. april 2006 - 08:54Der er
10 kommentarer og 1 løsning
Bruge en variabel som "nævner" i et array
Hej eksperter.
Jeg skal lave et program, der går en tekst igennem, og går en tekst igennem, og tæller hvor mange af hvert bogstav/tegn der findes i teksten, og efter skriver resultatet ud til brugeren.
Jeg havde tænkt mig at lave det som et array, som bogstaver[a][x] hvor x er antal tegn. Jeg har en del kendskab til php, hvor jeg ved at man kan tilgå et array med en variabel, f.eks. $array[$b]++; Er det muligt at lave noget lignende i C#?
Derudover vil jeg gerne vide om det er muligt at køre et array igennem, og udskrive alle værdierne på skærmen, så de kommet til at stå med Bogstav: tal, f.eks. A: 22. Er der nogen der kan fortælle mig hvordan man gør dette?
hmm det ikke noget jeg har prøvet at lave og jeg kan ikke umiddelbart finde nogen som har lavet. Er formålet kun at finde ud af hvor mange af hvert bogstav der findes i en tekst ?
Dictionary <char, int> hyppigheder = new Dictionary<char,int> ();
og når du så støder på et A: hyppigheder ['A']++;
eller med en char variabel: hyppigheder [variabel]++;
Arrays i C# kan kun indekseres med ints.
Nu kan en char castes til int så du kunne principielt lave et array af længde svarende til alle mulige chars (og så skrive noget ala sArr [(int) A]++), men det er dumt af to grunde: * Hvis der kun optræder Xer i din tekst har du fylder array ligeså meget som hvis alle bogstaver optræder lige hyppigt. * I min verden er det lidt skummelt at lave char -> cast, men på den anden side understøtter platformen det.
Der er dog en enkelt fordel ved at bruge array'et fremfor Dictionary og det er at det går lidt hurtigere. Men jeg tvivler på at det kan lade sig gøre. Og i alle tilfælde er det bedre at starte med den pæneste løsning og så hvis der viser sig perf problemer hacke sig igennem.
Jeg har bikset en lille consol applikation sammen hvor du kan se hvordan du kan gøre:
using System; using System.Collections.Generic; using System.Text;
namespace Forekomst { class Program { static void Main(string[] args) { //Tæller bruges til at holde styr på indekseringen ved gennemløb af arrayet. int taeller = 0;
char[] letters = new char[28]; // 28 er antallet af pladser i arrayet
//Her er alfabetet den tester ud fra. Du kan også putte , og . osv ind i strengen //men husk at rette letters array i størrelsen så der er plads! string alfabet = "ABCDEFGHIJKLMNOPQRSTUVXYZÆØÅ";
foreach (char karakter in alfabet) { letters[taeller] = karakter; taeller += 1; }
//Vi skal bruge taeller igen så vi nulstiller den lige taeller = 0;
int[] forekomster = new int[28];
string text1 = "Hej med dig hvordan går det så. Det her er blot en test tekst."; string textFormateret = text1.ToUpper();
foreach (char c in textFormateret) { foreach (char c2 in letters) { if (c == c2) { forekomster[taeller] += 1; } taeller += 1; } taeller = 0; }
TAk for alle svarene. Takket være Tuxic's forklaring omkring Dictionary's fandt jeg en brugbar løsning. Jeg kan uploade programmet og sourcen hvis nogle ønsker at se det færdige resultat.
Det er altid en fornøjelse af hjælpe. Najs at du fik det til at virke!
Synes godt om
Ny brugerNybegynder
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.