2014-01-24 3 views
0

Хорошо, я считаю себя осведомленным об основах и некоторой передовой Java, но до сих пор не имею смелости приступить к программированию своих идей, которые у меня есть. Это простая программа, я придумал, что в основном выводит количество определенной буквы ваш текст (я думаю, что я сформулированное, что неправильно ...) это мой код:Простой и эффективный способ сделать это?

public class gene { 

public static void main(String[] args) { 

    String[] phrases = {"hello", "egg", "learning", "ferrero", "rocher", 
      "Horologe", "Twinling"}; 
    int a=0; 
    int b=0; 
    int c=0; 
    int d=0; 
    int e=0; 
    int f=0; 
    int g=0; 
    int h=0; 
    int i=0; 
    int j=0; 
    int k=0; 
    int l=0; 
    int m=0; 
    int n=0; 
    int o=0; 
    int p=0; 
    int q=0; 
    int r=0; 
    int s=0; 
    int t=0; 
    int u=0; 
    int v=0; 
    int w=0; 
    int x=0; 
    int y=0; 
    int z=0; 

    for(int ii =0; ii <phrases.length; ii++){ 
    char[] charphrases = phrases[ii].toCharArray(); 
    for(int iii = 0; iii<charphrases.length; iii++){ 
     switch(charphrases[iii]){ 
     case ('a'): 
      a++; 
     break;   
    case ('b'): 
     b++; 
    break; 
    case ('c'): 
     c++; 
    break; 
    case ('d'): 
     d++; 
    break; 
    case ('e'): 
     e++; 
    break; 
    case ('f'): 
     f++; 
    break; 
    case ('g'): 
     g++; 
    break; 
    case ('h'): 
     h++; 
    break; 
    case ('i'): 
     i++; 
    break; 
    case ('j'): 
     j++; 
    break; 
    case ('k'): 
     k++; 
    break; 
    case ('l'): 
     l++; 
    break; 
    case ('m'): 
     m++; 
    break; 
    case ('n'): 
     n++; 
    break; 
    case ('o'): 
     o++; 
    break; 
    case ('p'): 
     p++; 
    break; 
    case ('q'): 
     q++; 
    break; 
    case ('r'): 
     r++; 
    break; 
    case ('s'): 
     s++; 
    break; 
    case ('t'): 
     t++; 
    break; 
    case ('u'): 
     u++; 
    break; 
    case ('v'): 
     v++; 
    break; 
    case ('w'): 
     w++; 
    break; 
    case ('x'): 
     x++; 
    break; 
    case ('y'): 
     y++; 
    break; 
    case ('z'): 
     z++; 
    break; 
     } 
    } 
    } 

    System.out.println("A:" + a + "\n" + "B:" + b + "\n" +"C:" + c + "\n" +"D:" + d + "\n" +"E:" + e + "\n" +"F:" + f + "\n" +"G:" + g + "\n" +"H:" + h + "\n" +"I:" + i+ "\n" +"J:" + j + "\n" +"K:" + k + "\n" +"L:" + l + "\n" +"M:" + m + "\n" +"N:" + n + "\n" +"O:" + o + "\n" +"P:" + p + "\n" +"Q:" + q + "\n" +"R:" + r+ "\n" +"S:" + s + "\n" +"T:" + t + "\n" +"U:" + u + "\n" +"V:" + v + "\n" +"W:" + w + "\n" +"X:" + x + "\n" +"Y:" + y + "\n" +"Z:" + z + "\n" + z); 
    } 

}

Как вам может видеть, его ОЧЕНЬ долго для такой простой программы и, без сомнения, есть более короткий способ ее написать. Может кто-то сказать мне, где я могу сконденсировать программу, чтобы сделать ее более короткой и более эффективной.

+0

Исправьте свой титул , Он должен описать реальную проблему. – EJP

+3

Подробнее о [массивах] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html). Вы можете сделать это с помощью массива вместо 26 отдельных переменных. – Jesper

+1

