Phương thức thay thế chuỗi không thay thế các ký tự


79

Tôi có một câu được chuyển vào dưới dạng một chuỗi và tôi đang thực hiện thay thế từ "và" và tôi muốn thay thế nó bằng "". Và nó không thay thế từ "và" bằng khoảng trắng. Dưới đây là một ví dụ về logic của tôi. Và khi tôi gỡ lỗi điều này, logic sẽ rơi vào câu.replace.

String sentence = "Define, Measure, Analyze, Design and Verify"
if (sentence.contains("and")){
    sentence.replace("and", " ");
}

Có điều gì đó tôi đang thiếu ở đây.


33
Chuỗi là bất biến.
Matt Ball

Câu trả lời:


171

Và khi tôi gỡ lỗi điều này, logic sẽ rơi vào câu.replace.

Có, và sau đó bạn loại bỏ giá trị trả về.

Các chuỗi trong Java là bất biến - khi bạn gọi replace, nó không thay đổi nội dung của chuỗi hiện có - nó trả về một chuỗi mới với các sửa đổi. Vậy bạn muốn:

sentence = sentence.replace("and", " ");

Điều này áp dụng cho tất cả các phương thức trong String ( substring, toLowerCasev.v.). Không ai trong số họ thay đổi nội dung của chuỗi.

Lưu ý rằng bạn không thực sự cần phải làm điều này trong một điều kiện - xét cho cùng, nếu câu không chứa "and", việc thực hiện thay thế sẽ không có hại gì:

String sentence = "Define, Measure, Analyze, Design and Verify";
sentence = sentence.replace("and", " ");

2
Tôi phải gọi cho bạn để trả lời trùng lặp thay vì bỏ phiếu để kết thúc. Vấn đề này đã được hỏi và trả lời rất nhiều lần trước đây - thỏa thuận là gì, Jon?
Matt Ball

2
@MattBall Trong khi đồng ý các câu hỏi đã được hỏi nhiều lần, tôi nghĩ rằng đây là một câu trả lời tốt hơn, IHMO
MadProgrammer

20
@MattBall: Như thường lệ, tôi thấy việc đưa ra một câu trả lời hay và đầy đủ sẽ nhanh hơn là tìm một bản sao cũng có một câu trả lời hay. Tôi tin rằng (hơi tự cao tự đại, phải thừa nhận) rằng câu trả lời của tôi ở đây tốt hơn câu trả lời được chấp nhận trong bản sao mà bạn đã tìm thấy, điều này thậm chí không thực sự có ý nghĩa về mặt kỹ thuật. ("Bạn cần làm cho chuỗi của mình thực sự bằng với những thay đổi bạn thực hiện đối với chuỗi" - cái gì?) Ngoài ra, tôi muốn chỉ ra khía cạnh về việc không cần kiểm tra ngăn chặn trước.
Jon Skeet

Có thời gian để suy nghĩ về điều này, tôi cảm thấy đây là một câu trả lời tốt hơn.
yams,

68

