2013-07-31 29 views
13

Mam jeden przykład.Jak porównać dwa ciągi znaków w java bez uwzględniania spacji?

public class Test { 
    public static void main(String[] args) { 
     String a="VIJAY KAKADE"; 
     String b="VIJAY KAKADE"; 
     if(a.equalsIgnoreCase(b)){ 
      System.out.println("yes"); 
     }else{ 
      System.out.println("no"); 
     } 
    } 
} 

Muszę sprawdzić te ciągi bez uwzględnienia spacji. Jak to osiągnąć? Jak zignorować spacje w łańcuchach podczas ich porównywania?

+4

'st.replace (””, "") 'jest twoim przyjacielem. – moonwave99

Odpowiedz

24

Można spróbować utworzyć nowy ciąg zastępując wszystkie puste przestrzenie.

if(a.replaceAll("\\s+","").equalsIgnoreCase(b.replaceAll("\\s+",""))) { 
    // this will also take care of spaces like tabs etc. 
} 

następnie porównaj.

+0

Nie ma potrzeby "replaceAll()". "replace()' będzie dobrze. –

+0

'replace' nie przyjmuje wyrażenia regularnego. – arshajii

+0

Twój wcześniejszy kod był co najmniej działającym kodem, '\\ s +' nie zadziała z 'String # replace' – anubhava

12

Zamień spacje z pustym ciągiem:

if (a.replace(" ", "").equalsIgnoreCase(b.replace(" ", ""))) 
+1

Co jeśli 'a =" ANN MARIE "' i 'b =" ANNMARIE "'? Nie są to te same nazwy, ale to rozwiązanie je oceni. Proszę rozważyć moją odpowiedź poniżej. –

0

Możesz użyć String.replace(), aby usunąć spacje z obu ciągów.

String aMod = a.replace(" ",""); 
    String bMod = b.replace(" ",""); 
    if(aMod.equalsIgnoreCase(bMod)){ 
    ... 
1

String#replace() Metoda jest pomocna.

public static void main(String[] args) { 
    String a="VIJAY KAKADE"; 
    String b="VIJAY KAKADE"; 
    a = a.replace(" ", ""); 
    b = b.replace(" ", ""); 
    if(a.equalsIgnoreCase(b)){ 
     System.out.println("yes"); 
    }else{ 
     System.out.println("no"); 
    } 
} 
1

jeśli chcesz zamienić wszystkie spacje, włącznie z kartami etc, można użyć

a = yourOriginalString.replaceAll("\\s", ""); 
b = yourOriginalString.replaceAll("\\s", ""); 
return a.equalsIgnoreCase(b); 

edit: woah ninja'd jak cholery

1
a.replace(" ","") 

jest najlepszym. Możesz jednak użyć a.trim() , aby usunąć początkowe i końcowe białe znaki, jeśli wiesz, że chcesz ignorować tylko początkowe i końcowe spacje. Także StringUtils z Apache Commons ma wiele więcej funkcji, aby pomóc

9

myślę zastępując wszystkie spacje z pustym ciągiem stwarza niebezpieczeństwo weryfikacji następującą sytuację (ze znalezieniem dwa nazwiska równe):

String a = "ANN MARIE O'RIORDAN" 
String b = "ANNMARIE O'RIORDAN" 

wiem Mogę dzielić włosy tutaj, ale znalazłem to pytanie, szukając podobnego rozwiązania do weryfikacji zapytań SQL w teście jednostkowym. Ponieważ moje zapytania są wieloliniowe: static final Strings, chciałem się upewnić, że nigdzie nie przeoczyłem przestrzeni.

W tym celu, myślę, zastępując wszystkie spacje z jednego miejsca, a może znak specjalny jest najbezpieczniejszym rozwiązaniem - które następnie robi wymagają regex:

if (a.trim().replaceAll("\\s+", " ").equalsIgnoreCase(b.trim().replaceAll("\\s+", " "))) { 
    // Strings equivalent 
} 

myśli?

+0

Chcę podkreślić, że twoja odpowiedź jest/była jedyna słuszna. Dodałem inny sposób. Interesujące jest to, jak cała szybka odpowiedź nie widziała tego problemu. – sevenforce

6

Jak słusznie zauważa Zoltan, wszystkie odpowiedzi poza nim są w rzeczywistości błędne.

Za pomocą funkcji z biblioteki strony trzeciej Proponuję hamcrest:

import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace; 

public class Main { 
    public static void main(String[] args) { 
     String a = "VIJAY KAKADE"; 
     String b = "VIJAY KAKADE"; 
     System.out.print(String.format("'%s' and '%s' matching: ", a, b)); 
     if (equalToIgnoringWhiteSpace(a).matches(b)) { 
      System.out.println("yes"); 
     } else { 
      System.out.println("no"); 
     } 

     String c = "VIJAYKAKADE"; 
     System.out.print(String.format("'%s' and '%s' matching: ", a, c)); 
     if (equalToIgnoringWhiteSpace(a).matches(c)) { 
      System.out.println("yes"); 
     } else { 
      System.out.println("no"); 
     } 
    } 
} 

Powroty:

'VIJAY KAKADE' and 'VIJAY KAKADE' matching: yes 
'VIJAY KAKADE' and 'VIJAYKAKADE' matching: no 
0
public static void main(String args[]) { 
    String a = "My Name is A B"; 
    String b = "My Name is A B"; 

    System.out.println("Match = " + equalsIgnoreSpace(a, b, false)); 
} 

static boolean equalsIgnoreSpace(String s1, String s2, boolean matchCase) { 

    String val1 = stripExtraSpaces(s1); 
    String val2 = stripExtraSpaces(s2); 

    if(matchCase) { 
     return val1.equals(val2); 
    } else { 
     return val1.equalsIgnoreCase(val2); 
    } 
} 

static String stripExtraSpaces(String s) { 
    String formattedString = ""; 
    java.util.StringTokenizer st = new java.util.StringTokenizer(s); 

    while(st.hasMoreTokens()) { 
     formattedString += st.nextToken() + " "; 
    } 

    return formattedString.trim(); 
} 
+1

Wyjaśnienie tego, co zrobiłeś, może pomóc ankieterowi bardziej. –