10
votes

ArrayList IndexOf () renvoie le mauvais index?

J'ai un problème avec ArrayList. J'utilise ArrayList comme ceci: xxx

où la liste de lecture est une classe héritée d'une autre arrayliste. Je fais ce qui suit: xxx

plus tard, lorsque j'utilise "P" pour obtenir l'index dans la liste: xxx

Un indice de '1' est renvoyé, même si l'inspection de la liste montre clairement que son indice '4'.

Est-ce que quelqu'un sait pourquoi cela échoue? Merci.

b.r. Morten

EDIT: Même problème sans indexof (), en utilisant des égaux (): xxx

neuf modifier: Cela fonctionne!: xxx

solution: Comme suggéré, j'ai changé la classe de la liste de lecture pour ne pas hériter d'arraylist, mais plutôt de garder une instance en privé. Il s'est avéré que je n'ai eu qu'à implémenter 4 méthodes d'arrayage.

Cela fait l'affaire; Maintenant, indexofof () renvoie l'objet correct!

Merci à tous les contributeurs!


7 commentaires

Qu'y a-t-il de MplayLists.get (1); ? Avez-vous remplacé égale () dans lecture de liste de lecture - quelque chose funky là-bas?


La liste de lecture remplace-t-elle l'index de ArrayList?


Ma réponse initiale est "la p que vous n'avez pas ce que vous pensez avoir" suivi de "One P pense que c'est un autre p (ou ne sait pas ce qu'il est lui-même)".


Wow, c'est une réponse rapide !! Merci les gars! Eh bien, non - je n'ai pas écrasé égal (). Cependant, il semble y avoir quelque chose de funky avec des égaux (). Lorsque je ithétiez dans une boucle, recherchez l'article - en utilisant des égaux () à titre de comparaison, il trouve le mauvais objet à l'index 1 !! En inspection, je peux constater que les premiers membres sont identiques, mais quelques différences suivent. Peut être égal à () éventuellement être confondu par cela? Ajouter mon test de code dans Modifier


Je suis un peu curieux de voir le code dans lequel vous instaniez la liste de lecture s et peupler la liste.


En outre, considérons non hériter de arraylist , mais en avoir une comme une variable d'instance privée dans la liste de lecture (créez la liste Liste dont vous avez besoin dans votre < Code> Playlist et les déléguez-vous à la liste privée ArrayList selon le cas). En prolongeez probablement plus que vous avez besoin.


Merci, de bons conseils à ne pas hériter - considéreront cela. Concernant la demande de code réelle - laissez-moi voir si je peux éditer dans un code réel


4 Réponses :


-1
votes

Je ne sais pas pourquoi vous avez ce problème, mais je pense que si j'étais vous, je choisirais d'utiliser la nouvelle liste générique pour créer votre liste comme celle-ci:

List<Playlist> mPlaylists = new List<Playlist>();

p = new Playlist(<some parameters>);
mPlaylists.Add(p);


3 commentaires

Impossible d'instancier une liste .. ne pouvait pas tendre la chance de voter cependant, hors des voix aujourd'hui ;-)


L'OP utilise la forme générique - juste pas l'interface de la liste, mais l'arrayage de mise en œuvre. Bien que pas totalement propre, cela considérait généralement bien comme membre privé d'une classe. Lorsque vous avez écrit simplement ne compilera pas - vous ne pouvez pas instancier une liste - c'est une interface. Mettez «ArrayList» sur le côté droit de la mission et ça ira bien.


@Lauri - Jamais la peur, j'ai des votes à gauche> :-) Russ - cela ne compilera même pas et ne répond pas à la question.



8
votes

Très probablement Votre Playlist Code> Mesté avec le tableau par défaut est égal à la mise en œuvre code>, car la manière dont indexof code> est Calculé à quelque chose comme:

indexOf(Object o) 
   if( o == null ) then iterate until null is found and return that index
   if( o != null ) iterate until o.equals( array[i] ) is found and return taht index
   else return -1 
end


5 commentaires

Selon votre nouvelle modification, vous faites référence à la comparaison qui me fait penser que vous n'êtes pas vraiment hériter du tableau du tout. On dirait que tu fais quelque chose de vraiment étrange avec ce lecture de la liste de lecture (comme à l'aide de noms de méthodes majuscules Yiack ...)


Hehe, oui - mais au moins en utilisant le nom de la méthode majuscule, je n'oublierai pas que ce n'est qu'une méthode de test, dans le but de suivre ce problème :-) Merci!


Je suppose que la comparaison de référence fonctionne dans ce cas parce que c'est simple. Je ne vois toujours pas ce que j'aurais pu faire avec la classe pour contrarier les égaux ()?


Jejej ... vous allez, croyez-moi .. vous allez ... :) Qu'en est-il d'utiliser un soulignement comme _Add () ou _getindex ()


@MORTEN: Moi non plus, si vous héritez vraiment ArrayList PAS NE PAS QUELQUES SIÈGE. Essayez ceci, si vous avez une méthode .Equals, renommez-la à ... .Myequaux ... pour laisser la mise en œuvre par défaut (arraylist) fonctionner et voir si cela aide



2
votes

du API :

int indexof (objet o) :

retourne l'index de la première occurrence de l'élément spécifié dans cette liste ou -1 si cette liste ne contient pas l'élément. Plus formellement, renvoie l'index le plus bas que tel que (o == null? Obtenez (i) == NULL: O.Equals (get (i))) ou -1 s'il n'y a pas de tel index.

La réponse est donc que vous devez remplacer .equals () dans lecture de liste de lecture .


2 commentaires

Il ne devrait pas s'il n'hérite vraiment pas arraylist car cette méthode est déjà remplacée pour cette classe. Donc, la suggestion serait pas de le remplacer à nouveau (ou de le faire correctement)


Hmm ... alors qu'est-ce que j'ai fait; Hériter d'arraylist et ne pas remplacer les équivalents () devrait fonctionner? ...



0
votes

Il peut y avoir de nombreuses raisons pour ce comportement:

1) Si plusieurs éléments d'une arrachelist sont égaux (selon la méthode des égaux), alors le premier est renvoyé. Peut-être que vous avez simplement plusieurs objets identiques.

2) Votre classe de playlist étendra l'arraylist (je ne suis pas sûr que ce soit une bonne idée). Par conséquent, si vous n'avez pas remplacé la méthode Equals, la comparaison est basée sur la séquence d'éléments uniquement. Par exemple, toutes deux instances de playlist vides seront considérées comme égales.

3) Si vous avez rempli des égaux, vérifiez votre implémentation. Il doit retourner vrai pour une comparaison avec la même référence et, dans votre cas, ce n'est pas le cas.


2 commentaires

Je peux voir votre point, mais comme je ne remplaçais pas l'équivalent (), et il y a des membres de la chaîne de fureur qui diffèrent, je ne m'attendrais toujours pas à ce qu'ils viennent comme «égaux»?


@Morten Pries: Quel était le type d'éléments à l'intérieur de la playlist? Quelle était la mise en œuvre égale () pour ce type? Si la liste de lecture contient simplement des objets de chaîne, je ne peux pas expliquer ce comportement.