Räkna bokstäver i textfil i JAVA.

Permalänk
Medlem

Räkna bokstäver i textfil i JAVA.

Tjena. Ska göra ett program där jag får in en textfil (hårdkodat atm men vill bara få det att fungera) och sedan ska räkna hur många bokstäver det finns av varje sort.

Detta är vad jag åstadkommit hittils:

public class Chars { static char[] alfabet = {'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','å','ä','ö'}; public static void fileToString(File f) throws FileNotFoundException{ StringBuilder text = new StringBuilder(); Scanner s = new Scanner(f); int[] values = new int[29]; while(s.hasNext() == true){ text.append(s.next()); } for(int i=0; i == 28; i++){ char c = alfabet[i]; for(int j = 0; j == text.length(); j++){ char c2 = text.charAt(j); if( c2 == c ){ values[i]++; } } } for(int k = 0; k < 29; k++){ System.out.println(alfabet[k] +" "+values[k]); } } public static void main(String[] args) throws FileNotFoundException{ fileToString(new File("C:/Users/Erik/Desktop/text.txt"));

Jag får utskriften

a 0
b 0
c 0
...

trots att jag inte har en tom textfil!

Uppdateras inte values[]? varför i så fall? Är mina for-loopar felkodade?

Permalänk
Medlem

Dina loopar ser inte rätta ut, kan inte kontrollera det just nu men prova sätta:

for(int i=0; i < 29; i++){ char c = alfabet[i]; for(int j = 0; j < text.length(); j++){ char c2 = text.charAt(j); if( c2 == c ){ values[i]++; } } }

Du hade satt att första loopen bara skulle köras när i var exakt 28, inte fram till och med 28. Samma sak med andra.

Visa signatur

P6T SE - i7 930 @ 4GHz - 12GB XMS3 1600 MHz - Unlocked HD6950 CF @ 900/1325 - X25-V 40GB x2 RAID 0 - 2 TB Samsung F3 - Tesla 1000w - Define r2

450D | 50/1.8 II | 20/1.8 | 18-55 3.5/5.6 IS
Carlssonmedia.se

Permalänk
Medlem

Varför inte använda en hashmap med bokstav som nyckel och värde som antal?
Du slipper då hårdkoda vilka bokstäver du kommer stöta på.

lite kod

HashMap<Character, Integer> characters = new HashMap<Character, Integer>();

sedan så kör du bara i loopen

Character letter = text.charAt(j);
Integer letterCount = characters.get(letter);
if(letterCount == null) letterCount = new Integer(0);
characters.put(letter, currentCount +1) // kommer inte ihåg hur kinkigt java är med Integer-klassen, ev får man plocka värdet ur klassen, addera och skapa ny klass(?)

API:t http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashMa...

Permalänk
Medlem
Skrivet av mYrAns:

Dina loopar ser inte rätta ut, kan inte kontrollera det just nu men prova sätta:

for(int i=0; i < 29; i++){ char c = alfabet[i]; for(int j = 0; j < text.length(); j++){ char c2 = text.charAt(j); if( c2 == c ){ values[i]++; } } }

Du hade satt att första loopen bara skulle köras när i var exakt 28, inte fram till och med 28. Samma sak med andra.

Jaaaaaa naturligtvis. verkar fungera nu. Hjärnsläpp där

Permalänk
Hedersmedlem

while(s.hasNext() == true){ text.append(s.next()); }}

Den kan du göra om en del. Dels är likhetsjämförelsen onödig då resultatet av hasNext() är av typ boolean.

Jag skulle nog också föredra sättet i #3. Det du itererar över inlästa strängen lika många gånger som antal tecken du söker efter (alfabetet). Säg att vi ska modifiera uppgiften lite. Du ska inte räknas a-ö (gemener) utan alla olika tecken som kan förekomma (inte använda scannern som skippar tecken heller). char är UTF-16 så dels behöver du göra en char[] med 65536 tecken (tror jag, om man räknar med att inlästa kan innehålla "non-printable" tecken). Sen behöver du iterera lika många gånger över den. Det blir en del jobb det.

Map<Character,Integer> varianten i #3 så itererar man bara en gång. Du får dock ingen garanterad alfabetisk ordning på utskriften ('a' kommer inte först och 'b' följer inte). Men det får man sortera.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG