2012-06-22 77 views
15

Tôi đang cố gắng viết một phương thức xóa tất cả các ký tự không phải chữ cái từ Java String[] và sau đó chuyển đổi chuỗi thành chuỗi chữ thường. Tôi đã thử sử dụng cụm từ thông dụng để thay thế sự xuất hiện của tất cả các ký tự không phải chữ cái theo "". Tuy nhiên, đầu ra mà tôi nhận được không thể làm như vậy. Đây là mãXóa tất cả các ký tự không phải chữ cái từ một mảng String trong java

static String[] inputValidator(String[] line) { 
     for (int i = 0; i < line.length; i++) { 
         line[i].replaceAll("[^a-zA-Z]", ""); 
         line[i].toLowerCase(); 
     } 
     return line; 
    } 

Tuy nhiên nếu tôi cố gắng cung cấp một đầu vào có bảng chữ cái không (nói - hoặc .) đầu ra cũng bao gồm trong số họ, vì họ không được gỡ bỏ.

Example Input

A dog is an animal. Animals are not people. 

Output mà tôi nhận được

A 
dog 
is 
an 
animal. 
Animals 
are 
not 
people. 

Output rằng dự kiến ​​

a 
dog 
is 
an 
animal 
animals 
are 
not 
people 
+1

Dưới đây là một hoạt động mẫu để kiểm tra phương pháp http://ideone.com/XOugF – hytriutucx

Trả lời

29

Sự cố là các thay đổi của bạn không được lưu trữ vì các chuỗi là immutable. Mỗi số method calls sẽ trả lại số String mới đại diện cho thay đổi, với số String hiện tại vẫn giữ nguyên. Bạn chỉ cần lưu trữ trả lại String trở lại mảng.

line[i] = line[i].replaceAll("[^a-zA-Z]", ""); 
line[i] = line[i].toLowerCase(); 

Vì mỗi phương pháp đều trả về String, bạn có thể kết hợp các phương thức của bạn với nhau. Điều này sẽ thực hiện cuộc gọi phương thức thứ hai trên kết quả của lần đầu tiên, cho phép bạn thực hiện cả hai hành động trong một dòng.

line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase(); 
2

Nó không hoạt động vì chuỗi không thay đổi được, bạn cần đặt giá trị ví dụ:

line[i] = line[i].toLowerCase(); 
+0

Sean, bạn bỏ lỡ cuộc gọi ReplaceAll ở đó. –

+0

tôi sẽ chỉnh sửa nó trong nhưng một khi tôi gửi và 3 phản ứng khác tồn tại nói rằng cùng một điều tôi đã không nhìn thấy điểm. –

2

Bạn phải phân công lại là kết quả của toLowerCase()replaceAll() trở lại line[i], vì Java String là bất biến (giá trị nội tại của nó không bao giờ thay đổi, và các phương pháp trong String lớp sẽ trả về một đối tượng mới String thay vì sửa đổi đối tượng String).

5

Bạn cần chỉ định kết quả của regex của mình trở lại dòng [i].

for (int i = 0; i < line.length; i++) { 
    line[i] = line[i].replaceAll("[^a-zA-Z]", "").toLowerCase(); 
} 
1

Một mát mẻ (nhưng hơi cồng kềnh, nếu bạn không thích đúc) cách làm những gì bạn muốn làm là đi qua toàn bộ chuỗi, chỉ số của chỉ số, đúc mỗi kết quả từ String.charAt (index) đến (byte), và sau đó kiểm tra xem byte đó là a) trong dãy số của các ký tự chữ thường (a = 97 đến z = 122), trong trường hợp này, nó sẽ quay trở lại char và thêm nó vào một Chuỗi, mảng hoặc những gì bạn có, hoặc b) trong phạm vi số của các ký tự chữ cái viết hoa (A = 65 đến Z = 90), trong trường hợp này thêm 32 (A + 22 = 65 + 32 = 97 = a) và truyền nó thành char và thêm nó vào. Nếu nó không nằm trong phạm vi đó, chỉ cần loại bỏ nó.

1

Vì nó đã trả lời, chỉ cần nghĩ đến việc chia sẻ một cách hơn mà không được đề cập ở đây>

str = str.replaceAll("\\P{Alnum}", "").toLowerCase(); 
+0

Mặc dù điều này là rộng hơn so với chỉ các chữ cái latin phù hợp với mã OPs; điều đó có thể hoặc không thể là những gì cần thiết. –

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