2013-03-06 37 views
29

Tôi đang cố gắng lấy ba dấu ngoặc đơn cuối cùng của chuỗi bất kỳ và lưu nó thành một biến Chuỗi khác. Tôi đang có một thời gian khó khăn với quá trình suy nghĩ của mình.Nhận ba ký tự cuối từ bất kỳ chuỗi nào - Java

String word = "onetwotwoone" 
int length = word.length(); 
String new_word = id.getChars(length-3, length, buffer, index); 

Tôi không biết cách sử dụng phương thức getChars khi nói đến bộ đệm hoặc chỉ mục. Eclipse đang khiến tôi có những thứ trong đó. Bất kỳ đề xuất?

+0

Bộ đệm là một 'char []' trong đó các ký tự sẽ đi và chỉ mục là khởi đầu của mảng đó, nơi bạn muốn bắt đầu sao chép. Chỉ cần tạo một char [] kích thước 3 và thiết lập chỉ mục là 0. Mặc dù chuỗi con có lẽ sẽ tốt hơn –

+0

đồng ý với dấu chuyển đổi thành char [] (String.toCharArray() và sau đó in 3) – amitmah

Trả lời

106

Tại sao không chỉ String substr = word.substring(word.length() - 3)?

Cập nhật

Hãy chắc chắn rằng bạn kiểm tra xem String là ít nhất 3 ký tự dài trước khi gọi substring():

if (word.length() == 3) { 
    return word; 
} else if (word.length() > 3) { 
    return word.substring(word.length() - 3); 
} else { 
    // whatever is appropriate in this case 
    throw new IllegalArgumentException("word has less than 3 characters!"); 
} 
+0

Có thể phải cẩn thận với chuỗi với ít hơn ba ký tự, tôi nghĩ đầu vào âm sẽ trả về chuỗi gốc (có thể sai về điều đó), có thể hoặc không thể chấp nhận được cho những gì họ đang cố gắng hoàn thành. – celestialorb

+1

@celestialorb: chỉ số âm sẽ gây ra ngoại lệ, theo [tài liệu] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring%28int%29). – MvG

+0

@celestialorb, Cảm ơn bạn đã đề cập, dù sao mã ban đầu từ câu hỏi cũng có để xử lý ngoại lệ, vì vậy tôi đã không suy nghĩ về vấn đề này. – Egor

1

String newString = originalString.substring(originalString.length()-3);

+0

@MvG: Cập nhật câu trả lời.Đó là lỗi đánh máy – Cratylus

0

Phương pháp getChars chuỗi không trả lại một giá trị thay vào đó, nó kết quả của nó vào mảng đệm (hoặc đích) của bạn. Tham số chỉ số mô tả độ lệch bắt đầu trong mảng đích của bạn.

Hãy thử điều này link để có mô tả chi tiết hơn về phương pháp getChars.

Tôi đồng ý với những người khác về điều này, tôi nghĩ chuỗi con sẽ là cách tốt hơn để xử lý những gì bạn đang cố gắng hoàn thành.

0

Bạn có thể sử dụng một chuỗi

String word = "onetwotwoone" 
int lenght = word.length 
String numbers = word.substring(word.length() - 3); 
+0

nó phải là 'word.length()' – Shardul

3
public String getLastThree(String myString) { 
    if(myString.length() > 3) 
     return myString.substring(myString.length()-3); 
    else 
     return myString; 
} 
1

Nếu bạn muốn String gồm ba nhân vật cuối cùng, bạn có thể sử dụng substring(int):

String new_word = word.substring(word.length() - 3); 

Nếu bạn thực sự muốn chúng như là một mảng ký tự, bạn nên viết

char[] buffer = new char[3]; 
int length = word.length(); 
word.getChars(length - 3, length, buffer, 0); 

Hai đối số đầu tiên để getChars biểu thị phần của chuỗi bạn muốn trích xuất. Đối số thứ ba là mảng mà phần đó sẽ được đặt. Và đối số cuối cùng cho vị trí trong bộ đệm nơi hoạt động bắt đầu.

Nếu chuỗi có ít hơn ba ký tự, bạn sẽ nhận được ngoại lệ trong một trong các trường hợp trên, vì vậy bạn có thể muốn kiểm tra điều đó.

12

Dưới đây là một số mã ngắn gọn mà không được công việc sử dụng regex:

String last3 = str.replaceAll(".*?(.?.?.?)?$", "$1"); 

Mã này trả về lên đến 3; nếu có ít hơn 3 nó chỉ trả về chuỗi.

Đây là cách để làm điều đó an toàn mà không regex trong một dòng:

String last3 = str == null || str.length() < 3 ? 
    str : str.substring(str.length() - 3); 

Bằng cách "an toàn", ý tôi là không ném một ngoại lệ nếu chuỗi là null hoặc ngắn hơn 3 ký tự (tất cả các các câu trả lời khác không phải là "an toàn").


Đoạn mã trên là giống hệt nhau có hiệu lực mã này, nếu bạn muốn có một tiết hơn, nhưng có khả năng dễ dàng hơn để đọc dạng:

String last3; 
if (str == null || str.length() < 3) { 
    last3 = str; 
} else { 
    last3 = str.substring(str.length() - 3); 
} 
+0

Có thể, nhưng khá khó hiểu với toán tử bậc ba và thiếu dấu ngoặc đơn. Vì vậy, tôi khuyên bạn nên chống lại điều đó ở đây. -1. – MvG

+1

@MvG để câu trả lời này "không hữu ích"? (Đó là ý nghĩa của 1 phiếu bầu). Tại sao việc sử dụng cú pháp ternary không hữu ích? Và bạn sẽ đặt dấu ngoặc vuông ở đâu? Ngược lại, tôi nghĩ rằng câu trả lời này là hữu ích, đặc biệt là xem xét tất cả những người khác sẽ phát nổ nếu đưa một null hoặc một đầu vào ngắn. – Bohemian

+0

Không hữu ích vì tôi tin (xin lỗi nếu tôi sai ở đó) rằng hầu hết người dùng đang đấu tranh với cách trích xuất chuỗi con từ một chuỗi nhất định, sẽ được thực hiện trên đầu của họ để đọc mã của bạn. Kiểm tra chiều dài là tất cả rất tốt, nhưng ở cấp độ này tôi muốn xem xét các giải pháp chi tiết hơn hữu ích, và các giải pháp khó hiểu chỉ gây nhầm lẫn. Đối với dấu ngoặc đơn: Tôi sẽ viết '… = ((… ||…)?…:…) '. Các dòng bọc bạn thêm vào làm cho mọi thứ tốt hơn rất nhiều, quá. – MvG

6

tôi sẽ xem xét right phương pháp từ StringUtils lớp từ Apache Commons Lang: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#right(java.lang.String,%20int)

Nó an toàn. Bạn sẽ không nhận được NullPointerException hoặc StringIndexOutOfBoundsException.

Ví dụ sử dụng:

StringUtils.right("abcdef", 3)

Bạn có thể tìm thêm ví dụ dưới sự liên kết ở trên.

+0

Trong Android chức năng này không có ở đây – Pranaysharma

+2

Đây phải là câu trả lời đúng! – hackingforgirls

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