2013-02-07 14 views
10

przy porównywaniu ciągów wolę nie polegać na metodach instancji, ponieważ łańcuch, na którym jest wywoływana metoda, ma wartość null. W .NET używam tylko statycznej metody String.Compare (string, string, bool). czy java udostępnia podobne wbudowane narzędzie do porównywania ciągów znaków "null-safe" lub czy muszę zaimplementować własne?czy java udostępnia wbudowaną statyczną metodę String.Compare?

+3

mają to biblioteki. istnieje Apache StringUtils, które myślę, a Android ma TextUtils – njzk2

Odpowiedz

8

Nie, JDK nie sprzeciwia się takie narzędzie. Istnieje jednak kilka zewnętrznych bibliotek, które to robią. Na przykład org.apache.commons.lang.StringUtils zapewnia bezpieczne wartości zerowe equals(String, String) i equalsIgnoreCase(String, String). Guava ma podobne narzędzia.

1

Myślę, że odpowiedź brzmi nie, masz prawdopodobnie to sprawdzić przed

if(myString != null && myString.equals("string")) { 
    // do something 
} 

Here some more examples

Jak inni wskazał Apache Commons ma ten, a także wiosny:

StringUtils.hasLength()

if(StringUtils.hasLength(myString)) { 
    // do something 
} 
2

Nie ma. Apache Commons 'StringUtils.equals() robi to w ten sposób:

public static boolean equals(String str1, String str2) { 
    return str1 == null ? str2 == null : str1.equals(str2); 
} 
-2

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#compareTo(java.lang.String)

Jest to porównać do którego zwraca int. Istnieje również równe, które zwraca wartość boolowską. Jeśli masz instancję typu string, powinno być możliwe wykonanie . Jeśli przekażesz instance.equals (null), zwróci false. jeśli twoja instancja ma wartość null, otrzymasz wskaźnik zerowy.

public class App 
{ 

public static void main(String[] args) 
{ 
    String myString = "test"; 

    if(myString.equals(null)) 
    { 
     System.out.println("Its NUll"); 
    }else 
    { 
     System.out.println("Not Equal"); 
    } 

} 

} 
+1

-1: Pytanie dotyczyło ** statycznej **, wbudowanej w bezpieczną null metody porównywania ciągów znaków, a nie porównywania ciągów znaków. –

2

String robi oferują compareTo method, który i tak nie jest bezpieczny null (czyli trzeba sprawdzić wartość null, zanim faktycznie wywołanie metody comapreTo na obiekcie).

Co można zrobić, to napisać własny komparator jak ten

class StringComparator implements Comparator<String> { 

    public int compare(String s1, String s2) { 
     if (s1 != null) { 
      return s1.compareTo(s2); 
     } else { 
      if (s2 == null) { 
       return 0; 
      } else { 
       return -1; 
      } 
    } 

Aby zweryfikować własność prostu zrobić:

Comparator<String> comp = new Comparator<String>(); 
System.out.println(comp.compare(s1, s2); 

I nie faktycznie przetestować kod, więc należy go jako ogólny przykład. Korzyścią jest to, że pomimo tego, że mimo wszystko trzeba sprawdzić wartość pustą, można ją zapisać raz i użyć jej kilka razy.

Możesz również rzucić okiem na a built in Comparator wewnątrz klasy String.

+0

Tak, dodałem ten typ kodu do każdego nowego projektu. Wygląda na to, że powinno być 'Strings.compare (left, right)' do obsługi sprawdzania zerowego – Kirby

1

Jeśli jeden z porównywanych ciągów jest stałą, można użyć wartości equals, ponieważ obsługuje ona null.

if("string".equals(mystring)) { 
    // do something 
} 

Jeśli masz 2 zmienne, to możesz napisać własną metodę statyczną:

public static boolean stringEquals(String s1, String s2) { 
    if (s1 == null) { 
     return s2 == null; 
    } 
    return s1.equals(s2); 
} 
Powiązane problemy