J'ai un problème avec ArrayList. J'utilise ArrayList comme ceci: où la liste de lecture est une classe héritée d'une autre arrayliste.
Je fais ce qui suit: p> plus tard, lorsque j'utilise "P" pour obtenir l'index dans la liste: p> Un indice de '1' est renvoyé, même si l'inspection de la liste montre clairement que son indice '4'. P> Est-ce que quelqu'un sait pourquoi cela échoue?
Merci. P> b.r.
Morten p> EDIT: STRUT>
Même problème sans indexof (), en utilisant des égaux (): p> neuf modifier: strong>
Cela fonctionne!: P> solution: strong>
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. P> Cela fait l'affaire; Maintenant, indexofof () renvoie l'objet correct! P> Merci à tous les contributeurs! P> P>
4 Réponses :
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);
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.
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
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 code> (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 () code> ou
_getindex () même mieux, prépupendant " Testez "à la méthode ....
@MORTEN: Moi non plus, si vous héritez vraiment ArrayList CODE> 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
du API : P>
int indexof (objet o) code>: p>
retourne l'index de la première occurrence de l'élément spécifié dans cette liste ou
-1 code> 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))) code> ou
-1 code> s'il n'y a pas de tel index. p> blockQuote>
La réponse est donc que vous devez remplacer
.equals () code> dans
lecture de liste de lecture code>. P>
Il ne devrait pas s'il n'hérite vraiment pas arraylist code> car cette méthode est déjà remplacée pour cette classe. Donc, la suggestion serait pas b> 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? ...
Il peut y avoir de nombreuses raisons pour ce comportement: p>
1) Si plusieurs éléments d'une arrachelist sont égaux (selon la méthode des égaux), alors le premier em> est renvoyé. Peut-être que vous avez simplement plusieurs objets identiques. P>
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. P>
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. P>
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.
Qu'y a-t-il de MplayLists.get (1); ? Avez-vous remplacé
égale () code> dans
lecture de liste de lecture code> - 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 code> code> s et peupler la liste.
En outre, considérons non b> hériter de
arraylist code>, mais en avoir une comme une variable d'instance privée dans la liste de lecture (créez la liste
Liste code> dont vous avez besoin dans votre < Code> Playlist CODE> et les déléguez-vous à la liste privée
ArrayList code> 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