Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

[Java String] Xác Định Vị Trí Xuất Hiện Cuối Cùng Của Một Chuỗi Con

Xem tất cả các bài viết về Java String: Vào Đây

Vấn đề: Làm thế nào để xác định vị trí xuất hiện cuối cùng của một chuỗi con trong một chuỗi với Java

Giải pháp: Để giải quyết vấn đề trên trong Java có hỗ trợ sẵn phương phức lastIndexOf của lớp String. Phương thức lastIndexOf gồm có 4 biến thể sau:





public int lastIndexOf(int ch)

Trả về vị trí cuối của ký tự được truyền vào trong chuỗi. Nếu kí tự đó không tồn tại trong chuỗi trả về -1. Bạn xem ví dụ sau:

package sinhviencntt.com.lastIndexString;

public class lastIndexString {
 
public static void main(String[] args) {
  
  String str = "Hi! Chuc ban vui ve! Hi! Chuc ban vui ve!";

  // 101 là mã của ký tự 'e'. 'e' xuất hiện cuối ở vị trí 39.
  System.out.println(str.lastIndexOf(101));

 }
} 
Kết quả in ra màn hình:
39
public int lastIndexOf(String str)

Trả về vị trí xuất hiện cuối của chuỗi, vị trí này chính là vị trí của chữ cái đầu tiên trong chuỗi đó. Nếu chuỗi không xuất hiện trả về -1;

package sinhviencntt.com.lastIndexString;

public class lastIndexString {

     public static void main(String[] args) {

       String str = "Hi! Chuc ban vui ve! Hi! Chuc ban vui ve!";

       //Vị trí của "vui" cuối cùng chính là 
       //vị trí của ký tự 'v' trong chuỗi đó.
       System.out.println(str.lastIndexOf("vui"));
   }
}
 
Kết quả in ra màn hình:
34
public int lastIndexOf(int ch, int fromIndex)

Tìm vị trí xuất hiện cuối cùng của ký tự trong chuỗi thỏa mãn điều kiện sao cho vị trí đó vừa là ký tự ở sau, vừa phải nhỏ hơn chỉ số fromIndex. Nếu không tìm thấy trả về -1.
package sinhviencntt.com.lastIndexString;

public class lastIndexString {

   public static void main(String[] args) {

      String str = "Hi! Chuc ban vui ve! Hi! Chuc ban vui ve!";
      
      //Chữ "vẻ" cuối nằm vị trí 38, chữ "vui" cuối vị trí 34. 
      //Vậy theo điều kiện thì hàm này sẽ
      // trả về vị trí 'v' và vị trí đó nhỏ hơn 37. Nên nó sẽ chọn 
      //vị trí 'v' của chữ "vui".
      System.out.println(str.lastIndexOf('v', 37));
    }
 }
 
Kết quả in ra màn hình:
34
public int lastIndexOf(String str, int fromIndex)

Tìm vị trí xuất hiện cuối cùng của chuỗi con thỏa mãn điều kiện sao cho vị trí đó vừa là ký tự ở sau, vừa phải nhỏ hơn chỉ số fromIndex. Nếu không tìm thấy trả về -1.
package sinhviencntt.com.lastIndexString;

public class lastIndexString {

   public static void main(String[] args) {

      String str = "Hi! Chuc ban vui ve! Hi! Chuc ban vui ve!";

      System.out.println(str.lastIndexOf("vui", 100));
   }
}
 
Kết quả in ra màn hình:
34
Cảm ơn các bạn đã theo dõi bài viết.

Đọc Tiếp »

[Java String] So Sánh Hai Chuỗi Trong Java

Xem tất cả các bài viết về Java String: Vào Đây

Vấn đề: Làm thế nào để so sánh 2 chuỗi trong Java?


Khi mới lập trình với Java rất dễ nhầm lẫn là sử dụng toán tử == để so sánh xem hai chuỗi có giống nhau không, tuy nhiên đó là không phải là cách làm đúng trong Java.

Trong bài này mình sẽ trình bày đến các bạn các cách so sánh chuỗi đúng trong Java, từ cách phổ biến hay được dùng nhiều nhất. Ở cuối bài mình cũng giải thích tại sao không dùng toán tử == trong so sánh chuỗi với Java.

Lựa chọn 1: So sánh chuỗi trong Java với phương thức: equals

Phần lớn mình sử dụng khoảng 95% phương thức equals của lớp String.

if (string1.equals(string2))
 
Phương thức equals nhìn vào 2 chuỗi, nếu từng ký tự trong chuỗi đó giống nhau thì 2 chuỗi đó giống nhau.

Nhìn vào ví dụ sau, 2 chuỗi sẽ không bằng nhau vì từng ký tự trong chuỗi không bằng nhau (Hàm equals sẽ trả về false). Bạn chú ý ký tự in hoa và in thường là khác nhau nhé.

String string1 = "Sinh Vien CNTT";
String string2 = "sinh vien cntt";
 
if (string1.equals(string2))
{
  // Dòng này sẽ không được in ra vì hai chuỗi không bằng nhau
  System.out.println("Hai chuỗi bằng nhau.")
}
 
