Chuẩn hóa xâu s viết hoa đầu mỗi từ năm 2024

Để chuẩn hóa xâu trong Java, chúng ta cần xóa các khoảng trắng thừa ở đầu, cuối và giữa xâu. Trước tiên chúng tay hãy xóa các khoảng trắng ở đầu và cuối bằng phương thức trim(). VD ta có:

String str = " nguyen van quan 7826 "; str = str.trim();

Tiếp theo công việc của chúng ta sẽ là cắt bỏ các khoảng trắng thừa ở giữa xâu. Để làm việc này có nhiều cách, ở đây tôi nêu ra 2 cách cơ bản: Cách 1:

while (str.indexOf(" ") != -1) str = str.replaceAll(" "," ");

+/ s1.indexOf(s2) : phương thức trả về vị trí của s2 trong s1. +/ s.replaceAll(s1,s2) : phương thức thay thế tất cả chuỗi s1 thành s2 trong s. nhưng chỉ duyệt chuỗi s 1 lần. Vì vậy ta cần kết hợp cả vòng while để có thể thay thế tất cả. Cách 2:

str = str.replaceAll("\s+", " ");

Chương trình minh họa

class java_chuanhoaxau {

public static void main(String[] sgr)
{
    String str = "    nguyen     van     quan   7826    ";
    str = str.trim();
    str = str.replaceAll("\\s+"," ");
    System.out.println(str);
}
}

\=== update === Như trên chúng ta đã chuẩn hóa được chuỗi bằng cách xóa bỏ các khoảng trắng vô nghĩa. Bây giờ ta sẽ chuẩn hóa các từ mà sẽ viết hoa đầu từ kiểu như các danh từ riêng (Hà Nội, Việt Nam hoặc Nguyễn Văn Quân, …) Để làm điều này thì trước tiên chúng ta cứ chuẩn hóa bình thường như trên đã. Bước tiếp theo là viết hoa các ký tự đầu tiên của mỗi từ. Ta sử dụng phương thức split() để tách xâu thành mảng các từ. Sau đó dùng String.valueOf().toUperCase() để viết hoa ký tự đầu tiên mỗi từ cuối cùng là nối với các ký tự còn lại của chúng bằng substring(1). Vậy là đã có mảng các từ viết hoa, tiếp theo là nối các từ lại với nhau và cách nhau 1 dấu cách.

package vietSource.net; public class ChuanHoaXau {

public String chuanHoa(String str) {
    str = str.trim();
    str = str.replaceAll("\\s+", " ");
    return str;
}
public String chuanHoaDanhTuRieng(String str) {
    str = chuanHoa(str);
    String temp[] = str.split(" ");
    str = ""; // ? ^-^
    for (int i = 0; i < temp.length; i++) {
        str += String.valueOf(temp[i].charAt(0)).toUpperCase() + temp[i].substring(1);
        if (i < temp.length - 1) // ? ^-^
            str += " ";
    }
    return str;
}
public static void main(String[] sgr) {
    String str = "    nguyen     van     quan   7826    ";
    ChuanHoaXau chx = new ChuanHoaXau();
    str = chx.chuanHoaDanhTuRieng(str);
    System.out.println(str);
}
}

Điều hướng bài viết

Lam đặt tên các biến trong mã nguồn chương trình của mình theo chuẩn PropCase. Chuẩn PropCase quy ước như sau:

  • Tên biến gồm các chữ cái Latinh 'A'..'Z', 'a'..'z' và chữ số '0'..'9';
  • Chữ cái đầu tiên của tên biến không bắt đầu bằng chữ số '0'..'9';
  • Chữ cái đầu tiên của mỗi từ tiếp theo trong tên biến được viết in hoa;
  • Ví dụ: DiemTbHk1, lop9A10, ...

Lam muốn tải mã nguồn của mình lên Github với các biến được đặt tên theo chuẩn join_case có quy ước:

  • Tên biến gồm các chữ cái Latinh 'a'..'z', chữ số '0'..'9' và dấu gạch nối '_';
  • Không bắt đầu bằng chữ số '0'..'9' hoặc dấu gạch nối '_';
  • Hai từ trong tên biến được tách nhau bởi dấu '_';
  • Ví dụ: diem_tb_hk1, lop9_a10, ...

Yêu cầu:

Hãy giúp Lam đổi tên biến từ chuẩn PropCase sang chuẩn join_case.

Dữ liệu:

Vào từ tệp CAU1.INP gồm một xâu độ dài n (1≤n≤1000) là một tên biến đặt theo chuẩn PropCase.

Kết quả:

Ghi ra tệp CAU1.OUT một xâu là tên biến đặt lại theo chuẩn join_case.

Ví dụ 1:

CAU1.INP

DiemTbHk1

CAU1.OUT

diem_tb_hk1

Ví dụ 2:

CAU1.INP

lop9A10

CAU1.OUT

lop9_a10


