2010-11-10 74 views
23

Làm thế nào để loại bỏ giá trị null khỏi mảng Chuỗi trong java?Xóa Giá trị Null khỏi mảng Chuỗi trong java

String[] firstArray = {"test1","","test2","test4",""}; 

tôi cần những "firstArray" không có giá trị (trống) null như thế này

String[] firstArray = {"test1","test2","test4"}; 
+24

'null' hoàn toàn khác với" chuỗi rỗng "trong Java. Đó là vấn đề đầu tiên của bạn. –

+0

null không phải là "". "" là một chuỗi rỗng, nhưng hoàn toàn hợp lệ. – EboMike

+0

Không có giá trị null trong mảng đó. Tuy nhiên, có một sting rỗng (một đối tượng String không null với độ dài là 0). Dù sao, * những gì * bạn đã thử? –

Trả lời

57

Nếu bạn muốn tránh các lỗi fencepost và tránh di chuyển và xóa các mục trong một mảng, đây là một giải pháp hơi dài dòng mà sử dụng List:

import java.util.ArrayList; 
import java.util.List; 

public class RemoveNullValue { 
    public static void main(String args[]) { 
    String[] firstArray = {"test1", "", "test2", "test4", "", null}; 

    List<String> list = new ArrayList<String>(); 

    for(String s : firstArray) { 
     if(s != null && s.length() > 0) { 
      list.add(s); 
     } 
    } 

    firstArray = list.toArray(new String[list.size()]); 
    } 
} 

Added null để thấy sự khác biệt giữa một thể hiện String trống ("") và null.

Kể từ khi câu trả lời này là khoảng 4,5 tuổi, tôi thêm một ví dụ Java 8:

import java.util.Arrays; 
import java.util.stream.Collectors; 

public class RemoveNullValue { 
    public static void main(String args[]) { 
     String[] firstArray = {"test1", "", "test2", "test4", "", null}; 

     firstArray = Arrays.stream(firstArray) 
        .filter(s -> (s != null && s.length() > 0)) 
        .toArray(String[]::new);  

    } 
} 
+0

cảm ơn điều này đang hoạt động tốt –

+0

Điều này thật tuyệt vời nhưng không phải 3 trong số 4 mục nhập đó không được sử dụng? –

+0

@ Hack-R Có và đó là vì tôi đã sao chép xong câu trả lời cũ của mình và chỉ thay đổi mã khi tôi cập nhật nó. : D –

-1

Đó là những chuỗi zero-length, không null. Nhưng nếu bạn muốn để loại bỏ chúng:

firstArray[0] refers to the first element 
firstArray[1] refers to the second element 

Bạn có thể di chuyển thứ hai vào đầu thusly:

firstArray[0] = firstArray[1] 

Nếu bạn đã làm điều này cho các yếu tố [1,2], sau đó [2, 3], v.v. cuối cùng bạn sẽ chuyển toàn bộ nội dung của mảng sang bên trái, loại bỏ phần tử 0. Bạn có thể thấy nó sẽ áp dụng như thế nào không?

+1

Sau đó, câu hỏi sẽ trở thành: "Làm thế nào bạn có thể thay đổi kích thước một mảng trong Java"? :-) –

+0

Điều đó không thực sự làm những gì anh ta muốn. Điều này chỉ sao chép dữ liệu xung quanh. Nó không làm bất cứ điều gì để làm cho mảng nhỏ hơn. – mlathe

+0

Vấn đề là làm cho anh ta đi đúng hướng. – Falmarri

14

Nếu bạn thực sự muốn thêm/xóa các mục khỏi một mảng, tôi có thể đề xuất một số List thay thế không?

String[] firstArray = {"test1","","test2","test4",""}; 
ArrayList<String> list = new ArrayList<String>(); 
for (String s : firstArray) 
    if (!s.equals("")) 
     list.add(s); 

Sau đó, nếu bạn thực sự cần phải đặt nó sang một mảng:

firstArray = list.toArray(new String[list.size()]); 
+0

Haha. Bạn đã thực hiện những gì tôi mô tả! :-) Một cải tiến của tôi sẽ là để vượt qua một 'new String [0]' đến 'toArray' mặc dù - nó sẽ tạo ra một mảng mới với kích thước chính xác khi cần thiết. –

+0

Bạn nên sử dụng 'String.isEmpty()' thay vì 'String.equals (" ")' –

+0

@Steve, rất nhiều người cảm thấy cách bạn làm. Tôi chỉ (cá nhân) nghĩ rằng 's.equals (" ")' dễ đọc hơn - ít trừu tượng hơn. –

4

Sử dụng của Google guava library

String[] firstArray = {"test1","","test2","test4","",null}; 

Iterable<String> st=Iterables.filter(Arrays.asList(firstArray),new Predicate<String>() { 
    @Override 
    public boolean apply(String arg0) { 
     if(arg0==null) //avoid null strings 
      return false; 
     if(arg0.length()==0) //avoid empty strings 
      return false; 
     return true; // else true 
    } 
}); 
+2

Dọc theo cùng một cách tiếp cận, người ta có thể sử dụng thư viện FunctionalJava. –

+0

@Emil Và sau đó, làm thế nào để bạn đặt những gì bên trong 'st' trở lại bên trong' firstArray'? – Abdull

+0

@Abdull: Không cần điều đó vì firstArray không được sửa đổi. Việc lọc xảy ra là lazily.i.e trong khi lặp lại mảng. – Emil

2

Đây là mã mà tôi sử dụng để loại bỏ các giá trị null từ một mảng không sử dụng danh sách mảng.

String[] array = {"abc", "def", null, "g", null}; // Your array 
String[] refinedArray = new String[array.length]; // A temporary placeholder array 
int count = -1; 
for(String s : array) { 
    if(s != null) { // Skips over null values. Add "|| "".equals(s)" if you want to exclude empty strings 
     refinedArray[++count] = s; // Increments count and sets a value in the refined array 
    } 
} 

// Returns an array with the same data but refits it to a new length 
array = Arrays.copyOf(refinedArray, count + 1); 
+0

Có một lỗi off-by-one trong dòng cuối cùng. Nên là 'đếm + 1' – coolguy

2

Dường như chưa ai đề cập về việc sử dụng nonNull phương pháp mà cũng có thể được sử dụng với streams trong Java 8 để loại bỏ null (nhưng không có sản phẩm nào) như:

String[] origArray = {"Apple", "", "Cat", "Dog", "", null}; 
String[] cleanedArray = Arrays.stream(firstArray).filter(Objects::nonNull).toArray(String[]::new); 
System.out.println(Arrays.toString(origArray)); 
System.out.println(Arrays.toString(cleanedArray)); 

Và đầu ra là :

[Apple,, Mèo, Chó,, null]

[Apple,, Mèo, Chó,]

Nếu chúng ta muốn kết hợp sản phẩm nào cũng sau đó chúng ta có thể xác định một phương pháp hữu ích (trong lớp Utils (nói)):

public static boolean isEmpty(String string) { 
     return (string != null && !string.isEmpty()); 
    } 

Và sau đó sử dụng nó để lọc các mặt hàng như:

Arrays.stream(firstArray).filter(Utils::isEmpty).toArray(String[]::new); 

tôi tin rằng Apache chung cũng cung cấp một phương pháp hữu ích StringUtils.isNotEmpty mà cũng có thể được sử dụng.

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