2010-03-17 58 views
10

Tôi có một phương thức trong Java nối 2 chuỗi. Nó hiện hoạt động chính xác, nhưng tôi nghĩ nó có thể được viết tốt hơn.Phương pháp ghép 2 chuỗi trong 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; 
} 

Dưới đây là một số yêu cầu:

  1. Nếu cả hai str1 và str2 là null, phương pháp này sẽ trả về null
  2. Nếu một trong hai str1 hoặc str2 là null, nó sẽ chỉ trả lại không null chuỗi
  3. Nếu str1 và str2 không null, nó sẽ tiếp nhau chúng
  4. nó không bao giờ cho biết thêm "null" đến kết quả

Có ai có thể làm điều này với ít mã hơn không?

+0

Nếu tôi gọi str1.concat (str2), nó sẽ ném một NullPointerException khi str1 là null. – Ryan

+0

Bạn không thể chỉ sử dụng StringBuilder? – Ant

+0

@Ant Tôi không chắc chắn xử lý các trường hợp null rất tốt. – Ryan

Trả lời

13

chắc:

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

Lưu ý rằng điều này sẽ chăm sóc của "cả null" trường hợp trong điều kiện đầu tiên: nếu str1 là null, sau đó bạn có muốn quay trở lại null (nếu str2 là null) hoặc str2 (nếu str2 không phải là null) - cả hai đều được xử lý bằng cách chỉ trả lại str2.

+3

Các toán tử có điều kiện lồng nhau? Nghiêm túc? –

+2

Một số có thể đọc nó, một số thì không thể. Nó thực sự khó hiểu hơn cho người mới bắt đầu. Tôi thà đặt chúng vào một dòng duy nhất với dấu ngoặc đơn. Cái gì đó như 'return (str1 == null)? str2: ((str2 == null)? str1: (str1 + str2)); ' – BalusC

+1

@Michael: Tuyệt đối - tôi thấy nó là một mẫu rất hữu ích khi bạn muốn kiểm tra nhiều điều kiện với một sở thích. –

15

Sử dụng chỉ đơn giản if khoản:

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

Hoặc, nếu bạn có một tình yêu sâu sắc và đam mê cho ngoặc:

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

Bạn không thích điều kiện lồng nhau - Tôi không thích các câu lệnh 'if' không có dấu ngoặc ôm :) –

+0

@Jon có những thứ đó lúc đầu, nhưng sự gọn gàng IMO tốt hơn trong một trường hợp đơn giản như vậy. –

+0

Ít mã có thể đọc được –

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

StringUtils.join([str1, str2]); 

tham gia các phần tử của mảng cung cấp vào một đơn Chuỗi chứa danh sách các phần tử được cung cấp.

Không có dấu phân cách nào được thêm vào Chuỗi đã tham gia. Các đối tượng rỗng hoặc các chuỗi rỗng trong mảng được biểu diễn bằng các chuỗi rỗng.

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

@Nishu Đây là đóng, nhưng một kiểm tra null đơn giản là cần thiết trong trường hợp cả str1 và str2 đều là null. – Ryan

0

Mọi người dường như đã bỏ lỡ điều kiện 1 trong đó nếu cả hai chuỗi là null, nó trả về giá trị rỗng. Các phiên bản đơn giản nhất để đọc (IMO), sau đó trở thành:

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

Tôi lấy lại ... câu trả lời đầu tiên của Jon đã làm ... – Striker

+1

Cả hai giải pháp của Jon và Michael sẽ trả về giá trị null trong điều kiện đầu tiên (trả về chuỗi khác, nếu null) nếu cả hai chuỗi đều rỗng. Bạn chỉ cần thêm một điều kiện kiểm tra không cần thiết bổ sung. – 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; 
    } 

} 
Các vấn đề liên quan