Member 13954890 Ответов: 1

Как подсчитать слова в строке и распечатать список, состоящий из каждого слова и их вхождений в порядке убывания( по их вхождениям)?


class Solution {
  static String[][] wordCountEngine(String document) {
    Hashtable ht=new Hashtable();
    String words[]=document.split(" ");  //split sentence to words
    int largestcount=0;
    String word;
    for(int i=0;i<words.length;i++)
    { word=words[i].toLowerCase();      // ignoring case-sensitive by converting all 
                                        //  to lowercase
    List<character> li=new ArrayList<character>();
    for (char ch:word.tocharArray())
      if(ch>='a' && ch<='z')
        li.add(ch);                   //ignoring special characters like '@'and digits 
                                      //and adding it to list
    String s="";
    for(char ch:li)
      s=s+ch;                        //words without special characters and digits
    if(s.length()<1)
      continue;
    int count=0;
     
       while(document.contains(s))        //while words present in given sentence
       {    
            document=document.substring(document.indexOf(s)+s.length(),document.length()-1);
            count++;
        }
    else 
      count=1;
    if(count>largestcount)
      largestcount=count;
    //ht.put(s,count);  
  }


Что я уже пробовал:

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

Пример
вход:
document = "Practice makes perfect. you'll only
                    get Perfect by practice. just practice!"

выход:
[ ["practice", "3"], ["perfect", "2"],
          ["makes", "1"], ["youll", "1"], ["only", "1"], 
          ["get", "1"], ["by", "1"], ["just", "1"] ]

1 Ответов

Рейтинг:
1

Richard MacCutchan

Использовать SortedMap (Java Platform SE 8 )[^] со словом, являющимся ключом, и счетом, являющимся значением. Если карта не содержит этого слова, добавьте его и установите его значение равным 1. Если карта действительно содержит ключ, то просто увеличьте его значение.


Member 13954890

публичный класс stringtowords
{ публичный статический хеш-таблицы в<строка, целое и GT; CountW(строка s,ss шнурует)
{
Hashtable<String,Integer> ht=новая хэш-таблица();
int count=1;
если(S.содержит(СС))
{
если(!ХТ.containsKey(СС))
{
ХТ.поставить(СС,прикинь);
}
еще
{ count=count+1;
}
}
возвращение ХТ;
}
public static void main(String args[])
{
Hashtable<String,Integer> hte=новая хэш-таблица();
Строка s="привет! мое имя@ это прагья";

Строку горе[]=С. сплит(" ");

для(строка w:wo)
{
Системы.из.код println(ж);
}
Строку слово;
for(int i=0;i<wo.length;i++)
{ word=wo[i].toLowerCase();

Список<символ&ГТ; ли=новый ArrayList и Л;характер&ГТ;();
ибо (char ch:слово.toCharArray())
если(ч&ГТ;='а' &&усилителя; ч&ЛТ;='з')
ли.добавить(ч);
Строка ss="";
для(char ch:li)
ss=ss+ch;
hte=CountW(s,ss);
Системы.из.код println(авш);
}
}
}
но для каждого слова он печатает только 1
Я не понимаю, куда я иду неправильно.

Richard MacCutchan

1. Вы используете хэш-таблицу, а не сортированную карту.
2. Вы разбиваете свои слова на символы по какой-то причине, не упомянутой в вашем вопросе.

Все, что вам нужно сделать с SortedMap, это сделать следующее:
- преобразуйте слово во все строчные буквы (если это необходимо).
- если lst уже содержит это слово, то добавьте 1 к значению.
- если в списке нет этого слова, то добавьте его как новую запись со счетом 1.
- повторите для всех слов.

Member 13954890

сэр, в чем разница между sortedmap и хэш-таблицей?

Member 13954890

публичный класс dhshk
{
публичный статический SortedMap в<строка, целое и GT; CountW(строка s,ss шнурует)
{
SortedMap в<строка,целое и GT; КЧ=новый древовидной диаграмме, в<строка,целое и GT;();
int count=1;
если(S.содержит(СС))
{
если(!ХТ.containsKey(СС))
{
ХТ.поставить(СС,прикинь);
}
еще
{ count=count+1;
}
}
возвращение ХТ;
}
public static void main(String args[])
{
SortedMap в<строка,целое и GT; авш=новые карты в<строка,целое и GT;();
Строка s="привет! мое имя@ это прагья";

Строку горе[]=С. сплит(" ");

для(строка w:wo)
{
Системы.из.код println(ж);
}
Строку слово;
for(int i=0;i<wo.length;i++)
{
word=wo[i].toLowerCase();

Список<символ&ГТ; ли=новый ArrayList и Л;характер&ГТ;();
ибо (char ch:слово.toCharArray())
если(ч&ГТ;='а' &&усилителя; ч&ЛТ;='з')
ли.добавить(ч);
Строка ss="";
для(char ch:li)
ss=ss+ch;
hte=CountW(s,ss);
Системы.из.код println(авш);
}
}
}
И все же я не получаю ответа.

Richard MacCutchan

Вы все еще разбиваете свои слова на списки символов, по какой-то неизвестной причине. Ваш метод CountW создает древовидную карту, опять же по какой-то неизвестной причине. Вы, кажется, создаете объекты ради их создания, а не по какой-либо полезной причине.

Member 13954890

Потому что я хочу, чтобы мои слова были без каких-либо специальных символов, таких как @ и no. Вот почему я разбиваю свои слова на символы, а затем удаляю из них все специальные символы и нет, а затем снова преобразую их в слова.