SORU
6 Mayıs 2013, PAZARTESİ


Java NOT null, boş bir Dize için kontrol

Eğer bir Java String *4.*, boş ve boşluk olup olmadığını kontrol etmek için çalışıyorum.

Aklımda, bu kod bu iş için oldukça iyi olmuştur.

public static boolean isEmpty(String s) {
    if ((s != null) && (s.trim().length() > 0))
        return false;
    else
        return true;
}

Belgelere göre, String.trim() böylece bir bilgisayar olmalı

Döner baştaki ve sondaki boşluk ihmal dize bir kopyasını.

Eğer bu String nesne temsil eder boş bir karakter dizisi ya da ilk ve son karakter karakter dizisi tarafından temsil edilen bu String nesne hem kodları daha büyük '\u0020' (boşluk karakteri), bir başvuru için bu String nesne döndürülür.

Ancak, apache/commons/lang/StringUtils.java biraz farklı.

public static boolean isBlank(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0) {
        return true;
    }
    for (int i = 0; i < strLen; i  ) {
        if ((Character.isWhitespace(str.charAt(i)) == false)) {
            return false;
        }
    }
    return true;
}

Belgelere göre, Character.isWhitespace() gibi:

Eğer belirtilen karakter beyaz olup olmadığını belirler uzay Java göre. Bir karakter ve aşağıdaki kriterlerden birini karşılayan sadece: eğer Java bir boşluk karakteri

  • Bir Unicode boşluk karakteri (SPACE_SEPARATOR, LINE_SEPARATOR PARAGRAPH_SEPARATOR) değil, aynı zamanda bir non-breaking space ('\u00A0', '\u2007', '\u202F').
  • '\t', U 0009 YATAY TABLOLAMA.
  • '\n' U 000A SATIR BESLEME.
  • '\u000B', U 000B DİKEY TABLOLAMA.
  • '\f', 000 C U geçme.
  • '\r', 000 D U başı.
  • '\u001C' U 001C DOSYA AYIRICI.
  • '\u001D' U 001D GRUP AYIRICI.
  • '\u001E' U 001E KAYIT AYIRICI.
  • '\u001F' U 001F BİRİM AYIRICI.

Eğer yanlış değilsem değil ya da ben doğru okuyorum olabilir - String.trim() Character.isWhiteSpace() tarafından kontrol ediliyor karakterlerden birini almalı. Hepsi '\u0020' yukarıda olmak.

Bu durumda, isEmpty basit işlevi içme isBlank kapsayan tüm senaryoları kapsayan gibi görünüyor.

  1. isEmpty isBlank test durumda farklı davranır yapacak bir dize var mı?
  2. Yok olduğunu varsayarsak, orada 36 ** isEmpty kullanılmayan seçmeliyim hangi nedeniyle başka bir husustur?

Bu aslında bir test ilgilenenler için, burada yöntemleri ve birim testleri.

public class StringUtil {

    public static boolean isEmpty(String s) {
        if ((s != null) && (s.trim().length() > 0))
            return false;
        else
            return true;
    }

    public static boolean isBlank(String str) {
        int strLen;
        if (str == null || (strLen = str.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i  ) {
            if ((Character.isWhitespace(str.charAt(i)) == false)) {
                return false;
            }
        }
        return true;
    }
}

Ve birim testleri

@Test
public void test() {

    String s = null; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;

    s = ""; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)); 

    s = " "; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;

    s = "   "; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;

    s = "   a     "; 
    assertTrue(StringUtil.isEmpty(s)==false) ;    
    assertTrue(StringUtil.isBlank(s)==false) ;       

}

Güncelleme: çok ilginç bir tartışma oldu ve bu Yığın Taşması ve buradaki insanlar da seviyorum. Bu arada, soruya dönecek olursak, var:

  • Bir program tüm karakterleri farklı davranır yapacak gösteriyor. Kodu https://ideone.com/ELY5Wv. Teşekkürler @Dukeling.
  • Bir performans 40* *standart seçme nedeni ile ilgili. Teşekkürler @devconsole.
  • @Kapsamlı bir açıklama nhahtdh. Teşekkürler dostum.

CEVAP
6 Mayıs 2013, PAZARTESİ


isEmpty isBlank test bir durumda farklı davranır yapacak bir dize var mı?

Character.isWhitespace Unicode karakterleri tanımak ve Unicode karakterleri için true dönebilirsiniz unutmayın.

Eğer belirtilen karakter beyaz olup olmadığını belirler uzay Java göre. Bir karakter ve aşağıdaki kriterlerden birini karşılayan sadece: eğer Java bir boşluk karakteri

  • Bir Unicode boşluk karakteri (SPACE_SEPARATOR, LINE_SEPARATOR PARAGRAPH_SEPARATOR) değil, aynı zamanda bir non-breaking space ('\u00A0', '\u2007', '\u202F').

  • [...]

Öte yandan, 52* *yöntemi noktaları U 0020 ve boşluk karakteri (U 0020) altında olan tüm denetim karakterleri döşeme olacaktır.

Bu nedenle, iki yöntemden farklı Unicode boşluk karakteri bulunması davranmalı. Örneğin: "\u2008".Yadize denetimi içerdiğinde olmayan karakterler Character.isWhitespace yöntemi ile boşluk düşünün. Örneğin: "\002".

Eğer bunu yapmak için bir düzenli ifade dize ve kontrol ile bir döngü yaparak daha yavaş olan) yazma:

  • isEmpty() .matches("[\\x00-\\x20]*") eşdeğer olabilir
  • isBlank() .matches("\\p{javaWhitespace}*") eşdeğer olabilir

(isEmpty() ve isBlank() yöntemi de tam olarak düzenli çözüm için eşdeğer değildir null Dize başvuru için izin, ama bir kenara, eşdeğer olduğunu koyarak).

İsminin belirttiği gibi \p{javaWhitespace} Java özel sözdizimi karakter sınıfı Character.isWhitespace yöntem tarafından tanımlanan erişim için olduğunu unutmayın.

Yok olduğunu varsayarsak, orada isBlank seçin ve isEmpty kullanmam gerektiğini, çünkü herhangi bir diğer husustur?

Duruma göre değişir. Ancak, yukarıdaki bölümde açıklamaya karar için yeterli olması gerektiğini düşünüyorum. Fark özetle:

  • isEmpty() eğer kontrol karakterleri içeriyorsa, dize boş olur1aşağıda U 0020 ve boşluk karakteri (U 0020)

  • isBlank Unicode karakterleri de içeren Character.isWhitespace yöntem, tarafından tanımlandığı gibi, yalnızca boşluk karakterleri içeriyorsa, dize boş olur.

1Ayrıca trim() yöntemi ile kesilmiş olan U 007F DELETE, kontrol karakteri vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • FPSRussia

    FPSRussia

    19 NİSAN 2010
  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010