Chuẩn hóa tên là một công việc thường gặp khi xử lý chuỗi, trong bài viết này mình sẽ hướng dẫn các bạn phương pháp để bạn có thể chuẩn hóa tên theo nhiều yêu cầu khác nhau

NỘI DUNG :

  • Bài toán chuẩn hóa tên 1
  • Bài toán chuẩn hóa tên 2
  • Bài toán cấp email theo tên
  • Video tutorial

chuẩn hóa tên

1. Bài toán chuẩn hóa tên 1

Bài toán này sẽ yêu cầu bạn chuẩn hóa tên bằng cách loại bỏ dấu cách thừa giữa các từ và viết hoa chữ cái đầu của từng từ.

Ví dụ " nguYEN Thuy linH" => "Nguyen Thuy Linh"

Phương pháp làm những bài toán chuẩn hóa tên đó là bạn nên tách từng từ ra sau đó xử lý từng từ và gộp lại

Nếu bạn chưa học phương pháp tách từ trong xâu thì bạn có thể tham khảo tại đây

Code :

include "stdio.h"

include "string.h"

include "stdlib.h"

include "ctype.h"

char* chuanHoaTu(char *s){

s[0] = toupper(s[0]);  
for(int i = 1; i < strlen(s); i++){  
    s[i] = tolower(s[i]);  
}  
return s;  
} int main(){
char s[1000] = "NGuyeN   vAN   hOANg  ";  
char res[1000] = "";  
char *token = strtok(s, " ");  
while(token != NULL){  
    strcat(res, chuanHoaTu(token));  
    token = strtok(NULL, " ");  
    if(token != NULL){  
        strcat(res, " ");  
    }  
}  
printf("Ten sau khi chuan hoa:\n");  
printf("%s\n", res);  
return 0;  
}

Output :

Ten sau khi chuan hoa: Nguyen Van Hoang

Bạn có thể in ra luôn token tách được sau khi chuẩn hóa hoặc lưu vào xâu kết quả như mình rồi in ra sau.

Code dưới đây mình sẽ viết 1 hàm trả về chuỗi tên chuẩn hóa, các bạn có thể lựa chọn cách mà mình thấy phù hợp

Code :

include "stdio.h"

include "string.h"

include "stdlib.h"

include "ctype.h"

char* chuanHoaTu(char *s){

s[0] = toupper(s[0]);  
for(int i = 1; i < strlen(s); i++){  
    s[i] = tolower(s[i]);  
}  
return s;  
} char *chuanHoaTen(char *s, char *res){
char *token = strtok(s, " ");  
while(token != NULL){  
    strcat(res, chuanHoaTu(token));  
    token = strtok(NULL, " ");  
    if(token != NULL){  
        strcat(res, " ");  
    }  
}  
return res;  
} int main(){
char s[1000] = "NGuyeN   vAN   hOANg  ";  
char res[1000] = "";  
printf("Ten sau khi chuan hoa:\n");  
char *name = chuanHoaTen(s, res);  
printf("%s\n", name);   
return 0;  
}

Output :

Ten sau khi chuan hoa: Nguyen Van Hoang


2. Bài toán chuẩn hóa tên 2

Bài toán này yêu cần bạn in ra tên trước rồi mới tới họ và đệm

Ví dụ "tran VaN TeCH28" => "Tech28 Tran Van"

Trong trường hợp bài toán chuẩn hóa tên yêu cầu bạn in ra thứ tự từ không như ban đầu thì ta nên lưu lại các từ vào mảng 2 chiều, điều này sẽ thuận tiện hơn cho việc in ra từ nào trước từ sao sau.

Nếu bạn chưa biết cách lưu lại các từ trong xâu vào mảng 2 chiều thì bạn có thể tham khảo tại đây

Code :

include "stdio.h"

include "string.h"

include "stdlib.h"

include "ctype.h"

char* chuanHoaTu(char *s){

s[0] = toupper(s[0]);  
for(int i = 1; i < strlen(s); i++){  
    s[i] = tolower(s[i]);  
}  
return s;  
} int main(){
char s[1000] = "NGuyeN   vAN   hOANg  ";  
char a[100][50];  
int n = 0;   
char *token = strtok(s, " ");  
while(token != NULL){  
    strcpy(a[n], chuanHoaTu(token));  
    ++n;  
    token = strtok(NULL, " ");  
}  
printf("Ten sau khi chuan hoa :\n");  
printf("%s ", a[n - 1]);   
for(int i = 0; i < n - 1; i++){  
    printf("%s", a[i]);  
    if(i != n - 2){  
        printf(" ");  
    }  
}  
return 0;  
}

Output :

Ten sau khi chuan hoa : Hoang Nguyen Van

Bằng cách lưu từng từ trong tên vào mảng thì bạn có thể chủ động trong việc in ra theo thứ tự mà đề bài yêu cầu.


3. Bài toán cấp email theo tên

Bài toán cấp email thường gặp khi bạn cần cung cấp email cho các nhân viên trong 1 công ty hay các sinh viên trong trường đại học dựa trên tên của họ.