2010-03-17 5 views
10

Mam metodę w Javie, która łączy 2 ciągi. Obecnie działa poprawnie, ale myślę, że można go napisać lepiej.Metoda konkatenacji 2 ciągów w Javie

public static String concat(String str1, String str2) { 
    String rVal = null; 
    if (str1 != null || str2 != null) { 
    rVal = ""; 
    if (str1 != null) { 
     rVal += str1; 
    } 
    if (str2 != null) { 
     rVal += str2; 
    }  
    }  
    return rVal; 
} 

Oto niektóre z wymagań:

  1. Jeśli oba str1 i słowo2 są null, metoda zwraca null
  2. Jeśli któryś str1 lub słowo2 jest null, to po prostu zwracają not null String
  3. Jeśli str1 i słowo2 nie są nieważne, to złączyć je
  4. nigdy nie dodaje "null" do wyniku

Czy ktoś może zrobić to z mniejszym kodem?

+0

Jeśli zadzwonię str1.concat (słowo2), będzie rzucać NullPointerException podczas str1 jest null. – Ryan

+0

Nie możesz po prostu użyć StringBuilder? – Ant

+0

@Ant nie jestem pewien, że bardzo dobrze obsługuje sprawy zerowe. – Ryan

Odpowiedz

13

Sure:

public static String concat(String str1, String str2) { 
    return str1 == null ? str2 
     : str2 == null ? str1 
     : str1 + str2; 
} 

Zauważ, że ta zajmuje się "zarówno zerowej" przypadek w pierwszym warunkiem: jeśli str1 jest zerowy, to albo chce wrócić NULL (jeśli str2 jest null) lub str2 (jeśli str2 nie ma wartości NULL) - oba są obsługiwane po prostu zwracając str2.

+3

Zagnieżdżone operatory warunkowe? Poważnie? –

+2

Niektórzy mogą to przeczytać, niektórzy nie. Na początek jest to bardziej mylące. Wolałbym umieścić je w jednym wierszu z nawiasami. Coś jak 'return (str1 == null)? str2: ((str2 == null)? str1: (str1 + str2)); ' – BalusC

+1

@Michael: Absolutnie - uważam, że jest to bardzo użyteczny wzorzec, gdy chcesz przetestować wiele warunków z preferencjami. –

15

Korzystanie tylko zwykły if punktach:

public static String concat(String str1, String str2) { 
    if(str1==null) return str2; 
    if(str2==null) return str1; 
    return str1 + str2; 
} 

Albo, jeśli masz długą i namiętną miłość do nawiasach:

public static String concat(String str1, String str2) { 
    if(str1==null) 
    { 
     return str2; 
    } 
    if(str2==null) 
    { 
     return str1; 
    } 
    return str1 + str2; 
} 
+0

Nie lubisz zagnieżdżonych warunków - nie lubię zdań "jeśli" bez nawiasów klamrowych :) –

+0

@Jon miał je na początku, ale zwartość IMO jest lepsza w tak prostym przypadku. –

+0

Mniej kodu jest bardziej czytelny –

1
import org.apache.commons.lang.StringUtils; 

StringUtils.join([str1, str2]); 

Łączy elementy przewidziane tablicy w jeden Łańcuch zawierający podaną listę elementów.

Do połączonego ciągu nie dodano żadnego separatora. Obiekty puste lub puste ciągi w tablicy są reprezentowane przez puste ciągi.

StringUtils.join(null)   = null 
StringUtils.join([])    = "" 
StringUtils.join([null])   = "" 
StringUtils.join(["a", "b", "c"]) = "abc" 
StringUtils.join([null, "", "a"]) = "a" 
+0

@Nishu Jest blisko, ale wymagana jest prosta kontrola zerowa w przypadku, gdy zarówno str1, jak i str2 są puste. – Ryan

0

Wszystkim wydaje się, że brakowało Warunek 1, gdzie jeśli oba ciągi są nieważne zwraca NULL. Najprostsza wersja do odczytu (IMO), a następnie staje się:

public static String concat(String str1, String str2) { 
    if(str1==null && str2==null) return null; 
    if(str1==null) return str2; 
    if(str2==null) return str1; 
    return str1 + str2; 
} 
+0

Biorę to z powrotem ... pierwsza odpowiedź Jona ... – Striker

+1

Rozwiązania Jona i Michaela zwróciłyby wartość NULL w pierwszym warunku (zwracając drugi ciąg, który jest zerowy), jeśli oba łańcuchy mają wartość null. Twój po prostu dodaje dodatkowy niepotrzebny warunek testowy. – defectivehalt

0
public class ConcatTest extends TestCase { 

    // 1. If both str1 and str2 are null, the method returns null 
    public void testBothNull() throws Exception { 
     assertNull(concat(null, null)); 
    } 

    // 2. If either str1 or str2 is null, it will just return the not null 
    // String 
    public void testOneNull() throws Exception { 
     assertEquals("a", concat(null, "a")); 
     assertEquals("b", concat("b", null)); 
    } 

    // 3. If str1 and str2 are not null, it will concatenate them 
    public void testNonNull() throws Exception { 
     assertEquals("ab", concat("a", "b")); 
    } 

    // 4. It never adds "null" to the result (not really testable) 

    public static String concat(String a, String b) { 
     if (a == null && b == null) 
      return null; 
     return denulled(a) + denulled(b); 
    } 

    private static String denulled(String s) { 
     return s == null ? "" : s; 
    } 

}