2010-09-26 40 views
23

Tôi đang viết hàm này cho một ứng dụng j2me, vì vậy tôi không có một số lớp java hiện đại/nâng cao hơn có sẵn cho tôi. Tôi nhận được java.lang.ArrayIndexOutOfBoundsException về điều này. Vì vậy, rõ ràng hoặc là nó không giống như cách tôi đã khởi tạo mảng newChars, hoặc tôi không làm điều gì đó một cách chính xác khi gọi System.arraycopy(). Bất kỳ lời khuyên nào đều đáng quý!cắt khoảng trắng từ một chuỗi?

/* 
* remove any leading and trailing spaces 
*/ 
public static String trim(String str) { 
    char[] chars = str.toCharArray(); 
    int len = chars.length; 
    // leading 
    while ((len > 0) && (chars[0] == ' ')) { 
     char[] newChars = new char[] {}; // initialize empty array 
     System.arraycopy(chars, 1, newChars, 0, len - 1); 
     chars = newChars; 
     len = chars.length; 
    } 
    // TODO: trailing 
    return chars.toString(); 
} 
+1

Như đã chỉ ra, có phương thức String.trim() mà tôi đã bỏ qua. Tuy nhiên, tôi nghĩ rằng tôi muốn thêm những gì tôi phát hiện ra trong khi chờ đợi, vì tôi là một java noob và điều này có thể hữu ích cho người khác. Từ các tài liệu cho System.arraycopy(): "... một IndexOutOfBoundsException được ném [nếu] ... destPos + chiều dài lớn hơn dest.length, chiều dài của mảng đích." iow, tôi có thể sửa chữa mã của tôi bằng cách khởi tạo mảng temp của tôi như thế này: "char [] newChars = new char [len - 1];" – user458442

Trả lời

13

String.trim() rất cũ, ít nhất là java 1.3. Bạn không có điều này?

+1

Thực ra, vâng - tôi bằng cách nào đó đã bỏ lỡ nó khi tìm kiếm giải pháp. :/ Cảm ơn nhiều. – user458442

+1

Yay! Dễ dàng sửa chữa !!! –

+1

IIRC 'trim()' là trong Java 1.1 –

35

Cách đơn giản để cắt khoảng trắng đầu và cuối là gọi String.trim(). Nếu bạn chỉ muốn cắt các khoảng trắng ở đầu và cuối (thay vì tất cả khoảng trống đầu và cuối), thì có một phương thức commons Apache có tên là StringUtils.strip(String, String) có thể thực hiện điều này; gọi nó với số " " làm đối số thứ 2.

Mã đã thử của bạn có một số lỗi và về cơ bản là không hiệu quả. Nếu bạn thực sự muốn thực hiện điều này cho mình, sau đó bạn nên:

  1. đếm ký tự không gian hàng đầu
  2. đếm ký tự không gian dấu
  3. gọi String.substring(from, end) để tạo ra một chuỗi mới có chứa các ký tự mà bạn muốn giữ.

Cách tiếp cận này tránh sao chép bất kỳ ký tự nào .


1 - Thực ra, điều đó phụ thuộc vào việc triển khai String. Đối với một số triển khai sẽ không có sao chép, cho những người khác một bản sao được thực hiện. Nhưng một trong hai là cải tiến về cách tiếp cận của bạn, đòi hỏi tối thiểu 2 bản sao và nhiều hơn nữa nếu có bất kỳ ký tự nào để cắt.

0

Mảng đích newChars không đủ lớn để giữ các giá trị được sao chép. Bạn cần phải khởi tạo nó theo chiều dài của dữ liệu bạn định sao chép (vì vậy, chiều dài - 1).

3

Trước hết, những gì người khác nói về String.trim(). Thực sự, đừng sáng tạo lại bánh xe.

Nhưng để ghi lại, điều gì xảy ra với mã của bạn là các mảng Java không thể định lại được. Khi ban đầu bạn thiết lập mảng đích của mình, bạn tạo nó thành mảng có kích thước 0. Sau đó, bạn hãy thông báo cho System.arraycopy các nội dung len - 1 ký tự trong đó. Điều đó sẽ không hoạt động. Nếu bạn muốn nó hoạt động, bạn cần phải thiết lập mảng như sau:

char[] newChars = new char[len - 1]; 

Nhưng thật đáng kinh ngạc, tái phân bổ và sao chép mảng mới mỗi lần qua vòng lặp. Sử dụng ba bước mà Stephen C đã đề cập, kết thúc bằng một số substring.

2

Apache StringUtils.strip là câu trả lời tốt nhất ở đây mà làm việc với tất cả các ký tự khoảng trắng mong đợi (không chỉ là không gian), và can be downloaded here:

Dưới đây là các mã có liên quan ripped from this source file để thực hiện nó trong lớp học của riêng bạn nếu bạn muốn, nhưng thực sự , chỉ cần tải xuống và sử dụng StringUtils để nhận được nhiều bang hơn cho buck của bạn! Lưu ý rằng bạn có thể sử dụng StringUtils.stripStart để cắt bất kỳ ký tự hàng đầu nào khỏi chuỗi java.

public static String strip(final String str) { 
    return strip(str, null); 
} 

public static String stripStart(final String str, final String stripChars) { 
    int strLen; 
    if (str == null || (strLen = str.length()) == 0) { 
     return str; 
    } 
    int start = 0; 
    if (stripChars == null) { 
     while (start != strLen && Character.isWhitespace(str.charAt(start))) { 
      start++; 
     } 
    } else if (stripChars.isEmpty()) { 
     return str; 
    } else { 
     while (start != strLen && stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND) { 
      start++; 
     } 
    } 
    return str.substring(start); 
} 

public static String stripEnd(final String str, final String stripChars) { 
    int end; 
    if (str == null || (end = str.length()) == 0) { 
     return str; 
    } 

    if (stripChars == null) { 
     while (end != 0 && Character.isWhitespace(str.charAt(end - 1))) { 
      end--; 
     } 
    } else if (stripChars.isEmpty()) { 
     return str; 
    } else { 
     while (end != 0 && stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND) { 
      end--; 
     } 
    } 
    return str.substring(0, end); 
} 

public static String strip(String str, final String stripChars) { 
    if (isEmpty(str)) { 
     return str; 
    } 
    str = stripStart(str, stripChars); 
    return stripEnd(str, stripChars); 
} 
+1

Vì lợi ích của việc cắt và dán của người mù: public static final int INDEX_NOT_FOUND = -1; – Mike

1

Nếu bạn không muốn sử dụng phương thức String.trim() thì có thể triển khai như sau. Logic sẽ xử lý các kịch bản khác nhau như không gian, tab và các ký tự đặc biệt khác.

public static String trim(String str){ 
    int i=0; 
    int j = str.length(); 
    char[] charArray = str.toCharArray(); 
    while((i<j) && charArray[i] <=' '){ 
     i++; 
    } 
    while((i<j) && charArray[j-1]<= ' '){ 
     j--; 
    } 
    return str.substring(i, j+1); 

} 

public static void main(String[] args) { 
    System.out.println(trim(" abcd ght trip    ")); 

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