Làm cách nào để kiểm tra một chuỗi để xem nó có chứa bất kỳ chuỗi nào trong một mảng không?
Thay vì sử dụng
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Làm cách nào để kiểm tra một chuỗi để xem nó có chứa bất kỳ chuỗi nào trong một mảng không?
Thay vì sử dụng
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Câu trả lời:
EDIT: Đây là bản cập nhật sử dụng API phát trực tuyến Java 8. Vì vậy, sạch sẽ hơn nhiều. Vẫn có thể được kết hợp với các biểu thức thông thường quá.
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}
Ngoài ra, nếu chúng ta thay đổi loại đầu vào thành Danh sách thay vì một mảng, chúng ta có thể sử dụng items.parallelStream().anyMatch(inputStr::contains)
.
Bạn cũng có thể sử dụng .filter(inputStr::contains).findAny()
nếu bạn muốn trả về chuỗi phù hợp.
Câu trả lời ban đầu hơi ngày:
Đây là một phương thức tĩnh (RẤT CƠ BẢN). Lưu ý rằng nó là trường hợp nhạy cảm trên các chuỗi so sánh. Một cách nguyên thủy để làm cho trường hợp không nhạy cảm sẽ là gọi toLowerCase()
hoặc toUpperCase()
trên cả chuỗi đầu vào và chuỗi kiểm tra.
Nếu bạn cần làm bất cứ điều gì phức tạp hơn thế này, tôi khuyên bạn nên xem các lớp Mẫu và Trình so khớp và học cách thực hiện một số biểu thức thông thường. Một khi bạn hiểu những điều đó, bạn có thể sử dụng các lớp đó hoặc String.matches()
phương thức của trình trợ giúp.
public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
for(int i =0; i < items.length; i++)
{
if(inputStr.contains(items[i]))
{
return true;
}
}
return false;
}
import org.apache.commons.lang.StringUtils;
Sử dụng:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
Nó sẽ trả về chỉ mục của chuỗi được tìm thấy hoặc -1 nếu không tìm thấy.
Bạn có thể sử dụng phương thức khớp chuỗi # như thế này:
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
Cách dễ nhất có lẽ là chuyển đổi mảng thành java.util.ArrayList. Khi nó nằm trong một danh sách mảng, bạn có thể dễ dàng tận dụng phương thức chứa.
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
có chứa bất kỳ String
s nào trong mảng không, nếu có bất kỳ String
s nào trong mảng chứa string
.
.equals()
trong bài đăng của họ, điều này rất khó hiểu. Tôi nghĩ họ cần chỉnh sửa câu hỏi của họ
Nếu bạn sử dụng Java 8 trở lên, bạn có thể dựa vào API Stream để thực hiện điều đó:
public static boolean containsItemFromArray(String inputString, String[] items) {
// Convert the array of String items as a Stream
// For each element of the Stream call inputString.contains(element)
// If you have any match returns true, false otherwise
return Arrays.stream(items).anyMatch(inputString::contains);
}
Giả sử rằng bạn có một mảng lớn String
để kiểm tra, bạn cũng có thể khởi chạy tìm kiếm song song bằng cách gọi parallel()
, mã sau đó sẽ là:
return Arrays.stream(items).parallel().anyMatch(inputString::contains);
Đây là một giải pháp:
public static boolean containsAny(String str, String[] words)
{
boolean bResult=false; // will be set, if any of the words are found
//String[] words = {"word1", "word2", "word3", "word4", "word5"};
List<String> list = Arrays.asList(words);
for (String word: list ) {
boolean bFound = str.contains(word);
if (bFound) {bResult=bFound; break;}
}
return bResult;
}
Kể từ phiên bản 3.4 Apache Common Lang 3 thực hiện containsAny phương pháp.
Một cách tiếp cận hấp dẫn hơn sẽ là sử dụng tiêm kết hợp với metaClass :
Tôi rất muốn nói:
String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true
Và phương pháp sẽ là:
myInput.metaClass.containsAny={List<String> notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Nếu bạn cần chứaAny để có mặt cho bất kỳ biến String nào trong tương lai thì hãy thêm phương thức vào lớp thay vì đối tượng:
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Thử cái này:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
Nếu bạn đang seraching cho toàn bộ những lời bạn có thể làm điều này mà làm việc trường hợp nhạy cảm .
private boolean containsKeyword(String line, String[] keywords)
{
String[] inputWords = line.split(" ");
for (String inputWord : inputWords)
{
for (String keyword : keywords)
{
if (inputWord.equalsIgnoreCase(keyword))
{
return true;
}
}
}
return false;
}
Chúng ta cũng có thể làm như thế này:
if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.
Dưới đây sẽ phù hợp với bạn khi giả sử Chuỗi là mảng mà bạn đang tìm kiếm trong:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
trong đó mykeytosearch là chuỗi mà bạn muốn kiểm tra sự tồn tại trong mảng. mysearchComparator - là một bộ so sánh sẽ được sử dụng để so sánh các chuỗi.
Tham khảo Arrays.binarySearch để biết thêm thông tin.
if (Arrays.asList(array).contains(string))