2008-11-20 43 views
13
ArrayList <String> list = new ArrayList(); 
list.add("behold"); 
list.add("bend"); 
list.add("bet"); 
list.add("bear"); 
list.add("beat"); 
list.add("become"); 
list.add("begin"); 

Có cách tìm kiếm regexp bea. * Và nhận chỉ mục như trong ArrayList.indexOf?Tìm kiếm regexp trong danh sách mảng java

EDIT: trả lại mặt hàng là tốt nhưng tôi cần một cái gì đó với hiệu suất hơn một tìm kiếm tuyến tính

+0

Bạn có thể thực hiện không tốt hơn nếu bạn đặt các chuỗi của bạn vào Danh sách. Regex của bạn luôn là tiền tố hay bạn muốn xử lý bất kỳ regex nào? – erickson

+0

Vậy tôi nên sử dụng cấu trúc dữ liệu nào? Regex của tôi luôn là tiền tố. – kmilo

+0

Tôi recomment một số cấu trúc dữ liệu automata. https://en.wikipedia.org/wiki/Trie –

Trả lời

1

Tôi không tin rằng có một API Java cách để làm điều này, và cũng không có cách nào để làm điều này Apache Commons . Nó sẽ không khó khăn để cuộn của riêng bạn tuy nhiên.

7

Có phương pháp tích hợp sẵn không? Không phải là tôi biết. Tuy nhiên, nó nên được khá dễ dàng để làm điều đó cho mình. Dưới đây là một số mã hoàn toàn chưa được kiểm tra mà nên cung cấp cho bạn những ý tưởng cơ bản:

import java.util.regex.Pattern; 
import java.util.ListIterator; 
import java.util.ArrayList; 

/** 
* Finds the index of all entries in the list that matches the regex 
* @param list The list of strings to check 
* @param regex The regular expression to use 
* @return list containing the indexes of all matching entries 
*/ 
List<int> getMatchingIndexes(List<String> list, String regex) { 
    ListIterator<String> li = list.listIterator(); 

    List<int> indexes = new ArrayList<int>(); 

    while(li.hasNext()) { 
    int i = li.nextIndex(); 
    String next = li.next(); 
    if(Pattern.matches(regex, next)) { 
     indexes.add(i); 
    } 
    } 

    return indexes 
} 

tôi có thể có việc sử dụng Pattern và ListIterator phần một chút sai (tôi chưa từng sử dụng một trong hai), nhưng đó phải cung cấp cho các ý tưởng cơ bản. Bạn cũng có thể làm một vòng lặp đơn giản thay vì vòng lặp while trong trình vòng lặp.

+0

Cá nhân, tôi nghĩ rằng các phương thức api nên lấy các đối số và trả về các giá trị của loại trừu tượng nhất có thể. Do đó, chỉnh sửa câu trả lời của tôi về câu trả lời của bạn sẽ là: Danh sách công khai getMatchingIndices (Danh sách danh sách, Chuỗi regex) {..} – user38051

+0

Điểm tốt. Tôi chỉ ném nó với nhau thật nhanh và không chú ý nhiều đến thứ đó. – Herms

+0

FYI, không phải là thông số loại hợp lệ. Bạn sẽ phải biến nó thành Danh sách . Ngoài ra, khi bạn sử dụng một regex trong một vòng lặp như thế này, bạn nên biên dịch nó thành một đối tượng Pattern trước khi vào vòng lặp, như DJClayworth đã làm. –

4

Một tùy chọn là sử dụng phương thức "chọn" Apache Commons CollectionUtils. Bạn sẽ cần phải tạo một đối tượng Predicate (một đối tượng với một phương pháp "đánh giá" duy nhất sử dụng biểu thức chính quy để kiểm tra kết quả phù hợp và trả về true hoặc false) và sau đó bạn có thể tìm kiếm các mục trong danh sách phù hợp. Tuy nhiên, nó sẽ không trả về các chỉ mục, nó sẽ trả về một bộ sưu tập chứa các mục đó.

15

Herms có những điều cơ bản đúng. Nếu bạn muốn Strings và không phải là chỉ số sau đó bạn có thể cải thiện bằng cách sử dụng Java 5 foreach vòng lặp:

import java.util.regex.Pattern; 
import java.util.ListIterator; 
import java.util.ArrayList; 

/** 
* Finds the index of all entries in the list that matches the regex 
* @param list The list of strings to check 
* @param regex The regular expression to use 
* @return list containing the indexes of all matching entries 
*/ 
List<String> getMatchingStrings(List<String> list, String regex) { 

    ArrayList<String> matches = new ArrayList<String>(); 

    Pattern p = Pattern.compile(regex); 

    for (String s:list) { 
    if (p.matcher(s).matches()) { 
     matches.add(s); 
    } 
    } 

    return matches 
} 
+1

Tôi đã nghĩ đến việc trả lại các chuỗi kết hợp thực tế, nhưng câu hỏi cụ thể được yêu cầu cho các chỉ dẫn. Trả lại các chuỗi phù hợp thường là một chút sạch hơn mặc dù. – Herms

3

Đây là một trong lót ổi:

final Iterable<String> matches = Iterables.filter(myStrings, Predicates.contains(Pattern.compile("myPattern"))); 

for (final String matched : matches) { 
    ... 
} 
Các vấn đề liên quan