7
votes

Comparez les nouveaux objets entier dans la question de ArrayList

Je stocke des objets entiers représentant un index des objets que je veux suivre. Plus tard dans mon code, je veux vérifier si l'indice d'un objet particulier correspond à l'un de ces entiers que j'ai stockés précédemment. Je le fais en créant une arraylist et crée un nouveau nombre d'entiers à partir de l'index de A pour boucle: xxx pré>

i, je veux ensuite vérifier plus tard si la liste contient un index particulier: P>

//Cycle through the namedNodeMap array to find each of the course codes
for(int i=0; i<numberElementsInNodeList; i++) {
    if(!courseselectItems.contains(new Integer(i))) {
        //Do Stuff
    }
}


1 commentaires

Sur un Sidenote, voici quelque chose qui vaut la peine de savoir des entiers et des chaînes: devx.com/tips/tip/42276


7 Réponses :


18
votes

Oui, vous pouvez utiliser list.Contains () code> comme utilisé Equals () code> et un integer code> prend en charge que lors de la comparaison à d'autres entier code> s.

Aussi, en raison de la boxe automatique, vous pouvez simplement écrire: p> xxx pré>

Il convient de mentionner que: P>

ArrayList<Integer> courseselectItems = new ArrayList();


3 commentaires

Merci! Y a-t-il une raison particulière pour que je veux faire mes variables du type d'interface et non le type de béton?


@Thechiman Le type concret est un détail de mise en œuvre. En règle générale Paramètres, les variables locales et les membres de la classe doivent être l'interface afin que vous n'ayez pas lié à une implémentation particulière. Il vous permet, par exemple, plugin une liste de liste personnalisée à un point ultérieur, etc.


Ce n'est pas si important si la liste est complètement privée à la classe, visible nulle part ailleurs. Mais si vous l'exposez d'une certaine manière (par exemple, la classe contenant la liste a une méthode pour renvoyer la liste), vous devez absolument le retourner sous forme de liste et non comme un ArrayList . Vous pouvez décider plus tard, par exemple, que linkedlist est une implémentation plus appropriée.



1
votes

Réponse courte est oui, vous devriez être capable de faire arraylist.Contains (nouveau entier (14)) , par exemple, pour voir si 14 est dans la liste. La raison est que l'entier remplace le est égal à la méthode pour se comparer correctement à d'autres instances avec la même valeur.


0 commentaires

1
votes

Oui, il sera, parce que list.contains () Utilisez la méthode Equals () de l'objet à comparer. Et integer.equals () comparent la valeur entière.


0 commentaires

0
votes

Oui, la boxe automatique se produit, mais cela entraîne une pénalité de performance. Ce n'est pas clair de votre exemple pourquoi vous voudriez résoudre le problème de cette manière.

Aussi, en raison de la boxe, la création de la classe entier à la main est superflue.


0 commentaires

1
votes

Comme Cletus et DJ mentionné, votre approche fonctionnera.

Je ne connais pas le contexte de votre code, mais si vous vous souciez de l'index particulier, considérons également le style suivant: xxx


1 commentaires

J'ai fini par changer de code pour faire quelque chose de similaire à celui-ci. Merci!



1
votes

Je pose ma réponse sous la forme d'un test (passant), comme exemple de la façon dont vous pourriez rechercher cela vous-même. Pour ne pas vous décourager de l'utiliser, c'est génial - juste pour essayer de promouvoir Tests de caractérisation . < Pré> xxx


1 commentaires

Ouais, maintenant que j'y pense, j'aurais pu me tester facilement cela. Heh, je me sens muet. Merci. :)



4
votes

Ma question est, quand je crée un nouveau entier en utilisant les nouvelles Entier (i) que je pourrai être en mesure de comparer des entiers en utilisant ArrayList.contains ()? C'est-à-dire, quand je crée un nouvel objet à l'aide new Integer (i), que ce sera le même que l'objet entier précédemment créé si la valeur int utilisée pour les créer sont les mêmes?

La réponse courte est oui.

La longue réponse est ...

C'est-à-dire quand je crée un nouvel objet à l'aide new Integer (i), que les mêmes que l'objet Entier précédemment créé si la valeur int utilisée pour les créer sont les mêmes ?

Je suppose que vous voulez dire "... que ce sera la même instance comme ..." ? La réponse est pas -. Appeler nouveau sera toujours créer une instance distincte distincte de l'instance précédente, même si les paramètres du constructeur sont identiques

Cependant, malgré séparés identité , ces deux objets auront valeur équivalente , à savoir appeler equals () entre eux retourne vrai.

Collection.contains ()

Il se trouve que d'avoir des instances distinctes de valeur équivalente ( equals () retourne true ) est correct. .contains () Méthode est en Collection interface. La description de Javadoc .contains () dit:

http://java.sun.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

booléen contient (Object o)

Renvoie true si cette collection contient l'élément spécifié. Suite formellement, retourne vrai si et seulement si cette collection contient au moins un de telle sorte que l'élément e (o == null? e == null :. o.equals (e))

Ainsi, il fera ce que vous voulez.

Structure de données

Vous devriez également considérer si vous avez la structure de données droit.

La liste uniquement à propos de confinement? est l'ordre important? Avez-vous souciez de doublons? Étant donné que la liste est l'ordre, à l'aide d'une liste peut laisser entendre que vos soucis de code sur commande. Ou que vous avez besoin de maintenir des doublons dans la structure de données.

Cependant, si l'ordre n'a pas d'importance, si vous ne voulez pas ou n'aurez pas les doublons, et si vous utilisez vraiment que cette structure de données pour vérifier si contient une valeur spécifique, puis pourrait vous demander si vous devez utiliser un ensemble < / a> au lieu.


0 commentaires