2015-09-02 3 views
0

Так что я пытался сделать код, который подсчитывает количество слов в строке, которая была довольно простой. У меня возникают проблемы, когда я пытаюсь подсчитать количество уникальных символов в строке. Программа компилирует и запускает ее, не отображает число уникальных символов. Добавление System.out.println (countOfUniqueChars); ниже возврат не работает.Подсчет уникальных символов в строке

Вот код:

public class Uniquechar{ 
public static void main(String[] args) { 

    String s = "Jag vet inte vad jag heter idag"; 
    String[] parts = s.split(" "); 
    int wordcount = parts.length; 
    System.out.println("The number of words is" + wordcount); 

    countUniqueCharacters(s); 
} 

public static int countUniqueCharacters(String s) { 
    String lowerCase = s.toLowerCase(); 
    char characters[] = lowerCase.toCharArray(); 
    int countOfUniqueChars = s.length(); 
    for (int i = 0; i < characters.length; i++) { 
     if (i != lowerCase.indexOf(characters[i])) { 
      countOfUniqueChars--; 
     } 
    } 
    return countOfUniqueChars; 
} 
+0

Просто попробуйте ввести в 'SET' он будет принимать только уникальный характер. – SaviNuclear

ответ

0

Вы можете сделать System.out.println(countUniqueCharacters(s)); в основном методе, чтобы вывести возвращаемое значение вашего метода. После возврата вы не можете добавить больше кода. Я сделал это для вас, а вывод - 12, поэтому, похоже, что-то не так с вашим алгоритмом.

int uniqeCharsCount = countUniqueCharacters(s); 
    System.out.println("The number of uniqe chars is " + uniqeCharsCount); 

Выход: 12

Ваш алгоритм:

На самом деле вы проверяете каждый символ, если этот символ еще один раз в строке before. Но вы также должны проверить, присутствует ли символ в строке after текущего индекса. Вы можете это исправить, если вы измените, если условие if (i != lowerCase.indexOf(characters[i]) || i != lowerCase.lastIndexOf(characters[i]))

выход фиксированной версии: 3 (п, з, г)

+0

Хорошо 12 на самом деле прав. Возможно, я не понял, что я пытался сделать, но я пытался подсчитать количество уникальных символов в строке, будучи: j a g v e t i n v d h r Спасибо! – Ortbay

1

Просто распечатайте вызов метода, он выводит результат.

System.out.println(countUniqueCharacters(s)); 

Добавление System.out.println (countOfUniqueChars); ниже возврат не работает.

Это не сработает. Поскольку код после возврата не доступен. Возможно, вы можете сделать это перед return.

System.out.println(countOfUniqueChars); 
return countOfUniqueChars; 
2

Попробуйте это:

s = s.replace(" ", ""); // If you don't want to count space 
char[] chars = s.toCharArray(); 
Set<Character> uniqueChars = new HashSet<>(); 

for (char c : chars) { 
    uniqueChars.add(c); 
} 

System.out.println(c.size()); 
0

Я бы рекомендовал использовать Set сохранить только уников, затем подсчитать его размер, вместо того, чтобы итерации:

public static int countUniqueCharacters(String s) { 
    String lowerCase = s.toLowerCase(); 
    char characters[] = lowerCase.toCharArray(); 
    Set<Character> uniques = new HashSet<Character>(); 
    for (char c: characters) { 
     uniques.add(c); 
    } 
    return uniques.size(); 
} 
0
if (i != lowerCase.indexOf(characters[i])) { 
    countOfUniqueChars--; 
} 

Это неправильно. Строка lowerCase имеет нижний регистр, поэтому любые прописные буквы в символах [i] будут иметь индекс -1 в lowerCase (будет вычисляться как не уникальный символ). Вы можете исправить это, используя indexOf (lowerCase.charAt (i));

0

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

public static int countUniqueCharacters(String s) { 
    String lowerCase = s.toLowerCase(); 

    ///Get the first char of lowerCase 
    String firstChar = lowerCase.substring(0,1); 
    //Take off the first char 
    String subS = lowerCase.substring(1); 
    ///replace all chars equals to first char 
    String replacedSubS = subS.replace(firstChar, ""); 

    /// Now, call method again to calculate size 
    /// of the substring with first char 
    // replaced by blank char 
    return 1+countUniqueCharacters(replacedSubS); 
} 

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

0

Добавление System.out.println(countOfUniqueChars); ниже return не работает.

Ожидаемое поведение, так как return означает, что поток управления будет возвращен из метода для размещения вызова этого метода. Это означает, что код после return не будет выполнен, так что в ситуации, как

return countOfUniqueChars; 
System.out.println(countOfUniqueChars); 

System.out.println(countOfUniqueChars); будет мертвого кода.

Вы можете попробовать печати значения, прежде чем вернуть его как

System.out.println(countOfUniqueChars); 
return countOfUniqueChars; 

или просто распечатать возвращаемое значение в основном методе, как

int count = countUniqueCharacters(s); 
System.out.println(count); 

или с помощью этого Однострочника

System.out.println(countUniqueCharacters(s)); 

BTW с Java 8 ваша треска е может выглядеть

s.toLowerCase().chars().distinct().summaryStatistics().getCount() 

или если вы хотите, чтобы пропустить пробелы можно добавить

s.toLowerCase().replace(" ","").chars().distinct().summaryStatistics().getCount() 
Смежные вопросы