Đây có lẽ không phải là cách tốt nhất cho vấn đề cụ thể của bạn, nhưng bạn có thể sử dụng phương pháp String.matches(String regex)
hoặc tương đương với đối sánh. Chúng tôi chỉ cần xây dựng cụm từ thông dụng từ tiêu đề tiềm năng của bạn. Ở đây nó trở nên phức tạp.
List<DVD> matchingDvds(String titleFragment) {
String escapedFragment = Pattern.quote(titleFragment);
// The pattern may have contained an asterisk, dollar sign, etc.
// For example, M*A*S*H, directed by Robert Altman.
Pattern pat = Pattern.compile(escapedFragment, Pattern.CASE_INSENSITIVE);
List<DVD> foundDvds = new ArrayList<>();
for (DVD dvd: catalog) {
Matcher m = pat.matcher(dvd.getTitle());
if (m.find()) {
foundDvds.add(dvd);
}
}
return foundDvds;
}
Nhưng điều này không hiệu quả và được thực hiện hoàn toàn bằng Java. Bạn sẽ làm tốt hơn để thử một trong các kỹ thuật sau:
- Tìm hiểu các lớp
Collator
và CollationKey
.
- Nếu bạn không có lựa chọn nào khác ngoài việc ở lại thế giới Java, hãy thêm phương thức vào DVD,
boolean matches(String fragment)
. Có đĩa DVD cho bạn biết những gì nó phù hợp.
- Sử dụng cơ sở dữ liệu. Nếu nó hỗ trợ collations không phân biệt dạng chữ, hãy khai báo cột
title
của bảng DVD
theo cách đó. Sử dụng JDBC hoặc Hibernate hoặc JPA hoặc Spring Data, tùy theo bạn chọn.
- Nếu cơ sở dữ liệu hỗ trợ tìm kiếm văn bản nâng cao, như Oracle, hãy sử dụng nó.
- Quay lại thế giới Java, sử dụng
Apache Lucene
và có thể là Apache Solr
.
- Sử dụng ngôn ngữ được điều chỉnh cho các kết quả khớp không phân biệt chữ hoa chữ thường.
Nếu bạn có thể đợi cho đến khi Java 8, sử dụng biểu thức lambda. Bạn có thể tránh lớp Pattern và Matcher mà tôi sử dụng ở trên bằng cách xây dựng các regex theo cách này:
String escapedFragment = Pattern.quote(titleFragment);
String fragmentAnywhereInString = ".*" + escapedFragment + ".*";
String caseInsensitiveFragment = "(?i)" + fragmentAnywhereInString;
// and in the loop, use:
if(dvd.getTitle().matches(caseInsensitiveFragment)) {
foundDvds.add(dvd);
}
Nhưng điều này biên dịch mô hình quá nhiều lần. Điều gì về thấp hơn vỏ bọc tất cả mọi thứ?
if (dvd.getTitle().toLowerCase().contains(titleFragment.toLowerCase()))
Xin chúc mừng; bạn vừa phát hiện ra vấn đề của Thổ Nhĩ Kỳ. Trừ khi bạn nêu ngôn ngữ trong toLowerCase
, Java sẽ tìm thấy ngôn ngữ hiện tại.Và vỏ bọc thấp hơn là chậm bởi vì nó phải tính đến dấu chấm tròn của người Thổ Nhĩ Kỳ và chấm đen. Ít nhất bạn không có hoa văn và không phù hợp.
Nguồn
2013-04-05 02:34:36
Không, không có. Nhưng nếu bạn giải thích những gì bạn đang cố gắng để làm, chúng tôi có thể có thể đề xuất một cách tiếp cận thay thế mà sẽ làm những gì bạn cần. – DaoWen
Để thực hiện khớp không phân biệt dạng chữ trong Java, bạn có thể sử dụng 'String.matches' với cụm từ thông dụng'. * (? I: abcd). * '. Thay thế 'abcd' bằng chuỗi của bạn. –
có thể trùng lặp của [Có chứa Phương thức trong java.lang.String Phân biệt chữ hoa chữ thường không?] (Http://stackoverflow.com/questions/86780/is-the-contains-method-in-java-lang-string-case -sensitive) –