Хорошее место для посещения может быть [http://codereview.stackexchange.com/](http://codereview.stackexchange.com/) здесь, ваш код получает обзор. :) –

ответ

1

У вас может быть 26-элементный массив вместо 26 переменных. Мы знаем, что каждый индекс из 0-25 будет представлять (0 - «A», 1 - «B», 2 - «C» и т. Д. ... Затем, чтобы увеличить эту букву, его индекс может быть найден путем преобразования char в целое число. (конверсия потребует от вас, чтобы иметь ссылку ASCII под руку, любой будет делать). Обучение конвертировать между гольцами и Интсом относительно прост до тех пор, как вы понимаете, необходимые коррекции.

6

Как насчет

int[] count = new int[26]; 

вы можете сделать

for(char c: string.toCharArray()) 
    count[c - 'a']++; 
+0

Что означает «a» в методе расширенного цикла? – Tloz

+1

@Tloz целочисленное значение 'a' вычитается из текущего символа (c) и, следовательно, обращается к правому индексу счетного массива, например. 'a' - 'a' = Index 0, 'b' - 'a' = 1 и т. д. – m13r

1

вы можете рассмотреть возможность использования Map. Map позволяет связать одну часть данных с другой, так что если вы можете сделать что-то подобное:

Map<Character, Integer> characterCount = new LinkedHashMap<>(); 

Integer currentCount = characterCount.get('a'); 
if(currentCount == null) { 
    currentCount = 0; 
} 
characterCount.put('a', currentCount++); 

Это немного wordier, чем использование массива, как другие предложили, но это гораздо более гибким, если вы больше не хотите использовать char где-то позже по дороге.

2

Вместо того, чтобы объявить 26 различных int переменных, объявить один int массив длины 26. Все элементы здесь автоматически инициализируются в 0.

int[] letterCounts = new int[26]; 

Тогда вместо 26 случаев, воспользоваться тем фактом, что числовые значения для букв находятся в цифровом порядке. Если вы вычтите из своего письма 'a', вы получите значение от 0 до 25, которое представляет нужный вам индекс. Тогда вы можете сказать:

letterCounts[charphrases[iii] - 'a']++; 

В зависимости от ваших потребностей, вы, возможно, придется обрабатывать другие символы отдельно, например, заглавные буквы, цифры и/или знаки препинания.

Затем вы можете перебрать содержимое вашего массива, добавив 'a', чтобы воспроизвести букву и напечатать соответствующий элемент массива.

0

Я сделал вам программу, используя Map. Проверьте это:

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) { 
     Map<Character, Integer> map = new HashMap<Character, Integer>(); 
     System.out.println(map); 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     for(char c : alphabet.toCharArray()) 
      map.put(c, 0); 
     addString("Hello World", map); 
     System.out.println(map); 
    } 

    public static void addString(String s, Map<Character, Integer> m){ 
     s = s.toLowerCase().replace(" ", ""); 
     for(char c : s.toCharArray()) 
      m.put(c, m.get(c) + 1); 
    } 
} 
+0

Что произойдет, если в вашей строке есть символ, например ü? – Jeffrey

+0

Все, что вам нужно сделать, это обновить 'alphabet', чтобы содержать символы, которые вы хотите записать. Но да, я должен был поставить попытку поймать или проверить, было ли значение на карте нулевым. – mjkaufer

0

Я улучшение mjkaufers ответа, и это то, что вы можете сделать, чтобы рассчитывать любые символы (включая UTF-8 и специальных символов):

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) { 
     Map<Character, Integer> map = new HashMap<Character, Integer>(); 
     countCharacters("Hello World", map); 
     System.out.println(map); 
    } 

    public static void countCharacters(String s, Map<Character, Integer> m) { 
     s = s.replace(" ", ""); // do not count spaces 

     // if you only want to count lower case characters: 
     // s = s.toLowerCase(); 

     for (char c : s.toCharArray()) { 
      int cnt = (m.get(c) == null) ? 0 : m.get(c); 
      m.put(c, cnt + 1); 
     } 
    } 
} 
Смежные вопросы