2013-03-01 20 views
5

Mam program, który prosi użytkownika o wprowadzenie ciągu znaków trzyznakowych. Ciąg może być tylko kombinacją a, b lub c.Jak sprawdzić, czy ciąg zawiera znaki inne niż określone. (w Javie)

Jak sprawdzić, czy ciąg zawiera inne znaki niż określone bez wykonywania miliona instrukcji warunkowych.

Pseudo przykład:

String s = "abq" 

if (s.containsOtherCharacterThan(a,b,c)) 
    System.exit(-1) 
+3

Czy prosisz nas o wykonanie zadania domowego? – Marshmellow1328

+0

W tym celu użyj wyrażenia regularnego. –

+0

jak to nie jest prawdziwe pytanie? Właśnie tego szukałem. – J3STER

Odpowiedz

8

Aby wyszukać znaki, które nie są a, b lub c, użyj coś jak poniżej:

if(!s.matches("[abc]+")) 
{ 
    System.out.println("The string you entered has some incorrect characters"); 
} 
+0

Dziękuję bardzo. –

+0

To właściwie jesteś regex, który wydaje się być wadliwy. 'System.out.println (" abq ".matches (" [^ abc] "));' dał mi 'false', gdzie powinien podać" true ". – SudoRahul

+0

@Indigenuity - 'System.out.println (" abq ".matches (" [^ abc] + "));' nadal daje 'false'. Nie chcę brzmieć ZŁEGO, ale skoro ta odpowiedź została przyjęta, lepiej umieść działające rozwiązanie, jak mogą to polecić inne osoby. Proponuję uruchomić kod w IDE i wkleić go tam. – SudoRahul

1

Można użyć tego wyrażenia regularnego: - [abc]+.

+0

To wyrażenie regularne przeszedłoby przez jego wadliwy przypadek testowy 'abq'. – Stobor

+0

Naprawdę w to wątpię. 'abq' nie pasuje do wzorca' [abc] + '. – SudoRahul

+0

'[abc] +' będzie pasować do 'ab' z' abq', więc '" abq ".match (" [abc] + ")' zwróci 'true' EDIT I ​​zostanie poprawiony. Masz rację: – Indigenuity

4

Można użyć wyrażenia regularnego i jego numeru character classes. Wystarczy wywołać String#matches(String regex) na łańcuchu, który chcesz sprawdzić, czy można go dopasować w całości przez wyrażenie regularne.

if (!s.matches("[abc]+")) {//.. 

Ten test powinien przejść tylko struny, które zawiera również inne postacie następnie określone w [] tak "abq" powinien przekazać go ponieważ zawiera q. Dopasowania sprawdzi, czy s zawiera tylko znaki a, b i c. Jeśli nie, to zwróci false, a dzięki negacji wprowadzimy blok if.

+1

Nie jestem najlepszy w regex, ale myślę, że to po prostu powie ci, jeśli ŻADNA z postaci nie jest dozwolona. – Indigenuity

+0

@Indigenuity ma rację - to wyrażenie regularne przejdzie niepomyślny przykład 'abq'. – Stobor

+0

Stoję poprawione. Masz rację: – Indigenuity

1

sposób bez regex byłoby pętli łańcucha i sprawdzić każdy znak, zamykanie, jeśli znak to cokolwiek innego niż a, b lub c. Nie ma sposobu, aby to zrobić za pomocą String.contains

2

Możesz podzielić łańcuch na tablicę i przechodzić przez dane wejściowe, z których można porównać każdy znak.

public boolean containsOtherCharacter(String s, String a, String b, String c) { 
    String[] st = s.split(""); 
    for(int x = 0; x < st.length; x++) 
     if (st[x].compareTo(a) != 0 && st[x].compareTo(b) != 0 && st[x].compareTo(c) != 0) 
      return true; 
    return false; 
} 

Dzięki temu dowiesz się, czy są jakieś inne znaki. Jeśli chciałbyś wiedzieć, jakie to są postacie, możesz wstawić każdy znak do HashMap, gdzie klucz jest znakiem, a wartość określa, ile razy jest używana.

Powiązane problemy