Supposons que j'ai un ArrayList<Account>
de mes objets personnalisés ce qui est très simple. Par exemple:
class Account
{
public String Name;
public Integer Id;
}
Je veux récupérer l'objet Account
particulier basé sur un paramètre Id
dans de nombreuses parties de mon application. Quelle serait la meilleure façon de procéder?
Je pensais étendre ArrayList
mais je suis sûr qu'il doit y avoir une meilleure façon.
Il semble que ce que vous voulez vraiment utiliser soit un Map
, qui vous permet de récupérer des valeurs en fonction d'une clé. Si vous vous en tenez à ArrayList
, votre seule option est de parcourir toute la liste et de rechercher l'objet.
Quelque chose comme:
for(Account account : accountsList) {
if(account.getId().equals(someId) {
//found it!
}
}
versus
accountsMap.get(someId)
Ce type d'opération est O(1)
dans un Map
, vs O(n)
dans un List
.
Je pensais étendre ArrayList mais je suis sûr qu'il doit y avoir une meilleure solution.
D'une manière générale, c'est une mauvaise conception. Lisez Java efficace Point 16 pour mieux comprendre pourquoi - ou consultez ceci article .
En supposant qu'il s'agit d'une liste non ordonnée, vous devrez parcourir la liste et vérifier chaque objet.
for(int i = 0; i < sizeOfList; i++) {
list.get(i).equals(/* What you compare against */)
}
Il y a aussi l'autre syntaxe for
:
for(Account a : accountList)
Vous pouvez placer cette boucle dans une méthode d'assistance qui prend un Account
et le compare à chaque élément.
Pour les listes ordonnées, vous disposez d'options de recherche plus efficaces, mais vous devrez implémenter une recherche quoi qu'il arrive.
ArrayList ne trie pas les éléments contenus. Si vous souhaitez rechercher un seul élément dans une liste de tableaux, vous devrez parcourir la liste et comparer chacun à la valeur que vous recherchez.
Account foundAccount;
for(Account a : accountList){
if(a.Id == targetID){
foundAccount = a;
break;
}
}
if(foundAccount != null){
//handle foundAccount
}
else{
//not found
}
Alternativement, vous pouvez utiliser une structure de données plus intelligente qui trie et conserve les informations sur les données contenues.
Vous voudrez rechercher l'interface de la carte, en particulier l'implémentation de HashMap. Cela vous permet de stocker chaque élément dans un ordre lié à une certaine clé. Vous pouvez donc placer chacun de vos objets dans un HashMap avec l'ID comme clé, puis vous pouvez directement demander au HashMap s'il a ou non un objet d'une certaine clé.
Vous devez utiliser la carte par exemple:
private Map<String, int> AccountMap;
for (String account : accounts )
AccountMap.put(account, numberofid);
Étendre ArrayList
n'est presque jamais une bonne solution à votre problème. Il s'agit d'une base Java implémentation de List
, qui vous permet de stocker des objets dans un ordre spécifique et de les récupérer par leur index.
Si vous voulez pouvoir indexer des éléments à l'aide d'un identifiant unique , vous pouvez jeter un œil à Map
=, et son implémentation HashMap
.
Il pourrait vous aider à résoudre votre problème en utilisant un Map<Integer, Account>
.
map.put(id, account)
au lieu de list.add(account)
map.get(id)
Ce sera la mise en œuvre la plus rapide. Mais, si vous ne pouvez pas changer cela, vous pouvez toujours parcourir votre ArrayList
et trouver le bon compte:
for (Account acc : accounts) {
if (acc.getId() == yourId) {
return acc;
}
}
throw new NoSuchElementException();
Une meilleure façon de procéder serait d'utiliser une carte.
Dans votre cas, vous pouvez l'implémenter de la manière suivante
Map<account.getId(), account>
vous pouvez utiliser la méthode "get" pour récupérer l'objet de compte approprié.
accountMap.get(id);