Какие строковые методы мне понадобятся, чтобы они выглядели на Javaish? - PullRequest
1 голос
/ 22 февраля 2011

Я программист на C, а не Java-программист.Я не знаю, какие методы доступны в Java, а какие нет.Я боролся с этим часами.

Это часть большой программы.У меня есть строка, мне нужно, какие гласные, согласные и цифры присутствуют в строке.

string s = "asdf";
char[] charArr = s.toLowerCase().toCharArray();
        for(int i=0;i<s.length();i++)
        {
            if( charArr[i] == 'a' || charArr[i] == 'e' || charArr[i] == 'i' || charArr[i] == 'o' || charArr[i] == 'u')
            {
                // stuff here           
            }
        }

Но это не похоже на код Java.Я все еще думаю о языке C. Я хочу, чтобы он выглядел как Java.Есть ли какие-либо методы, которые я могу использовать?

Ответы [ 8 ]

5 голосов
/ 22 февраля 2011

Вот одна возможность, которая вполне читабельна ...: -)

По крайней мере, для удобства чтения вы должны извлечь if-тест как методы, такие как isVowel, isConsonant.

public class TestStringIteration {

    private static final HashSet<Character> VOWELS = new HashSet<Character>(
            Arrays.asList('a', 'e', 'i', 'o', 'u'));
    private static final HashSet<Character> CONSONANTS = new HashSet<Character>(
            Arrays.asList('b', 'c')); // Add more letters :-)

    void stringTest(String s) {
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                // This is a digit
            } else if (isVowel(c)) {
                // This is a vowel
            } else if(isConsonant(c)) {
                // This is a consonant
            }
        }
    }


    private static boolean isVowel(char c) {
        return VOWELS.contains(c);
    }

    private static boolean isConsonant(char c) {
        return CONSONANTS.contains(c);
    }
}

РЕДАКТИРОВАТЬ: сделано isVowel и isConsonant статическое

3 голосов
/ 22 февраля 2011

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

for(char c : s.toCharArray()){
    if(c == 'a' || c == 'e' || ...){
        // stuff
    }
}
2 голосов
/ 22 февраля 2011

В этом случае код Java не будет сильно отличаться от C

private enum CharType {VOWEL, CONSONANT, NUMBER, OTHER;}

static CharType getType(final char ch) {

if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') {
switch (ch) {
case 'a': case 'A':
case 'e': case 'E':
case 'i': case 'I':
case 'o': case 'O':
case 'u': case 'U':
  return CharType.VOWEL;
default:
  return CharType.CONSONANT;
}
} else if (ch >= '0' && ch <= '9') { 
  return CharType.NUMBER;
}

  return CharType.OTHER;

}
1 голос
/ 22 февраля 2011

как Javaish как возможно ; -)

String s = "asdf".toLowerCase();
for(int i=0;i<s.length();i++)
{
    char c = s.charAt(i);
    if(c ==  'a' || c ==  'e' || c ==  'i' || c ==  'o' || c ==  'u')
    {
            // stuff here           
    }
}

Вы переписываете код C на Java?

0 голосов
/ 22 февраля 2011

Если вы хотите использовать Java API, чтобы он выглядел более javaish, вы можете попробовать подход с регулярными выражениями:

String input = "foo bar fun for vowels";
Pattern p = Pattern.compile("[aAeEiIoOuU]");
Matcher m = p.matcher(input);

while ( m.find() ) {
    // stuff here with my example output
    System.out.println("Index: " + m.start() + " vowel was: " + input.substring(m.start(), m.end()));
}

Но в вашем коде нет ничего плохого.И ваш более производительный, чем мой.Это только для внешности.

0 голосов
/ 22 февраля 2011

что заставляет вас думать, что ваш код не Java?это так и будет более эффективно, чем повторное использование String.charAt.Преобразование строки в char[] - хорошая идея, если вы собираетесь обращаться к символам в произвольных позициях, при условии, что строка не слишком длинная.

, если вы хотите получить доступ к отдельным символам в последовательности, однакоЕсть лучшие решения, такие как StringReader.

Я бы также предложил немного разделить вашу логику.например, создайте метод isVowel(char c).

0 голосов
/ 22 февраля 2011

Абсолютно нет причин использовать цикл for для такого рода проблем:

String s = "asdf";
for(char c : s.toLowerCase()) {
    if( c ==  'a' || c ==  'e' || c ==  'i' || c ==  'o' || c ==  'u') {
            // stuff here           
    }
}
0 голосов
/ 22 февраля 2011

Всего пара указателей (без каламбура: D) когтями.Обычно в Java мы склонны работать с String s, а не с char[], мы широко используем методы, доступные в классе String .В служебных классах есть и другие полезные методы, такие как Apache Commons Lang lib http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...