2014-09-06 4 views
-1

Привет, ребята У меня проблема с моим кодом, я хочу получить наиболее частое письмо в строке. Это то, что я пытался до сих пор:Подсчитайте наиболее часто встречающиеся буквы/строки в строке Java

String s = "Sashimi"; 
    int highestFreq = 0; 
    char mostFreqChar = ' '; 
    for (int i = 0; i < s.length(); i++) 
     { 

      char x = s.charAt(i); 
      int c = 0; 
      for (int j = s.indexOf(x); j != -1; j = s.indexOf(x, j + 1)) 
      { 
       c++; 
      } 
      if (c > highestFreq) 
      { 
       highestFreq = c; 
       mostFreqChar = x; 
      } 
     } 
     System.out.println("Most frequent character in " + s + " is " + mostFreqChar); 
    } 

Однако, это только показывает букву «я», но в моем примере выше струны SASHIMI. Итак, есть две наиболее часто встречающиеся буквы: i, s и I. Что не так с моим кодом? Любая помощь будет оценена. Благодарю.

+0

Рассмотрим 'Map ' – user2864740

+0

@ user2864740 вы можете сделать несколько образцов этого? Я благодарю новичка. –

+0

См. Http://stackoverflow.com/questions/4327226/highest-frequency-of-letters-in-each-line-of-file-core-java-programming?rq=1 и т. Д. - используя массив в " дублирующий "вопрос - аналогичный принцип; сначала создайте ведра счетчиков (например, character-> count), а затем найдите ключ (ы) с наивысшим счетчиком. – user2864740

ответ

1

Вы позволили установить char mostFreqChar, а не увеличивать. Поэтому mostFreqChar может быть только одним элементом. Кроме того, если вы хотите, чтобы он отображал несколько символов как наиболее часто, вы должны использовать строку, массив символов или вектор char. Вам необходимо изменить код, чтобы у вас не только были: mostFreqChar = x; , потому что, если у вас есть только строка выше, mostFreqChar может только когда-либо равняться последнему символу X, назначенному ей.

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

Я бы использовал что-то подобное для C++. Примечание. Я не отлаживал, и в C++ строки рассматриваются как массивы символов.

#include <string> 
using namespace std; 

bool contains_(string str, char Contained_) 
{ 
    for(int i = 0; i < str.size(); i++) 
    { 
     if (str[i] == Contained_) return true; 
    } 
    return false; 
} 


int main() 
{ 
    string s = "Sasami"; 
    string Used_characters = ""; 
    int Frequency_list[s.size()]; 

    for (int i = 0; i < s.size(); i++) //initializes the aray 
    { 
     Frequency_list[i] = 0; 
    } 

    for(int i = 0; i < s.size(); i++) 
    { 
     if (contains_(Used_characters, s[i])) //makes sure the program 
     //doesn't return 2 of the same character 
     { 
      for(int a = 0; a < s.size(); a++) 
      { 
       if (s[i] == s[a]) Frequency_list[i] ++; 
      } 
     } 
    } 

    //Now find which has the highest frequency, and match it to the string 

    char Max_char[s.size()]; 
    for (int i = 0; i < s.size(); i++) //initializes the aray 
    { 
     Max_char[i] = '0'; //I choose 0 because it is not a letter 
    } 

    int Max_freq = 0; 
    int num_of_max_freq = 0; 
    for(int i = 0; i < s.size(); i++) 
    { 
     if (Frequency_list[i] > Max_freq) 
     { 
      Max_freq = Frequency_list[i]; 
      for (int i = 0; i < s.size(); i++) //Whipes the array clear 
      { 
       Max_char[i] = '0'; //I choose 0 because it is not a letter 
      } 
      num_of_max_freq = 1; 
      Max_char[0] = s[i]; 
     } 
     else if (Frequency_list[i] == Max_freq) 
     { 
      Max_char[num_of_max_freq++] = s[i]; 
     } 
    } 
    //Now all your max_values are stored in the array Max_char 

} 
+0

Можете ли вы предоставить примерную реализацию этого? Я смущенно благодарен. –

+0

Конечно, дайте мне несколько минут, чтобы сделать быстрый код. Обратите внимание, что я обычно использую C++, поэтому у меня нет Java-редактора. Однако код должен работать. –

1

Проблема заключается в том, что в программировании, капитал S и строчные буквы s два разных персонажа, так что отображение i должен быть ожидаемый результат. Но если вы хотите перечислить несколько символов, вы можете сделать это:

String s = "Sashimi"; 
int highestFreq = 0; 
List<Character> mostFrequentChars = ArrayList<>(); 
for (int i = 0; i < s.length(); i++) 
    { 

     char x = s.charAt(i); 
     int c = 0; 
     for (int j = s.indexOf(x); j != -1; j = s.indexOf(x, j + 1)) 
     { 
      c++; 
     } 
     if (c > highestFreq) 
     { 
      mostFrequentChars.removeAll(); 
      highestFreq = c; 
      mostFrequentChars.add(new Character(x)); 
     }else if (c == highestFreq){ 
      mostFrequentChars.add(new Character(x)); 
     } 
    } 
    System.out.print("Most frequent characters in " + s + " are "); 
    for (Character c:mostFrequentChars){ 
     System.out.print(c); 
    } 
    System.out.println(); 

}

+0

Я добавил код, чтобы он возвращал более одного символа. – DrOverbuild

+0

Просто дикая догадка, но я думаю, что код возвращает/печатает два символа 'i'. Если это действительно так, вы можете попытаться использовать 'Set' вместо' List'. – Tom

Смежные вопросы