Pregunta Índices de todas las apariciones de caracteres en una cadena


El siguiente código imprimirá 2

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

Me gustaría saber cómo obtener todos los índices de "n" ("adivinar") en la cadena "bannanas"

El resultado esperado sería: [2,3,5]


76
2018-02-17 20:46


origen


Respuestas:


Esto debería imprimir la lista de posiciones sin el -1 al final eso La solución de Peter Lawrey  tiene tenido.

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

También se puede hacer como un for lazo:

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

[Nota: si guess puede ser más largo que un solo carácter, entonces es posible, analizando el guess cadena, para recorrer word más rápido que los bucles anteriores. El punto de referencia para tal enfoque es el Algoritmo de Boyer-Moore. Sin embargo, las condiciones que favorecen el uso de dicho enfoque no parecen estar presentes.]


119
2018-02-17 21:00



Pruebe lo siguiente (¡que no imprime -1 al final ahora!)

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

17
2018-02-17 20:48



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);
    }
}

El resultado se usaría así:

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

O como una matriz:

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



Con Java9, uno puede hacer uso de la iterate(int seed, IntPredicate hasNext,IntUnaryOperator next) como sigue:-

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



Además, si desea encontrar todos los índices de una Cadena en una Cadena.

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

0
2017-09-17 11:25



Tuve este problema también, hasta que se me ocurrió este método.

public static int[] indexesOf(String s, String flag) {
    int flagLen = flag.length();
    String current = s;
    int[] res = new int[s.length()];
    int count = 0;
    int base = 0;
    while(current.contains(flag)) {
        int index = current.indexOf(flag);
        res[count] = index + base;
        base += index + flagLen;
        current = current.substring(current.indexOf(flag) + flagLen, current.length());
        ++ count;
    }
    return Arrays.copyOf(res, count);
}

Este método se puede usar para buscar índices de cualquier indicador de cualquier longitud en una cadena, por ejemplo:

public class Main {

    public static void main(String[] args) {
        int[] indexes = indexesOf("Hello, yellow jello", "ll");

        // Prints [2, 9, 16]
        System.out.println(Arrays.toString(indexes));
    }

    public static int[] indexesOf(String s, String flag) {
        int flagLen = flag.length();
        String current = s;
        int[] res = new int[s.length()];
        int count = 0;
        int base = 0;
        while(current.contains(flag)) {
            int index = current.indexOf(flag);
            res[count] = index + base;
            base += index + flagLen;
            current = current.substring(current.indexOf(flag) + flagLen, current.length());
            ++ count;
        }
        return Arrays.copyOf(res, count);
    }
}

0
2017-09-10 19:14