2011-01-10 4 views
1

Я пытаюсь найти наиболее повторяющееся слово в строке с этим кодом:Манипулирование Струны

public class Word 
{ 
    private String toWord; 
    private int Count; 

    public Word(int count, String word){ 
     toWord = word; 
     Count = count; 
    } 

    public static void main(String args[]){ 
     String str="my name is neo and my other name is also neo because I am neo"; 
     String []str1=str.split(" "); 
     Word w1=new Word(0,str1[0]); 
     LinkedList<Word> list = new LinkedList<Word>(); 
     list.add(w1); 
     ListIterator itr = list.listIterator(); 
     for(int i=1;i<str1.length;i++){ 
      while(itr.hasNext()){ 
       if(str1[i].equalsTO(????)); 
       else 
        list.add(new Word(0,str1[i])); 
      } 
     } 
    } 
} 

Как сравнить строки из массива строк str1 на строки, хранящихся в связанном списке, а затем как увеличить соответствующий счетчик.

Затем я напечатаю строку с наивысшим счетом, Я тоже не знаю, как это сделать.

+0

Какой язык вы используете? Отформатируйте свой код. Это домашнее задание? –

+0

Это домашнее задание? Что вы пробовали? Почему это не сработало? Более конкретно. – templatetypedef

+0

Я пытаюсь сравнить входную строку с одной в связанном списке, если она совпадает, я увеличиваю счет строки, мой вопрос заключается в том, как сравнить с строкой в ​​связанном списке. – NEO

ответ

0

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

Для каждого слова увеличивайте счетчик, если он уже находится в списке, или добавьте его в список, если это не так.

+0

Я знаю, как алгоритм, но как это сделать сравните, если строка находится в связанном списке или нет, посмотрите мой код – NEO

+0

Способ добавления каждого слова из строки в массив работает против вас, поскольку он может содержать дубликаты. Как я уже упоминал, добавьте каждое слово в список один за другим. Если слово уже находится в списке, то увеличивайте счет, а не добавляйте его снова. –

0

C#? Вы можете попытаться использовать LINQ GroupBy, а затем Count или Max - очень просто.

+0

Я использую java, и это не домашнее задание. Мне просто нужно привыкнуть к строковым операциям со связанным списком – NEO

+1

Ну, вы не указали никаких тегов, а основные структуры Java и C# совпадают. – Schultz9999

0

Использование Google Guava:

Multiset<String> words = HashMultiset.create(Splitter.on(" ").split(input)); 

Тогда

String topWord = words.isEmpty() ? null 
    : Iterables.get(Ordering.natural().immutableSortedCopy(words), 0); 

Вы можете получить частоту верхнего слова с words.count(topWord).

+0

Как включить классы Multiset и Hashmultiset? – NEO

+0

Вам необходимо загрузить и установить библиотеки Google Guava, http://code.google.com/p/guava-libraries/downloads/list. Извлеките его и поместите Java Guava в свой путь к классам. Затем вы можете импортировать их. – sjr

4

Я бы предложил использовать HashMap вместо связанного списка.

Iterate through the string.
For each word,
Check if the word is in the Map,
If it is there increment count and
Otherwise insert with count 1

0

Я думаю, что вы можете использовать некоторые регулярное выражение здесь как

final String str = "my name is neo and my other name is also neo because I am neo"; 

    final String[] arr = str.split (" "); 
    final Set <String> set = new HashSet <String>(); 
    for (final String word : arr) { 
     System.out.println ("arr " + word); 
     set.add (word); 
    } 

    String preWord = ""; 
    int preCount = 0; 
    for (final String word : set) { 
     System.out.println ("----------------"); 

     final Pattern p2 = Pattern.compile ("\\b" + word + "\\b"); 
     final Matcher m2 = p2.matcher (str); 
     int count = 0; 

     while (m2.find()) { 
      count++; 
     } 

     System.out.println ("preCount " + preWord + ":" + word + ":" + preCount + ":" + count); 

     if ((preCount < count)) { 
      preWord = word; 
      preCount = count; 
      System.out.println ("assigning word " + word + ":" + count); 
     } 
    } 

    System.out.println ("result " + preWord + ":" + preCount); 
0

Использование Apache Commons StringUtils org.apache.commons.lang.StringUtils получить счет.

String str="my name is neo and my other name is also neo because I am neo"; 
// Make a unique list (java.util.Set) of words. 
Set<String> stSet = new HashSet<String>(Arrays.asList(str.split(" "))); 
int sz = stSet.size(); 
int[] counts = new int[sz]; 
Map<Integer,String> matches = new HashMap<Integer,String>(sz); 
int i = 0; 
for (String s : stSet) { 
    // saves the individual word count in a sortable array. 
    counts[i] = StringUtils.countMatches(str,s)); 
    // saves the word count and the word in a HashMap for easy retrieval. 
    matches.put(counts[i],s); 
    i++; 
} 
Arrays.sort(counts); 
int max = counts.length - 1; 
System.out.println("The the word with the most occurrances is: "+matches.get(counts[max])+", the number of occurrances is: "+counts[max]); 
+0

Я знаю, что не использовал связанный список в своем ответе. Если вам действительно нужно использовать связанный список, я предлагаю вам изменить свои требования и не делать этого. –

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