2015-09-25 64 views
6

Tôi đang cố tìm tất cả các lần xuất hiện của chuỗi con trong chuỗi trong Java.Tìm tất cả các lần xuất hiện của chuỗi con trong chuỗi trong Java

Ví dụ: tìm kiếm "ababsdfasdfhelloasdf" cho "asdf" sẽ quay trở lại [8,17] kể từ khi có 2 "asdf" 's, một ở vị trí 8 và một ở 17. Tìm kiếm "aaaaaa" cho "aa "sẽ quay trở lại [0,1,2,3,4] vì có một "aa" tại các vị trí 0,1,2,3, và 4.

tôi cố gắng này:

public List<Integer> findSubstrings(String inwords, String inword) { 
    String copyOfWords = inwords; 
    List<Integer> indicesOfWord = new ArrayList<Integer>(); 
    int currentStartIndex = niwords.indexOf(inword); 
    int indexat = 0; 
    System.out.println(currentStartIndex); 
    while (cthing1 > 0) { 
     indicesOfWord.add(currentStartIndex+indexat); 
     System.out.println(currentStartIndex); 
     System.out.println(indicesOfWord); 
     indexat += cthing1; 
     copyOfWords = copyOfWords.substring(cthing1); 
     System.out.println(copyOfWords); 
     cthing1 = copyOfWords.indexOf(inword); 
    } 

này vấn đề có thể được giải quyết bằng Python như sau:

indices = [m.start() for m in re.finditer(word, a.lower())] 

trong đó "từ" là từ tôi đang tìm kiếm và "a" là chuỗi tôi đang tìm kiếm.

Làm thế nào tôi có thể đạt được điều này trong Java?

+0

Tôi nghĩ bài đầu [ở đây] (http://stackoverflow.com/questions/767759/occurrences-of-substring-in-a-string) có thể giúp bạn. Để nhận được các chỉ mục, chỉ cần in hoặc lưu 'lastIndex' khi bạn nhận được chúng. –

+2

Bạn có nghĩa là bạn cần [một cái gì đó như thế này] (http://ideone.com/9IeCEQ)? –

+1

Vui lòng sử dụng các tên biến có ý nghĩa hơn. Thật khó để hiểu ý nghĩa của 'cthing1' hoặc' outthing' hoặc 'niwords'. Sử dụng những thứ như 'lastIndex',' indexList', v.v. Hãy làm cho nó dễ hiểu hơn những gì bạn đã viết và sửa nó. – RealSkeptic

Trả lời

5

Bạn có thể sử dụng chụp bên trong một cái nhìn tích cực để có được tất cả các kết quả trùng lặp chồng chéo và sử dụng Matcher#start để lấy chỉ mục của các chất nền đã chụp.

Đối với the regex, nó sẽ trông giống như

(?=(aa)) 

Trong mã Java:

String s = "aaaaaa"; 
Matcher m = Pattern.compile("(?=(aa))").matcher(s); 
List<Integer> pos = new ArrayList<Integer>(); 
while (m.find()) 
{ 
    pos.add(m.start()); 
} 
System.out.println(pos); 

Kết quả:

[0, 1, 2, 3, 4] 

Xem IDEONE demo

0

Sử dụng regex chắc chắn là một giải pháp quá nặng cho việc tìm kiếm các chất nền, và nó sẽ đặc biệt là một vấn đề nếu chuỗi con của bạn chứa các ký tự regex đặc biệt như .. Dưới đây là một giải pháp chuyển thể từ this answer:

String str = "helloslkhellodjladfjhello"; 
String findStr = "hello"; 
int lastIndex = 0; 
List<Integer> result = new ArrayList<Integer>(); 

while(lastIndex != -1) { 

    lastIndex = str.indexOf(findStr,lastIndex); 

    if(lastIndex != -1){ 
     result.add(lastIndex); 
     lastIndex += 1; 
    } 
} 
+0

Điều này trả về [0,2,4] cho "aa" KHÔNG [0,1,2,3,4] như áp phích mong muốn. Cần tăng lastIndex chỉ bằng 1 không dài của findStr để tìm tất cả các kết quả phù hợp phụ. – JasonM1

+0

Bạn đúng, quên phần chồng chéo. Chỉnh sửa. –

Các vấn đề liên quan