2011-01-10 9 views
1

Ich versuche, die meisten wiederholte Wort in einem String, mit diesem Code zu finden:Manipulieren Strings

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])); 
      } 
     } 
    } 
} 

Wie kann ich den String aus dem String Array str1 auf den String in der verknüpften Liste gespeichert vergleichen und dann Wie erhöhe ich die jeweilige Anzahl.

Ich werde dann die Zeichenfolge mit der höchsten Anzahl, Ich weiß nicht, wie das auch zu tun.

+0

Welche Sprache verwenden Sie? Formatieren Sie Ihren Code. Sind das Hausaufgaben? –

+0

Ist das Hausaufgaben? Was hast du probiert? Warum hat es nicht funktioniert? Sei genauer. – templatetypedef

+0

Ich versuche, die Eingabezeichenfolge mit einer in der verknüpften Liste zu vergleichen, wenn es übereinstimmt. I die Anzahl der Zeichenfolge erhöhen, meine Frage ist, wie ich mit der Zeichenfolge in der verknüpften Liste – NEO

Antwort

0

Sie müssen jedes Wort in einer Liste speichern, vielleicht eine long mit einer count-Variablen, die angibt, wie oft dieses Wort bereits verwendet wurde.

Erhöhen Sie für jedes Wort die Anzahl, wenn sie bereits in der Liste vorhanden ist, oder fügen Sie sie zur Liste hinzu, wenn dies nicht der Fall ist.

+0

Ya ich kenne den Algorithmus aber wie kann ich Vergleichen Sie, ob die Zeichenfolge in der verknüpften Liste ist oder nicht, schauen Sie sich bitte meinen Code an – NEO

+0

Die Art, wie Sie jedes Wort aus der Zeichenkette zum Array hinzufügen, funktioniert gegen Sie, weil es Duplikate enthalten kann. Wie ich bereits erwähnt habe, füge jedes Wort der Liste einzeln hinzu. Wenn das Wort bereits in der Liste enthalten ist, erhöhen Sie den Zähler, anstatt ihn erneut hinzuzufügen. –

0

C#? Sie können versuchen, LINQ GroupBy und dann Count oder Max zu verwenden - sehr einfach.

+0

Ich benutze Java, und das ist nicht Hausaufgaben. Ich muss nur daran gewöhnen, Operationen mit verketteten Liste String – NEO

+1

Nun, Sie haben keine Tags angegeben und die grundlegenden Strukturen von Java und C# sind die gleichen. – Schultz9999

0

Google Guava Verwendung:

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

Dann

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

Sie können mit words.count(topWord) die Frequenz des Top-Wort zu bekommen.

+0

Wie schließe ich Multiset- und Hashmultiset-Klassen ein? – NEO

+0

Sie müssen die Google Guava-Bibliotheken http://code.google.com/p/guava-libraries/downloads/list herunterladen und installieren. Extrahiere es und lege das Guava-JAR in deinen Klassenpfad. Dann können Sie sie importieren. – sjr

4

Ich würde vorschlagen, HashMap anstelle der verknüpften Liste zu verwenden.

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

Ich glaube, Sie einige regex hier wie

können
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

Verwendung Apache Commons StringUtils org.apache.commons.lang.StringUtils die Zählung zu erhalten.

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

Ich weiß, dass ich die verknüpfte Liste in meiner Antwort nicht verwendet habe. Wenn Sie die verknüpfte Liste wirklich verwenden müssen, schlage ich vor, dass Sie Ihre Anforderungen ändern und es nicht tun. –