2010-09-30 22 views
1

Ceci est tiré de la zone d'exercices du tutoriel de Sun, donc je suppose que c'est un devoir.Java: afficher le nombre de fois qu'une lettre apparaît dans une chaîne

Je sais comment utiliser une boucle for pour itérafer la chaîne, mais je souhaite apprendre des tableaux pendant que je suis là-bas et les stocker ainsi. Voilà ce que je suis arrivé à ce jour:

BufferedReader in = new BufferedReader(new FileReader("xanadu.txt")); 
int c; 
char letters[] = new char[27]; //26 + newline? 

while((c = in.read()) != -1){ 
    letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc.. 
} 

Maintenant, pour une raison quelconque (œuvres dans d'autres langues), il n'a pas jeté int c à char correctement, et il entre dans letters[110] ou quelque chose en ascii décimal à la place, bien sûr qui est hors limites de mon tableau.

De quelle façon devrais-je m'attaquer à ce problème afin que je puisse avoir un bon index de caractères?

Répondre

3

Eh bien, tout d'abord, System.out.println((int) 'A'); ne vous donnera pas 0 ou 1, il vous donnera 65, de sorte que vous devriez au moins faire letters[(char) c - 'A'] += 1.

Pourtant, vous avez seulement considéré 27 lettres, qui ne comprend que des minuscules? ou en majuscules? sans espaces? et ainsi de suite ...

Vous voulez sans doute faire quelque chose comme

Map<Character, Integer> counts = new HashMap<Character, Integer>(); 

BufferedReader in = new BufferedReader(new FileReader("data.txt")); 
int c; 
while((c = in.read()) != -1) { 
    int count = counts.containsKey((char) c) ? counts.get((char) c) : 0; 
    counts.put((char) c, count + 1); 
} 
+0

Huh? Je veux dire que array [(char) 65] deviendra array ['A'], je n'ai pas votre commentaire. Pouvez-vous ne pas stocker les index de tableau sous forme de lettres dans Java? Est-ce toujours par défaut à ascii? – John

+0

Eh bien, les tableaux en Java ne sont pas comme les tableaux associatifs, par exemple PHP. C'est peut-être une carte que vous recherchez. – aioobe

+1

@John: 'array [(char) 65]' et array ['A'] 'seront en fait la même chose - ils accèderont au tableau index 65. Un tableau est un mappage de longueur fixe d'entiers à des valeurs, commençant à 0. –

2

vous pouvez utiliser la carte.

2

Je serais intrigué de savoir quelles langues ce fonctionne. Chaque langue que j'ai jamais utilisé convertira le caractère Valeurs aux entiers utilisant Unicode (comme Java) ou le codage de caractères natif, qui est généralement compatible ASCII. Quelle langue convertirait 'a' à 0 ​​ou 1?

Quoi qu'il en soit, la simple changer pour rendre votre travail de code dans toutes les situations seraient:

// char values in Java are in the range 0-65535. 
int letters[] = new int[65536]; 

Notez que j'ai changé le type du tableau de char à int, parce que chaque élément doit être un compte, pas un personnage.

Alternativement, vous pouvez laisser comme un tableau de taille 27 (de préférence en utilisant encore int bien) et avoir une sorte de fonction de mappage de char à int. Toutefois, pour tirer le meilleur parti de cet exercice, vous devriez vraiment comprendre pourquoi vous pensiez que le code fonctionnerait, et ce que cela signifie pour votre compréhension de Java. Vous attendiez-vous à ce qu'un tableau agisse comme une carte clé/valeur arbitraire?

+0

@ "Je serais intrigué de savoir dans quelles langues cela fonctionne": J'ai d'abord appris le PHP, que je suppose avoir de faux tableaux multidimensionnels (je pense, ce n'est rien comme Perl ou C), j'étais confus que ma pensée chose de travail n'a pas. Beaucoup d'apprendre à changer mes habitudes. : P – John

+0

Stocker par valeur unicode est en fait une façon agréable, car il s'agit d'un nombre d'occurrences de caractères, pas un "compte de l'alphabet américain" plutôt .. Merci. – John

+0

@John: Je pense que ce n'est pas tant des tableaux multidimensionnels que des tableaux * associatifs *, connus sous le nom de cartes ou de dictionnaires ailleurs. Fondamentalement, un concept très différent d'un tableau Java/C/C#/etc :( –

1

Je ne pense pas que Java supporte ce genre d'indexation de tableau (comme le fait PHP). Seulement des nombres et seulement commençant à zéro jusqu'à la taille-1.

Donc un tableau n'est pas une bonne solution ici. Comme la forêt suggère que vous devrez utiliser un Map, comme un Hashmap.

1

Pourquoi ne pas vous faire des lettres comme un tableau d'entiers et d'autre part Je pense que (les lettres [(char) c]) renverrait la valeur ASCII, et donc probablement quelque chose comme

lettres [c-97 ] + = 1 ferait l'affaire

1

letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..

comme je l'obtiens, vous voulez que votre tableau de lettres soit comme cette lettres [ 'a'] = (une valeur) lettres [ 'b'] = (une certaine valeur)

En Java, les tableaux peuvent être indexés uniquement par des entiers, ou dans d'autres types de données (ils seront promus « int ») Java Language Spec

le plus proche, vous pouvez utiliser est une carte - HashMap ou TreeMap

Questions connexes