Chuẩn hóa xâu trong Java – Bài tập xử lý xâu kí tự String

0
2368
chuan hoa xau ki tu string trong java

Chuẩn hóa xâu trong Java, xóa khoảng trắng thừa, xử lý chuỗi trong java. Bài tập thao tác với xâu kí tự sử dụng một số hàm xử lý String như Split, trim, cắt chuỗi, tìm chuỗi con, đếm kí tự, từ . . .

1. Chuẩn hóa xâu là gì?

Khi nhắc đến việc xử lý chuỗi, thao tác với chuỗi thì việc chuẩn hóa xâu kí tự là việc làm đầu tiên mà bất kì người mới học lập trình nào cũng đều phải biết.

Chuẩn hóa xâu ở đây chính là việc xử lý một chuỗi (xâu kí tự) dạng String, char về một định dạng theo một quy chuẩn nào đó. Thường sẽ là xóa bỏ khoảng trắng dư thừa trong xâu. Chuẩn hóa thành định dạng tên riêng ( viết hoa chữ cái đầu) . . .

Ví dụ:

// Xâu chưa chuẩn hóa
String st = "    ***  welCoMe   to    taiLiEu.pro     **      ";

// Xâu sau khi chuẩn hoát

st = "** Welcome To Tailieu.pro **"

Java là ngôn ngữ được đánh giá là xử lý chuỗi mạnh nhất. Nó có thư viện khủng với các phương thức giúp việc chuẩn hóa cực kì dễ dàng, mạnh hơn rất nhiều so với ngôn ngữ khác. Trong bài viết này mình sẽ cùng bạn tìm hiểu về nó nhé!

2. Giới thiệu bài toán

Đề bài mình sẽ tóm tắt lại như sau:
Xây dựng lớp ChuanHoaXau có thuộc tính là một xâu kí tự. Viết các phương thức cho phép

  • Nhập xâu từ bàn phím, in xâu vừa nhập ra màn hình
  • Phương thức chuẩn hóa xâu theo quy tắc: Xóa bỏ khoảng trắng dư thừa, viết hoa kí tự đầu tiên của mỗi từ.
  • Phương thức đếm kí tự đặc biệt của xâu ( kí tự đặc biệt là kí tự không phải chữ, không phải số)
  • Mở rộng xây dựng phương thức đếm số từ bắt đầu bằng kí tự “T”.

Phần cuối cùng của bài viết mình sẽ có full source code cho bài toán này nhé!

3. Chuẩn hóa xâu bằng Java

Phần nhập xâu, xuất xâu thì không có gì khó khăn. Bây giờ mình sẽ giải quyết phần chuẩn hóa xâu trước.

3.1 Xóa khoảng trắng thừa

Lớp String trong java có rất nhiều phương thức hỗ trợ việc chuẩn hóa. Giả xử xâu ban đầu có định dạng là:

String st = "    ***  welCoMe   to    taiLiEu.pro     **      ";

Đầu tiên chúng ta sẽ sử dụng hàm trim(), kết hợp sử dụng hàm tolowercase(). Hàm trim() để xóa bỏ khoảng trắng ở đầu và cuối xâu st, hàm tolowercase() giúp biến toàn bộ các kí tự thành chữ thường.

Tiếp theo chúng ta sử dụng hàm replaceAll(“String1”, “String2”) . Hàm này sẽ sửa hết toàn bộ các String1 trong xâu st thành String2.

Xâu “\\s+” là một xâu đặc biệt trong Java. Xâu này là định nghĩa cho xâu gồm tất cả các khoảng trắng liên tục. Chúng ta sẽ sửa nó thành một khoảng trắng ” ” là được.

public void chuannHoa() {
		st=st.trim().toLowerCase();
                st = st.replaceAll("\\s+", " ");

	}

3.2 Viết hoa chữ cái đầu tiên

Xong đoạn xóa khoảng trắng. Bây giờ đến đoạn biến các chữ cái đầu của mỗi từ thành chữ cái in hoa.

