Onde está o Java’s Array indexOf?

Eu devo estar perdendo algo muito óbvio, mas eu procurei por toda parte e não consigo encontrar este método.

Existem algumas maneiras de fazer isso usando a class de utilitário Arrays .

Se a matriz não estiver classificada:

 java.util.Arrays.asList(theArray).indexOf(o) 

Se a matriz estiver classificada, você poderá fazer uso de uma pesquisa binária para desempenho:

 java.util.Arrays.binarySearch(theArray, o) 

Array não possui o método indexOf() .

Talvez este método Apache Commons Lang ArrayUtils seja o que você está procurando

 import org.apache.commons.lang3.ArrayUtils; String[] colours = { "Red", "Orange", "Yellow", "Green" }; int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow"); 

Não há nenhum. Use java.util.List * ou você pode escrever seu próprio indexOf() :

 public static  int indexOf(T needle, T[] haystack) { for (int i=0; i 

* você pode fazer um do seu array usando Arrays#asList()

Para primitivos, se você quiser evitar o boxe, o Guava possui ajudantes para matrizes primitivas, por exemplo, Ints.indexOf (int [] array, int target)

Ao contrário do C # onde você tem o método Array.IndexOf , e JavaScript onde você tem o método indexOf , a API do Java (as classs Array e Arrays em particular) não possui tal método.

Este método indexOf (junto com seu complemento lastIndexOf) é definido na interface java.util.List . Note que indexOf e lastIndexOf não estão sobrecarregados e só tomam um Object como um parâmetro.

Se sua matriz estiver classificada , você está com sorte porque a class Arrays define uma série de sobrecargas do método binarySearch que localizará o índice do elemento que você está procurando com o melhor desempenho possível (O (log n) em vez de O (n ), sendo este último o que você pode esperar de uma pesquisa sequencial feita pelo indexOf). Existem quatro considerações:

  1. A matriz deve ser classificada em ordem natural ou na ordem de um Comparador que você forneça como um argumento ou, no mínimo, todos os elementos que são “menores que” a chave devem vir antes desse elemento na matriz e todos os elementos que são “maior que” a chave deve vir depois daquele elemento na matriz;

  2. O teste que você normalmente faz com indexOf para determinar se uma chave está na matriz (verifique se o valor de retorno não é -1) não é válido com binarySearch. Você precisa verificar se o valor de retorno não é menor que zero, já que o valor retornado indicará que a chave não está presente, mas o índice em que seria esperado se existisse;

  3. Se sua matriz contiver vários elementos que são iguais à chave, o que você obtém de binarySearch é indefinido; isso é diferente de indexOf que retornará a primeira ocorrência e lastIndexOf que retornará a última ocorrência.

  4. Uma matriz de booleanos pode parecer classificada se contiver primeiro todos os falsos e depois todos os trues, mas isso não conta. Não há substituição do método binarySearch que aceita uma matriz de booleanos e você terá que fazer algo inteligente lá se quiser o desempenho O (log n) ao detectar onde o primeiro verdadeiro aparece em uma matriz, por exemplo, usando uma matriz de Booleanos e as constantes Boolean.FALSE e Boolean.TRUE.

Se sua matriz não estiver classificada e não for primitiva , você poderá usar os methods indexOf e lastIndexOf da List chamando o método asList de java.util.Arrays. Esse método retornará um wrapper da interface AbstractList em torno de sua matriz. Envolve uma sobrecarga mínima, pois não cria uma cópia da matriz. Como mencionado, esse método não é sobrecarregado, portanto, isso funcionará somente em matrizes de tipos de referência.

Se sua matriz não estiver classificada e o tipo da matriz for primitivo , você estará sem sorte com a API Java. Escreva seu próprio loop, ou seu próprio método de utilitário estático, que certamente terá vantagens de desempenho sobre a abordagem asList que envolve alguma sobrecarga de uma instanciação de object. Caso você esteja preocupado que escrever uma força bruta para o loop que itera sobre todos os elementos da matriz não seja uma solução elegante, aceite que isso é exatamente o que a API Java está fazendo quando você chama indexOf. Você pode fazer algo assim:

 public static int indexOfIntArray(int[] array, int key) { int returnvalue = -1; for (int i = 0; i < array.length; ++i) { if (key == array[i]) { returnvalue = i; break; } } return returnvalue; } 

Se você quiser evitar escrever seu próprio método aqui, considere usar um de um framework de desenvolvimento como o Guava. Lá você pode encontrar uma implementação de indexOf e lastIndexOf .

O Java ArrayList possui um método indexOf . Matrizes Java não possuem esse método.

Não me lembro de um “indexOf” em matrizes além de codificá-lo por si mesmo … embora você provavelmente poderia usar um dos muitos methods java.util.Arrays#binarySearch(...) (veja o arrays javadoc ) se sua matriz contém tipos primitivos

A interface de lista tem um método indexOf (), e você pode obter uma lista de sua matriz com o método asList () da matriz. Fora isso, o próprio Array não tem esse método. Ele possui um método binarySearch () para matrizes ordenadas.

Matrizes em si não tem esse método. Uma lista, no entanto, faz: indexOf

Você provavelmente está pensando no java.util.ArrayList , não no array.

Não há nenhuma function indexOf direta nos arrays java.

Você pode primeiro classificar o array usando:

 Arrays.sort(Your_Array_Name); 

e, em seguida, use a pesquisa binária para encontrar o índice (suponha que seja ‘c’)

 result = Arrays.binarySearch(Your_Array_Name, c); 

Agora, a variável de resultado conterá o índice do caractere ‘c’.