Các chuỗi là bất biến , có nghĩa là nội dung của chúng không thể thay đổi. Khi bạn gọi, replace(this,that)bạn sẽ nhận được một Chuỗi hoàn toàn mới. Nếu bạn muốn giữ bản sao mới này, bạn cần gán nó cho một biến. Bạn có thể ghi đè tham chiếu cũ (a la sentence = sentence.replace(this,that)hoặc tham chiếu mới như hình dưới đây:

public class Test{

    public static void main(String[] args) {

        String sentence = "Define, Measure, Analyze, Design and Verify";

        String replaced = sentence.replace("and", "");
        System.out.println(replaced);

    }
}

Ngoài ra, hãy lưu ý rằng tôi đã xóa contains()séc, vì nó là một cuộc gọi không cần thiết ở đây. Nếu nó không chứa nó, người thay thế sẽ không thực hiện được bất kỳ sự thay thế nào. Bạn chỉ muốn phương thức chứa nếu những gì bạn đang thay thế khác với tình trạng thực tế mà bạn đang kiểm tra.


41
Nội dung của câu trả lời này ngụ ý rằng đó là contains()cuộc gọi gây ra sự cố - không phải vậy. Đó là một cuộc gọi không cần thiết, nhưng nó thực sự không gây ra bất kỳ vấn đề nào. Vấn đề là do bỏ qua giá trị trả về replace, điều này không được giải thích trong câu trả lời.
Jon Skeet

@ Mr.Jon Skeet, tôi thực sự xin lỗi, nếu văn bản trong câu trả lời ngụ ý ngược lại ... nhưng khi tôi nói rằng nó không bắt buộc, tôi có nghĩa là nó không cần thiết .... tốt tôi sẽ đưa nó vào câu trả lời nó rõ ràng hơn .....
Kumar Vivek Mitra

Sẽ không tốt hơn nếu bạn làm vậysentence.replace(" and", ",");
Khaled.K

@JonSkeet và những người khác - Tôi đã thêm một đoạn thực sự giải thích chuyện gì đang xảy ra và chuyển đoạn văn bản gây hiểu nhầm xuống cuối, vì nó khá thừa đối với vấn đề thực sự đang diễn ra.
corsiKa

3
@corsiKa: Thành thật mà nói, tôi sẽ không làm điều đó như một chỉnh sửa cho câu trả lời hiện có của người khác. Nó thay đổi ý nghĩa của câu trả lời khá đáng kể.
Jon Skeet

9

Bạn không làm gì với giá trị trả về là replace. Bạn sẽ cần gán kết quả của phương thức mới String:

sentence = sentence.replace("and", " ");

A Stringlà bất biến trong java. Các phương thức như replacetrả về một mới String.

Bạn containskiểm tra là không cần thiết: replacesẽ chỉ không-op nếu có không phải là trường hợp của văn bản để thay thế.


Logic chứa của tôi là cần thiết vì có những trường hợp tôi sẽ không muốn thay thế điều này. Logic không chính xác như thế này, tôi chỉ lấy cái này làm ví dụ.
yams

@MarkBasler: Logic chứa của bạn không cần thiết cho mẫu bạn đã đưa ra, vì vậy bạn không nên đưa nó vào. Các câu hỏi hay chỉ nên chứa những gì chúng cần để chỉ ra vấn đề - bằng cách đưa vào đoạn mã vô nghĩa trong tình huống mà bạn cung cấp, bạn đã thêm một sự phân tâm vào câu hỏi.
Jon Skeet

Tôi đã quan tâm đến vật chứa Tôi lo lắng về sự thay thế.
yams

Bằng cách bạn đánh dấu nó là một bản sao và trả lời nó. Luôn sang trọng.
yams

Xin chào @MarkBasler: Tôi đang cố gắng trợ giúp. Tôi không thấy có mâu thuẫn với hai hành động: vấn đề của bạn là một vấn đề cực kỳ phổ biến luôn được hỏi: chuỗi java là bất biến. Khi tôi đánh dấu một câu hỏi là trùng lặp, tôi đang cố gắng cải thiện chất lượng câu hỏi và câu trả lời ở đây, nhưng đồng thời, khi để lại câu trả lời cụ thể cho câu hỏi của bạn, tôi hy vọng sẽ cung cấp cho bạn thêm trợ giúp tức thì, cụ thể cho ví dụ của bạn . Bạn có thể thấy câu hỏi này trên meta hữu ích.
pb2q,

8

Bạn nên gán lại kết quả của sự thay thế, như sau:

 sentence = sentence.replace("and", " ");

Lưu ý rằng Stringlớp là không thay đổi , có nghĩa là tất cả các phương thức của nó trả về một chuỗi mới và không bao giờ sửa đổi chuỗi ban đầu tại chỗ, vì vậy kết quả của việc gọi một phương thức trong một phiên bản của Stringphải được gán cho một biến hoặc được sử dụng ngay lập tức cho thay đổi để có hiệu lực.


Chuỗi phải là bất biến, nhưng có một số lỗi với String lib, cho phép bạn sửa đổi chuỗi ban đầu.
yams

4
@MarkBasler: Ừm, chính xác thì bạn đang nói về lỗi nào vậy? Và nếu bạn nhận thức được rằng chuỗi là không thay đổi, đó là không rõ ràng lý do tại sao bạn mong đợi mã của bạn để làm việc tại tất cả các ...
Jon Skeet

-1
package com.tulu.ds;

public class EmailSecurity {
    public static void main(String[] args) {
        System.out.println(returnSecuredEmailID("sample717@gmail.com"));
    }
    private static String returnSecuredEmailID(String email){
        String str=email.substring(1, email.lastIndexOf("@")-1);
        return email.replaceAll(email.substring(1, email.lastIndexOf("@")-1),replacewith(str.length(),"*"));
    }
    private static String replacewith(int length,String replace) {
        String finalStr="";
        for(int i=0;i<length;i++){
            finalStr+=replace;
        }
        return finalStr;
    }   
}

3
Vui lòng không viết câu trả lời chỉ có mã, thay vào đó, hãy giải thích cách mã của bạn giải quyết vấn đề của OP. Từ đánh giá
abccd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.