2010-03-17 11 views
10

Ich habe eine Methode in Java, die 2 Strings verkettet. Es funktioniert derzeit korrekt, aber ich denke, es kann besser geschrieben werden.Methode zum Verketten von 2 Strings in Java

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; 
} 

Hier sind einige der Anforderungen sind:

  1. Wenn beide str1 und str2 gleich null sind, gibt die Methode null
  2. Wenn entweder str1 oder str2 null ist, wird es nur zurück, die nicht null String
  3. Wenn str1 und str2 nicht null sind, wird es ihnen
  4. verketten es fügt nie "null" zu dem Ergebnis

Kann jemand dies mit weniger Code tun?

+0

Wenn ich rufe str1.concat (STR2), wird es eine Nullpointer werfen, wenn str1 null ist. – Ryan

+0

Könnten Sie nicht einfach den StringBuilder verwenden? – Ant

+0

@Ant Ich bin nicht sicher, dass die Nullfälle sehr gut behandelt werden. – Ryan

Antwort

13

Sure:

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

Beachten Sie, dass diese Sorge nimmt der "beide null" Fall in der ersten Bedingung: wenn str1 null ist, dann ist entweder Sie wollen null zurück (wenn str2 null ist) oder str2 (wenn str2 nicht null ist) - beide werden behandelt, indem einfach str2 zurückgegeben wird.

+3

Verschachtelte bedingte Operatoren? Ernst? –

+2

Manche können es lesen, manche nicht. Es ist in der Tat für Anfänger verwirrender. Ich hätte sie lieber in eine einzige Zeile mit Klammern gesetzt. Etwas wie 'return (str1 == null)? str2: ((str2 == null)? str1: (str1 + str2)); ' – BalusC

+1

@Michael: Absolut - Ich finde es ein sehr nützliches Muster, wenn Sie mehrere Bedingungen mit einer Präferenz testen möchten. –

15

Mit nur einfachen if Klauseln:

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

Oder, wenn Sie eine tiefe und leidenschaftliche Liebe für Klammern haben:

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

Sie mögen keine geschachtelten Bedingungen - ich mag keine 'if' Anweisungen ohne Klammern :) –

+0

@Jon hatte diese zuerst, aber Kompaktheit IMO ist besser in einem so einfachen Fall. –

+0

Weniger Code ist besser lesbar –

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

StringUtils.join([str1, str2]); 

Verbindet die Elemente der bereitgestellten Array in einem einzigen String, der die angegebene Liste von Elementen enthält.

Dem verknüpften String wird kein Trennzeichen hinzugefügt. Null-Objekte oder leere Strings innerhalb des Arrays werden durch leere Strings dargestellt.

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

@Nishu Dies ist nahe, aber eine einfache Nullprüfung ist erforderlich, falls sowohl str1 als auch str2 beide null sind. – Ryan

0

Jeder scheint die Bedingung 1 verpasst zu haben. Wenn beide Strings null sind, wird null zurückgegeben. Die einfachste Version zu lesen (IMO) wird dann:

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

Ich nehme das zurück ... die erste Antwort von Jon tat ... – Striker

+1

Beide Lösungen von Jon und Michael würden null auf die erste Bedingung zurückgeben (die andere Zeichenfolge zurückgeben, die Null ist), wenn beide Zeichenfolgen null sind. Ihr fügt einfach eine zusätzliche unnötige Testbedingung hinzu. – 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; 
    } 

}