Pytanie Indeksy wszystkich wystąpień znaku w ciągu znaków


Poniższy kod wyświetli 2

String word = "bannanas";
String guess = "n";
int index;
System.out.println( 
    index = word.indexOf(guess)
);

Chciałbym wiedzieć, jak uzyskać wszystkie indeksy "n" ("guess") w ciągu "bannanas"

Oczekiwany wynik będzie następujący: [2,3,5]


76
2018-02-17 20:46


pochodzenie




Odpowiedzi:


Powinno to wydrukować listę pozycji bez -1 na końcu tego Rozwiązanie Petera Lawrey'a  ma miał.

int index = word.indexOf(guess);
while (index >= 0) {
    System.out.println(index);
    index = word.indexOf(guess, index + 1);
}

Można to również zrobić jako for pętla:

for (int index = word.indexOf(guess);
     index >= 0;
     index = word.indexOf(guess, index + 1))
{
    System.out.println(index);
}

[Uwaga: jeśli guess może być dłuższy niż pojedynczy znak, wtedy jest to możliwe, analizując guess ciąg, aby przejść przez pętlę word szybciej niż powyższe pętle. Punktem odniesienia dla takiego podejścia jest Algorytm Boyera-Moore'a. Jednak warunki, które sprzyjałyby stosowaniu takiego podejścia, wydają się nieobecne.]


119
2018-02-17 21:00





Spróbuj następujących rzeczy (Które nie drukują -1 na końcu!)

int index = word.indexOf(guess);
while(index >= 0) {
   System.out.println(index);
   index = word.indexOf(guess, index+1);
}

17
2018-02-17 20:48



najlepsze wykorzystanie indexOf! - asgs
zawsze drukujesz -1 na końcu - smas
@Peter Dziękuję bardzo za odpowiedź, wydaje się być słuszne, ale to jest tak właściwie mój pierwszy dzień z Javą, więc jestem trochę zdezorientowany przez końcowy wynik, wydaje się, że wynik -1 na końcu i nie do końca rozumiem dlaczego! dzięki!! - Trufa
@Trufa: Zawsze wypisuje -1 na końcu, ponieważ indexOf zwraca -1, gdy znak nie zostanie znaleziony. - ColinD
@Trufa - powód, dla którego jest drukowany -1 na koniec jest to, że do loop wykonuje ciało i następnie odkrywa to index == -1 w zakończeniu while. - Ted Hopp


String string = "bannanas";
ArrayList<Integer> list = new ArrayList<Integer>();
char character = 'n';
for(int i = 0; i < string.length(); i++){
    if(string.charAt(i) == character){
       list.add(i);
    }
}

Wynik zostanie użyty w następujący sposób:

    for(Integer i : list){
        System.out.println(i);
    }

Lub jako tablica:

list.toArray();

5
2018-02-17 20:47





int index = -1;
while((index = text.indexOf("on", index + 1)) >= 0) {
   LOG.d("index=" + index);
}

2
2018-03-28 19:23





String word = "bannanas";

String guess = "n";

String temp = word;

while(temp.indexOf(guess) != -1) {
     int index = temp.indexOf(guess);
     System.out.println(index);
     temp = temp.substring(index + 1);
}

1
2018-02-17 20:51



Ogólna idea jest słuszna, ale word.substring(word) nie będzie się kompilować. : P - Peter Lawrey
@Peter, dziękuję za korektę. - asgs
Nadal ma problem: drukuje w sposób ciągły 2. - POSIX_ME_HARDER
Boże, muszę javac wszystko, co tu zamieszczam. - asgs


Z Java9 można korzystać z iterate(int seed, IntPredicate hasNext,IntUnaryOperator next) następująco:-

List<Integer> indexes = IntStream
          .iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
          .boxed()
          .collect(Collectors.toList());
System.out.printlnt(indexes);

1
2018-02-03 03:06





    String input = "GATATATGCG";
    String substring = "G";
    String temp = input;
    String indexOF ="";
    int tempIntex=1;

    while(temp.indexOf(substring) != -1)
    {
        int index = temp.indexOf(substring);
        indexOF +=(index+tempIntex)+" ";
        tempIntex+=(index+1);
        temp = temp.substring(index + 1);
    }
    Log.e("indexOf ","" + indexOF);

0
2018-03-07 15:03



... czy ten kod szuka sekwencji DNA? ¿? ¿XD - kaytes