Cách giải quyết được nhiều người sử dụng nhất đó là: Tách xâu st thành các xâu con dựa vào các khoảng trắng. Sau đó viết hoa chữ cái đầu tiên của mỗi xâu con. Cuối cùng ghép lại thành xâu st ban đầu.

Để thực hiện tách, bạn cần khai báo một mảng String temp[] dùng để lưu trữ các xâu con.

Tiếp tục sử dụng một hàm cực kì bá đạo, hàm split(). Hàm này sẽ tác chuỗi thành các chuỗi con dựa vào kí tự truyền vào. Ở đây chúng ta sẽ tách các xâu con dựa vào dấu cách.

String[] temp= st.split(" ");

Sau đó ta tiến hành duyệt từng phần tử của mảng temp. và thực hiện câu lệnh

t+=String.valueOf(temp[i].charAt(0)).toUpperCase() + temp[i].substring(1)

Trong đó:

  • Hàm String.valueOf() để biến một kí tự kiểu bất kì thành kiểu String. Ở cùng kiểu String thì mới cộng được các xâu lại với nhau, có hàm toUppercase().
  • Hàm temp[i].charAt(0) : Hàm để lấy một phần tử ở vị trí 0 của xâu temp thành kiểu char. Chúng ta phải dùng hàm này mới lấy được phần tử ở vị trí 0 của xâu con temp[i]
  • Hàm toUppercase() để biến kí tự đầu tiên thành chữ hoa
  • Hàm temp[i].substring(1) dùng để lấy toàn bộ các phần tử từ vị trí 1 đến cuối xâu temp[i]

Kết quả là ta đã viết hoa chữ cái đầu tiên của xâu temp[i].
Tiến hành duyệt mảng để thực hiện với mọi xâu temp[i]. Với mỗi phần tử duyệt xong ta đem cộng chúng với xâu st và một khoảng cách.

	public void chuannHoa() {
		st=st.trim().toLowerCase();
		st = st.replaceAll("\\s+", " ");
		String[] temp= st.split(" ");
                // sau khi tách xong, gán xâu st thành sâu rỗng
		st="";
		for(int i=0;i<temp.length;i++) {
			st+=String.valueOf(temp[i].charAt(0)).toUpperCase() + temp[i].substring(1);
			if(i<temp.length-1) // nếu tempt[i] không phải từ cuối cùng
				st+=" ";   // cộng thêm một khoảng trắng
		}
	}

Văn phong của mình có thể hơi khó hiểu, bạn xem code cụ thể là hiểu ngay.

3.3 Hàm đếm các kí tự đặc biệt

Đây là một nội dung mở rộng cho bài toán của mình. Cách thực hiện rất đơn giản. Bạn chỉ cần cho vòng lặp duyệt từ phần tử đầu tiên đến phần tử cuối cùng của xâu.

	// Đếm kí tự đặc biệt tron xâu st
       public int demKTDB() {
		int ktDB =0;
		for(int i=0;i<st.length();i++)
			if(! Character.isLetterOrDigit(st.charAt(i)))
				ktDB+=1;
		return ktDB;
	}

3.4 Đếm từ bắt đầu bằng chữ cái bất kì

Ở đây mình sẽ đếm số từ bắt đầu bằng chữ “T”. Bạn cũng có thể ứng dụng để viết hàm tìm kiếm xâu con nhập vào từ bàn phím . . .

Thuật toán rất đơn giản. Đầu tiên kiểm tra xem từ đầu tiên có phải từ bắt đầu bằng kí tự ‘T’ không. Nếu có tăng biến đếm thêm 1.


Tiếp theo tiến hành duyệt mảng từ vị trí 1 đến vị trí cuối cùng. Nếu ở vị trí i là ‘ ‘ và i +1 là kí tự ‘T’. Tiến hành tăng biến đếm.