Nhưng khi từng ký tự trong hai chuỗi giống nhau thì hàm equals sẽ trả về kết quả true nghĩa là hai chuỗi giống nhau, bạn xem ví dụ sau:

String string1 = "Sinh Vien CNTT";
String string2 = "Sinh Vien CNTT";
 
if (string1.equals(string2))
{
  // Dòng này sẽ được in ra vì hai chuỗi bằng nhau
  System.out.println("Hai chuỗi bằng nhau.");
}
 
Lựa chọn 2: So sánh chuỗi trong Java với phương thức: equalsIgnoreCase

Trong một số trường hợp bạn muốn việc kiểm tra hai chuỗi không kiểm tra ký tự là in hoa hay in thường thì dùng hàm equalsIgnoreCase của lớp String như sau:

String string1 = "Sinh Vien CNTT";
String string2 = "sinh vien cntt";
 
if (string1.equalsIgnoreCase(string2))
{
  // Hai chuỗi bằng nhau vì ký tự in hoa bằng ký tự thường
  // Dòng này sẽ được in ra vì hai chuỗi bằng nhau
  System.out.println("Hai chuỗi bằng nhau.");
}
 
Lựa chọn 3: So sánh chuỗi trong Java với phương thức: compareTo

Ngoài 2 cách trên còn có thể dùng hàm compareTo của lớp String, tuy nhiên cách này ít phổ biến. Nếu hai chuỗi giống nhau hàm compareTo sẽ trả về 0. Cách này cũng phân biệt chữ in hoa và thường.

String string1 = "Sinh Vien CNTT";
String string2 = "sinh vien cntt";
 
if (string1.compareTo(string2) == 0)
{
  // Dòng này không sẽ được in ra vì hai chuỗi không bằng nhau
  System.out.println("Hai chuỗi bằng nhau.");
}
 
Lựa chọn 4: So sánh chuỗi trong Java với phương thức: compareToIgnoreCase

Cách này không phân biệt in hoa và in thường

String string1 = "Sinh Vien CNTT";
String string2 = "sinh vien cntt";
 
if (string1.compareTo(string2) == 0)
{
  // Dòng này sẽ được in ra vì hai chuỗi bằng nhau
  System.out.println("Hai chuỗi bằng nhau.");
}
 
Vì không nên sao sử dụng toán tử == trong so sánh chuỗi Java: Vì == là so sánh địa chỉ 2 đối tượng, còn equals là so sánh giá trị, nên trong trường hợp dưới đây dùng == sẽ không đúng.

String s = new String("231");
if(s == "231") {
   // Dòng này sẽ không được in ra màn hình
   System.out.println("Phuong phap dung ==");
}
if(s.equals("231")) {
   // Dòng này sẽ được in ra màn hình
   System.out.println("Phuong phap dung equals");
} 
 
Cảm ơn các bạn đã theo dõi bài viết, mong nhận được sự góp ý từ các bạn.

Xem tất cả các bài viết về Java String: Vào Đây
Đọc Tiếp »

[Bài Tập Java] Chuyển Đổi Tiếng Việt Có Dấu Thành Không Dấu

Xem tất cả các Bài Tập Java: Vào Đây

Để chuyển đổi tiếng việt có dấu thành không dấu trong Java có cách đơn giản bằng cách gọi và sử dụng các gói đã có sẵn.




* Hàm chuyển đổi:

package sinhviencntt.com.StringUtils;

import java.text.Normalizer;
import java.util.regex.Pattern;

public class StringUtils {
 
 public static String removeAccent(String s) {
  
  String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
  Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
  return pattern.matcher(temp).replaceAll("");
 }
}
 
Normalizer: Class này cung cấp các phương thức để tiêu chuẩn hóa văn bản Unicode thành văn bản tương đương. Nhằm mục đích thuận tiện cho việc sắp xếp và tìm kiếm chuỗi.

String temp = Normalizer.normalize(s, Normalizer.Form.NFD): Tiêu chuẩn hóa chuỗi s được truyền vào theo định dạng NFD. Kết quả trả về là chuỗi đã được tiêu chuẩn hóa.

Lớp Pattern:  Dùng để nhận Regexp (Cấu trúc đại diện hay Regular Expression) vào và kiểm tra những String cho vào dựa trên Regexp đã tạo ra. Thông thường để nhận một Regexp, thì dùng phương thức compile.

matcher: Dùng để so sánh, tìm kiếm những chữ đưa vào dựa trên Regexp đã tạo ra.

* Hàm main:

 
 
package sinhviencntt.com.main;

import sinhviencntt.com.StringUtils.StringUtils;

public class chuyendoitiengviet {
 
 public static void main(String[] args) {
  
  System.out.print(StringUtils.removeAccent("Sinh Viên Công Nghệ Thông Tin"));
 }
}

 
Kết quả in ra màn hình:
Sinh Vien Cong Nghe Thong Tin
Bạn tạo project và run thử nhé! Cảm ơn các bạn đã theo dõi bài viết.  Nếu có gì cần trao đổi bạn Comment bên dưới.

Xem tất cả các Bài Tập Java: Vào Đây
Đọc Tiếp »