Melhor maneira de localizar o índice do item em ArrayList?

89

Para um aplicativo Android, tenho a seguinte funcionalidade

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

Essa é a "melhor" maneira de escrever uma função para obter a posição de um elemento? Ou há uma função nativa shmancy chique em java que eu deveria aproveitar?

Jacksonkr
fonte
1
Este código provavelmente tem falhas: o uso de ==produzirá resultados incorretos na maioria dos casos.
3
Lembre-se, você não pode comparar strings com '==', você deve usar String.equals (String str)
MrZander
5
@MrZander Claro que você pode compará-los com ==... não é o tipo certo de comparação ;-)
Você pode dizer que ainda sou novo em Java .. é String.equalsmais parecido com o que ===pode ser em uma linguagem como JavaScript? por exemplo. verifica o valor E o tipo?
Jacksonkr
3
Não. == É identidade de objeto e significa "é o mesmo objeto" . (Esta visão é verdadeira para valores primitivos, bem como tipos de referência, se você considerar que há apenas um número com o valor 42 ou char 'x', etc). Object.equalsé um método virtual definido para todas as instâncias de objeto e significa "tem o mesmo valor" , já que todos os tipos de classe estendem Object, e deve ser usado para todos os testes de igualdade de objeto . Há muitas perguntas na capa ==vs Object.equalse este é um conceito muito importante para entender! Por exemplo, isso é falso "hello" == new String("hello"):! Doh!

Respostas:

190

ArrayListtem um indexOf()método . Verifique a API para obter mais informações, mas funciona assim:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() retornará exatamente o que seu método retorna, rápido.

Jon Egeland
fonte
3
Não é "mais rápido" em termos de complexidade do que o código postado, embora possa ser implementado com mais eficiência. Além disso, indexOf irá reagir de forma ligeiramente diferente aqui: o código original [incorretamente] usa ==enquanto indexOf usa equals().
Na verdade, é quase o mesmo código exatamente (pelo menos no código Sun Java 6 que tenho), exceto que eles o iniciam com uma ramificação if-else que lida com null separadamente.
yshavit
Seus arrays antigos conectados e List <> têm o método FindIndex (), mas a API muda no meio para ArrayList: D
boctulus
16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

Produto: Índice de lista: 7

Se você passar H, ele retornará 7 , se passar J, ele retornará -1 como definimos o valor padrão para -1.

Feito

Hiren Patel
fonte
Como posso fazer o vice-versa, para sua solução sua entrada é H e você obtém a posição de H , suponha que se minha entrada for o Índice de 7, como posso obter o valor da String desse índice. Obrigado
Jimale Abdi
1
@JimaleAbdi Faça yourArrayList.get (7). 7 é a sua posição.
Hiren Patel
6

Se o seu Listestiver classificado e tiver um bom acesso aleatório (assim como ArrayList), você deve verificar Collections.binarySearch. Caso contrário, você deve usar List.indexOf, como outros apontaram.

Mas seu algoritmo é bom, fwiw (além dos ==outros apontaram).

Yshavit
fonte
3

De fato, há uma função nativa shmancy sofisticada em java que você deve aproveitar.

ArrayList tem um método de instância chamado

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

Você seria capaz de chamá-lo da _categoriesseguinte maneira:

_categories.indexOf("camels")

Não tenho experiência com programação para Android - mas isso funcionaria para um aplicativo Java padrão.

Boa sorte.

pé de feijão enferrujado
fonte
1
função nativa implica C \ C ++ para mim .. Apenas dizendo.
Hunter McMillen
3

A API Java especifica dois métodos que você pode usar: indexOf(Object obj)e lastIndexOf(Object obj). O primeiro retorna o índice do elemento se encontrado, -1 caso contrário. O segundo retorna o último índice, que seria como pesquisar na lista para trás.

danca
fonte
1

A melhor maneira de encontrar a posição do item na lista é usando a interface de coleções,

Por exemplo,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Produto: 2

Pradeesh MP
fonte
0

Use o método indexOf () para encontrar a primeira ocorrência do elemento na coleção.

Vasu Dev Garg
fonte