2016-02-10 4 views
2

Я пытаюсь написать код, который возвращает массив, элементы которого являются индексы слова (вхождений), что я ищу в строке: ех) д Входной сигнал:Рекурсивный нахождение индексов строки

String sent = "Hi is Hi is Hi is"; 
String find = "Hi"; 

ArrayList<Integer> index = indexFinder(sent,find); 
For(int i=0;i<index.size(),i++) 
    System.out.println(index.get(i)); 

Выход:

0 
6 
12 

было бы очень хорошо, если бы Ja была функция строки нарезки как питон .. но так как это не .. Я пытался использовать метод подстроки().

import java.util.ArrayList; 

public class recursionEx { 
ArrayList<Integer> index = new ArrayList<Integer>(); 
ArrayList<Integer> indexFinder(String sent, String find){ 
    int pos =0; 
    int subPos =0; 
    if(sent.contains(find)==false){ 
     return index; 
    } 
    else if(sent.contains(find)){ 
     pos = sent.indexOf(find); 
     index.add(pos); 
     subPos = pos+find.length(); 
     return indexFinder(sent.substring(subPos),find); 
    } 
    return index; 
} 

public static void main(String[] args) { 
    String sent = "Hi is Hi is Hi is"; 
    String find = "Hi"; 
    recursionEx r = new recursionEx(); 
    ArrayList<Integer> g = r.indexFinder(sent, find); 
    for(int i=0;i<g.size();i++){ 
     System.out.println(g.get(i)); 
    } 

} 

} 

выход был

0 
4 
4 

В ретроспективе, я gettng подстроку исходной строки посланной каждую итерацию, таким образом, элементы индекса массива являются индексы Строка поиска в подстроки от Строка отправлена ​​, которые составляют 0,4,4.

Как исправить это, чтобы получить желаемый результат? Любая помощь приветствуется!

+0

Просто побочное замечание: вместо вызова 'sent.contains (найти)' вы могли бы просто назвать 'IndexOf()' и проверьте, является ли возвращаемое значение ниже 0, и в этом случае строка поиска не была найдена. – Thomas

+0

yep, я изменил свой if stat на if (sent.indexOf (find) == - 1). Спасибо – Hello

+0

У меня такое чувство, что вы меня неправильно понимаете: не просто замените 'contains()' на 'indexOf() == -1', а вызовите' indexOf() 'only _once_ и проверьте индекс. Я имею в виду (псевдокод) 'index = indexOf (что угодно); if (index> = 0) {add (index); } '. – Thomas

ответ

1

Вы не должны использовать подстроку как параметр, а только начало поиска в строке. Вот способ, который работает, он не совершенен, попробуйте сделать это лучше:

import java.util.ArrayList; 

public class recursionEx { 
ArrayList<Integer> index = new ArrayList<Integer>(); 
String string; 
recursionEx(String string){this.string = string;} 

ArrayList<Integer> indexFinder(int position, String find){ 
    int pos =0; 
    int subPos =0; 
    if(string.substring(position).contains(find)==false){ 
     return index; 
    } 
    else if(string.substring(position).contains(find)){ 
     pos = string.substring(position).indexOf(find) + position; 
     index.add(pos); 
     subPos = pos+find.length(); 
     return indexFinder(subPos,find); 
    } 
    return index; 
} 

public static void main(String[] args) { 
    String sent = "Hi is Hi is Hi is"; 
    String find = "Hi"; 
    recursionEx r = new recursionEx(sent); 
    ArrayList<Integer> g = r.indexFinder(0, find); 
    for (Integer pos : g) 
     System.out.println(pos); 

} 

} 
+0

У вас есть несколько решений: (1) передать как параметр всегда всю строку и позицию начала подстроки для анализа. (2) передать подстроку для анализа и положение начала подстроки. В любом случае вам нужно 3 параметра: что вы ищете, в каком поиске и позиции. –

+0

oops Я случайно удалил свой комментарий. Спасибо за это решение. – Hello

0

Добавьте длину первой подстроки к каждому следующему выходу, затем вы получите правильные цифры. Вы можете рассчитать эти длины по более старым показателям.

+0

Благодарим вас за предложение. Я думаю, что это похоже на то, что предложил А. Оканнайл. – Hello

0

Вам не нужно использовать рекурсию, чтобы найти индексы подстрок, но используйте indexOf(searchstring, offset), пока вы больше не найдете строку поиска.

В качестве альтернативы можно использовать регулярное выражение, то есть Pattern и Matcher, и собрать индексы group(0).

Edit:

Поскольку вы хотите использовать recursion вы могли бы изменить цикл в рекурсивные вызовы. В этом случае вы можете просто передать смещение на рекурсивный вызов, а также продолжать использовать indexOff(find, offset).

Если вы хотите сделать это с помощью substring() вы также должны следить за положением подстроки в исходной строке и добавить, что к результатам indexOf(find), в противном случае вы получите индексы относительно только подстроки.

+0

Спасибо за предложение!но я пытаюсь использовать рекурсию только для целей pracitice: D – Hello

+0

@LookAtTheBigPicture Я вижу, вы все равно можете использовать это с рекурсией. Если взять подстроки, измените индексы, если вы не добавите индекс подстроки снова. – Thomas

+0

да, я думаю, это то, что случилось с моим кодом. Должен ли я просто добавить индекс в pos (int variable)? – Hello

Смежные вопросы