2012-05-20 16 views
5

Muszę policzyć liczbę słów i zakładam, że właściwą metodą jest obliczenie, ile razy poprzedni znak w ciągu znaków nie jest literą (tj. Innymi znakami), ponieważ zakłada się, że byłyby dwukropki, spacje, tabulatory i inne znaki w ciągu znaków. Więc najpierw mój pomysł był do pętli każdego znaku i policzyć, ile razy, że nie dostanie list z alfabetuJak policzyć liczbę słów w ciągu?

for(int i = 0; i < string.length(); i++) { 
     for(int j = 0; i < alphabets.length(); j++) { 
     if (string.charAt(i-1) == alphabets.charAt(j)) { 
      counter++; 
     } 
    } 
    } 

Jednak zawsze będę uzyskać tablicę z granicami tego powodu. Potrzebuję więc trochę pomocy lub innego sposobu, który może być skuteczniejszy. Myślałem o używaniu Dopasowań tylko do [a-zA-z], ale nie jestem pewien, jak traktować char, aby być porównywalnym z łańcuchem w liczeniu ile razy to nastąpi.

Dziękuję

+3

W języku Java jest tylko jedno słowo. –

+2

Czy to zadanie domowe? –

+0

Czy to liczba * wszystkich * słów, czy tylko * unikalnych * słów? –

Odpowiedz

2

Twoja sugestia, aby użyć wyrażenia regularnego takiego jak "[A-Za-z]", działałaby dobrze. W poleceniu podzielonym można podzielić na odwrotność, na przykład:

Ciąg [] słowa = "Przykładowy test: jeden, dwa, trzy" .split ("[^ A-Za-z] +");

EDYCJA: Jeśli szukasz tylko prędkości podstawowej, wykona to szybciej.

public static int countWords(String str) { 
    char[] sentence = str.toCharArray(); 
    boolean inWord = false; 
    int wordCt = 0; 
    for (char c : sentence) { 
     if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') { 
      if (!inWord) { 
       wordCt++; 
       inWord = true; 
      } 
     } else { 
      inWord = false; 
     } 
    } 
    return wordCt; 
} 
+0

Do tej pory myślę, że dzielenie ich jest bardziej efektywnym sposobem. Myślę, że ułatwi mi to również rozwiązanie kolejnego zadania. To wymaga więcej czasu przetwarzania, ale myślę, że nie mam na razie innej opcji. – nfnmy

+0

+1 - To jest dokładnie ten algorytm, o którym myślałem (do którego masz kod). @ nfnmy Podejście podzielone ma przypadki narożne, które zawiodą, a także spowolni. Nie jestem pewien, czy rozumiem, dlaczego zdecydujesz się go użyć. – cheeken

+0

tak, to naprawdę skuteczny kod. Ale myślę, że użyję teraz metody dzielenia, która czyni moje zadanie łatwiejszym w zakresie manipulowania nimi w tablicy dla innych obliczeń do celów statystycznych. Dziękuję phatfingers. Na pewno zatrzymam to dla referencji, ponieważ nie widziałem tego wcześniej algorytmu. Pozdrawiam geniusza! – nfnmy

3

Można użyć String.split() przekonwertować ciąg do tablicy, jednym słowem w każdym elemencie. Liczba słów jest przez długość tablicy:

int words = myString.split("\s+").length; 
+2

Policzymy? Tablica ma właściwość 'length'. –

+0

A może użyć wyrażenia regularnego do podziału jak '\ s +'. –

+0

, więc powinienem spróbować podzielić ten długi łańcuch na tablicę opartą na tym, że jeśli postać pasuje do innego niż [a-zA-Z], hmmm .. – nfnmy

0
if (string.charAt(i-1) == alphabets.charAt(j)) { 
     counter++; 
    } 

Jesteś inkrementacji licznika jeśli postać jest jakiś znak alfabetu. Powinieneś go zwiększyć, jeśli jest to znak alfabetu no.

1

Powód, dla którego uzyskujesz IndexOutOfBoundsException jest prawdopodobnie dlatego, że gdy ja jest 0 twoja wewnętrzna pętla będzie miała string.charAt(i-1), która wyrzuci wyjątek, ponieważ 0-1 wynosi -1. Jeśli naprawisz działanie swojej metody, możesz użyć bardziej wydajnych technik.

1

Zwracając się bezpośrednio kodu Twoja pierwsza pętla ma i = 0 jako pierwsza wartość i, ale potem poprosić o

string.charAt (I-1) = string.charAt (-1),

, z której pochodzi twój układ poza granicami.

Druga pętla ma inny problem:

for (int j = 0; i < alphabets.length(); j ++) {

Można też rozważyć apostrof jako części słów.

+0

+1 za znalezienie obu błędów – phatfingers

2

Ten problem jest nieco bardziej skomplikowany niż pozwala na to algorytm.

  • Co zrobić, jeśli w jednym rzędzie są dwa lub więcej odstępów?
  • Co jeśli łańcuch zaczyna się lub kończy białymi znakami (lub znakami innymi niż słowne)?

To wygląda na pracę domową, więc nie chcę podawać żadnego kodu. Proponuję alternatywne podejście, które jest łatwiejsze do przemyślenia.

  • Przejdź przez znaki w łańcuchu, jeden po drugim.
  • Zrobić coś do zapamiętania, jeśli skanujesz słowo lub jeśli nie skanujesz słowa.
  • Zrób coś, aby określić, kiedy wprowadzasz lub zostawiasz słowo, i odpowiednio zwiększ swój licznik.
+0

Dzięki za napiwek. Tak naprawdę nie oczekuję żadnych kodów, po prostu więcej porad i jak mogę skuteczniej zająć się tym problemem. Naprawdę nie lubię, gdy ktoś podaje mi odpowiedzi. – nfnmy

Powiązane problemy