// Hàm đếm từ xuất hiện bằng kí tự T.
	public int countLetter() {
		int letter =0;  // Biến đếm
                // Kiểm tra chữ đầu tiên
		if(st.charAt(0)=='T');
		    letter+=1;
		for(int i=1;i<st.length()-1;i++)
			if(st.charAt(i)==' ' &amp;&amp; st.charAt(i+1)=='T')
				letter+=1;
		return letter;
	}

4. Chương trình hoàn chỉnh

Ghép lại các phần bên trên sau đó chỉnh sửa, thêm bớt một chút. Là có toàn bộ một chương trình hoàn chỉnh như phần dưới.

/* Github: https://github.com/duongdinh24/
 * @author by admin tailieu.pro
 * 
 * De bai:
 * Nhap vao xau, dem so ki tu dac biet ( isLetterOrDigit
 * Dem so tu bat dau bang ki tu T
 * Chuan hoa xau : xoa khoang trang thua, chu cai dau tien viet hoa
 */
import java.io.*;
import java.util.*;

public class ChuanHoaXau {
	private String st;
	public ChuanHoaXau(String s) {
		st=s;
	}
	
	public ChuanHoaXau() {}
	
//  Hàm nhập String từ bàn phím có sử dụng try catch
	String nhapString() {
		String x;
		DataInputStream ip = new DataInputStream(System.in);
		try {
			x=ip.readLine();
		}
		catch(Exception e) {
			System.out.println("Nhap lai!");
			x=nhapString();
		}
		return x;
	}
	
	public void nhapXau() {
		System.out.println("Nhap xau: ");
		st=nhapString();
	}
	
	public void hienThi() {
		System.out.println(st);
	}
	
// Hàm đếm kí tự đặc biệt
	public int demKTDB() {
		int ktDB =0;
		for(int i=0;i<st.length();i++)
			if(! Character.isLetterOrDigit(st.charAt(i)))
				ktDB+=1;
		return ktDB;
	}

// Hàm chuẩn hóa xâu
	public void chuannHoa() {
		st=st.trim().toLowerCase();
		st = st.replaceAll("\\s+", " ");
		String[] temp= st.split(" ");
		st="";
		for(int i=0;i<temp.length;i++) {
			st+=String.valueOf(temp[i].charAt(0)).toUpperCase() + temp[i].substring(1);
			if(i<temp.length-1)
				st+=" ";
		}
	}

// Hàm đếm từ xuất hiện bằng kí tự T.
	public int countLetter() {
		int letter =0;
                // Kiểm tra chữ đầu tiên
		if(st.charAt(0)=='T');
		    letter+=1;
		for(int i=1;i<st.length()-1;i++)
			if(st.charAt(i)==' ' &amp;&amp; st.charAt(i+1)=='T')
				letter+=1;
		return letter;
	}

// Hàm main()
	public static void main(String[] args) {
		ChuanHoaXau a = new ChuanHoaXau();  // khai báo đối tượng a thuộc class ChuanHoaXau
		a.nhapXau();   /// gọi phương thức nhập
		System.out.println("Xau co "+a.demKTDB()+" ky tu db!");  // Gọi phương thức đếm KTDB
		a.chuannHoa();   // Chuẩn hóa
		System.out.println("Xau sau khi chuan hoa: ");
		a.hienThi();

                // Gọi hàm đếm từ xuất hiện bằng chữ 'T'
		System.out.println("Co "+a.countLetter()+" tu xuat hien bang chu T!");
	}
}

Kết quả khi chạy chương trình trên

chuan hoa xau trong java

Lời cuối cùng mình gửi lời cảm ơn tới bạn đọc đã quan tâm tới bài viết này. Nếu có ý kiến thắc mắc hay đóng góp, để lại comment xuống phía dưới bài viết nhé!

By duongdinh24 admin tailieu.pro
Kỷ niệm sinh viên năm 3 ICTU học lập trình Java.
Thái Nguyên ngày 9/12/2020 ❤ 💕 💗.

LEAVE A REPLY

Please enter your comment!
Please enter your name here