Devo estar faltando algo muito óbvio, mas procurei por todo o lado e não consigo encontrar esse método.
198
Existem algumas maneiras de fazer isso usando a Arrays
classe utilitário.
Se a matriz não estiver classificada e não for uma matriz de primitivas:
java.util.Arrays.asList(theArray).indexOf(o)
Se o array for primitivo e não classificado, deve-se usar uma solução oferecida por uma das outras respostas, como as de Kerem Baydoğan , Andrew McKinlay ou Mishax . O código acima será compilado mesmo setheArray
seja primitivo (possivelmente emitindo um aviso), mas você obterá resultados totalmente incorretos.
Se a matriz estiver classificada, você poderá fazer uso de uma pesquisa binária de desempenho:
java.util.Arrays.binarySearch(theArray, o)
T...
, o tipo de argumento de tempo de execução real éT[]
e a passagem de zero ou mais parâmetros do tipo fazT
com que eles sejam agrupados em uma matriz recém-construída e passados. Se o parâmetro que está sendo passado já é do tipoT[]
, o açúcar sintático é ignorado..indexOf
) não é válida para primitivas, no entanto.Arrays.toList(list).sublist(from,to).indexOf(o)
para procurar um elemento dentro do intervalo[from, to)
.A matriz não tem
indexOf()
método.Talvez este
ArrayUtils
método Apache Commons Lang seja o que você está procurandofonte
Para primitivos, se você deseja evitar o boxe, o Guava possui auxiliares para matrizes primitivas, por exemplo, Ints.indexOf (int [] array, int target)
fonte
Não há nenhum. Use um
java.util.List
* ou você pode escrever o seuindexOf()
:* você pode criar um do seu array usando
Arrays#asList()
fonte
T
é enganoso. Ele não fornece nenhum tipo de segurança, fácil de confundir, é do tipo seguro ... melhor usar o ObjectindexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
Diferente do C #, onde você tem o método Array.IndexOf , e do JavaScript, onde você tem o indexOf método , a API do Java (the
Array
eArrays
em particular as classes ) não possui esse método.Este método indexOf (junto com seu complemento lastIndexOf) é definido no java.util.List interface . Observe que indexOf e lastIndexOf não estão sobrecarregados e usam apenas um objeto como parâmetro.
Se sua matriz é classificada , você tem sorte porque a classe Arrays define uma série de sobrecargas do método binarySearch que encontrará o índice do elemento que você está procurando com o melhor desempenho possível (O (log n) em vez de O (n ), sendo o último o que você pode esperar de uma pesquisa seqüencial feita por indexOf). Há quatro considerações:
A matriz deve ser classificada em ordem natural ou na ordem de um comparador que você fornece como argumento ou, no mínimo, todos os elementos "inferiores a" a chave devem vir antes desse elemento na matriz e todos os elementos que são "maiores que" a chave deve vir depois desse elemento na matriz;
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 se aplica ao binarySearch. Você precisa verificar se o valor de retorno não é menor que zero, pois o valor retornado indicará que a chave não está presente, mas o índice no qual seria esperado se existisse;
Se sua matriz contiver vários elementos iguais à chave, o que você obtém do binarySearch é indefinido; isso é diferente de indexOf que retornará a primeira ocorrência e lastIndexOf que retornará a última ocorrência.
Uma matriz de booleanos pode parecer classificada se contiver primeiro todas as falsas e depois todas as verdades, 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 desejar desempenho O (log n) ao detectar onde a primeira verdade verdadeira aparece em uma matriz, por exemplo, usando uma matriz de Booleanos e as constantes Boolean.FALSE e Boolean.TRUE.
Se sua matriz não for classificada e não for do tipo primitivo , você poderá usar os métodos indexOf e lastIndexOf da List invocando o método asList de java.util.Arrays. Este método retornará um wrapper de 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 está sobrecarregado, portanto, ele funcionará apenas em matrizes de tipos de referência.
Se sua matriz não estiver classificada e o tipo da matriz for primitivo , você não terá sorte com a API Java. Escreva seu próprio loop for ou seu próprio método de utilitário estático, que certamente terá vantagens de desempenho em relação à abordagem asList que envolve alguma sobrecarga na instanciação de um objeto. Caso você esteja preocupado com o fato de que escrever uma força bruta para loop que itere sobre todos os elementos da matriz não seja uma solução elegante, aceite que é exatamente isso que a API Java está fazendo quando você chama indexOf. Você pode fazer algo assim:
Se você quiser evitar escrever seu próprio método aqui, considere usar um de uma estrutura de desenvolvimento como o Guava. Lá você pode encontrar uma implementação de indexOf e lastIndexOf .
fonte
Java
ArrayList
tem umindexOf
método As matrizes Java não têm esse método.fonte
ArrayList
- todo JavaList
temindexOf()
.Não me lembro de um "indexOf" em matrizes além de codificá-lo para você ... embora você provavelmente possa usar um dos muitos
java.util.Arrays#binarySearch(...)
métodos (consulte o javadoc Arrays ) se sua matriz contiver tipos primitivosfonte
A interface List possui um método indexOf () e você pode obter uma List da sua matriz com o método asList () da matriz. Fora isso, a própria matriz não possui esse método. Ele possui um método binarySearch () para matrizes classificadas.
fonte
As próprias matrizes não possuem esse método. Uma lista, no entanto, faz: indexOf
fonte
ArrayList
- todo JavaList
temindexOf()
.Você provavelmente está pensando no java.util.ArrayList , não na matriz.
fonte
Não há função indexOf direta em matrizes java.
fonte
Jeffrey HantinA resposta de é boa, mas tem algumas restrições, se é isso que faz isso ou aquilo ...
Você pode escrever seu próprio método de extensão e ele sempre funciona da maneira que você deseja.
E aqui está a sua extensão
fonte
Nota: você pode usar esse método para matrizes do tipo int, também pode usar esse algoritmo para outros tipos com pequenas alterações
fonte