2011-01-02 26 views
7

Có cách nào để sử dụng str.charAt (index) để thay thế một char cụ thể theo chỉ mục? Một cái gì đó như thế này:str.setCharAt (index, 'X')

str.setCharAt(1,'X'); // replace 2nd char with 'X' 

Có cách nào dễ dàng để làm điều đó không?

Trả lời

9

Tùy thuộc vào nguồn gốc của str bạn có thể làm điều gì đó như thế này:

StringBuilder str = new StringBuilder("Test string"); 
str.setCharAt(1, 'X'); 
str.toString(); 

Nếu bạn có một chuỗi mà bạn đang vẽ ra và sửa đổi rất nhiều, nó có ý nghĩa hơn để sử dụng một StringBuilder thay vì một chuỗi. Tuy nhiên, nếu bạn đang sửa đổi một số String từ một cuộc gọi phương thức khác, các câu trả lời khác có thể phù hợp hơn.

+0

đợi !! Tôi mới này, nhưng java có StringBuffer và StringBuilder? tại sao họ không hợp nhất tất cả các hàm này trong lớp String cơ bản? – evilReiko

+3

@evilReiko A String là bất biến. I E. một khi được tạo, nó không thể thay đổi. Nó rất hiệu quả để sử dụng khi nó không có ý định thay đổi, nhưng nếu bạn cần thay đổi nội dung của nó, bạn cần phải sử dụng StringBuilder hoặc StringBuffer em họ Threadsafe của nó. Nếu bạn không làm việc trong môi trường đa luồng (hoặc cá thể StringBuilder của bạn chỉ có thể truy cập từ một luồng) thì StringBuilder là đủ bình thường. – jbx

+0

Nếu bạn có một StringBuffer đang được cập nhật bởi nhiều chủ đề tôi đề nghị bạn thay đổi chương trình của bạn để nó không;) –

4

StringBuilder có một phương pháp setCharAt() (nhờ @ John để xác định rằng bạn nên sử dụng nó trên StringBuffer):

StringBuilder sb = new StringBuilder(str); 
sb.setCharAt(1, 'X'); 
str = sb.toString(); 

Hoặc bạn có thể sử dụng substring(), đó là một chút lộn xộn và kém hiệu quả:

str = str.substring(0, 1) + 'X' + str.substring(2); 

Chuỗi không thay đổi (tốt, sort of), vì vậy bạn phải tạo một chuỗi mới và gán nó cho str.

+0

Tại sao sử dụng 'StringBuffer' và phí đồng bộ hóa cho một biến tạm thời không được truy cập bởi nhiều luồng? 'StringBuilder' là thích hợp hơn ở đây (xem câu trả lời của tôi). –

+0

@John Vì tôi không biết về sự khác biệt. Cảm ơn bạn đã chỉ ra điều đó. – marcog

1

Bạn có thể chia chuỗi tại các chỉ số, chèn chữ và sau đó nối các phần còn lại của chuỗi:

public static String replaceCharAt(String s, int pos, char c) 
{ 
    return s.substring(0, pos) + c + s.substring(pos + 1); 
} 

đâu s là chuỗi đầu vào.

+0

Điều đó thực sự không hiệu quả với tất cả việc tạo ra các chuỗi mới và trông cũng không đẹp lắm. Tại sao không sử dụng một trong nhiều phương thức đã được cung cấp trong StringBuilder? –

+1

OP yêu cầu một cách dễ dàng và không cung cấp bất kỳ điều kiện tiên quyết nào, như hiệu quả. Ngoài ra, nó luôn luôn có giá trị để tìm hiểu những cách khác nhau để thực hiện nhiệm vụ. –

3

Không chắc nếu điều này là nhiều hơn hoặc kém hiệu quả hơn so với các giải pháp đề xuất khác (mặc dù nó có vẻ đơn giản):

char[] chars = str.toCharArray(); 
chars[1] = 'X'; 
str = new String(chars); 

Đây là phương pháp tương tự đề xuất trong a related question.

+0

Tôi thích điều này, rất nhiều. –

1

Sử dụng lớp StringBuilder (không phải StringBuffer), nó có phương thức thay thế trông như sb.replace(0, 1, "X"); hoặc nếu nó luôn luôn là sử dụng char sb.setCharAt(0, 'X'); và rất hữu ích khi bạn muốn thay đổi chuỗi.