0
votes

Copier l'objet de ArrayList sans référence de référence

Je veux faire ce qui suit:

J'ai une liste avec des objets, qui contiennent une date, je souhaite maintenant utiliser ces objets non seulement pendant une date, je veux définir la date et les réutiliser. La liste sélectionnée contient 5 éléments. P> xxx pré>

Comme vous devinez probablement, le journal affiche différentes dates causées par la boucle, mais la liste finale n'a que des éléments ayant la même date. p>

log.i me donne: p> xxx pré>

et itération via la liste, après que tous les objets ajoutés me donne: P>

while((stop.equals(countingDate)) || (countingDate.before(stop))) {
           for (c_TakeTimeObjects c_takeTimeObjects : SelectedList) {
                c_takeTimeObjects.setsActivityDate(c_HelperClass_CalToStringDate.get(countingDate,0,0,0));
                Log.i(TAG, "adjustDateRange: "+ c_takeTimeObjects.getsActivityDate());
                editList.add(c_takeTimeObjects);
               
           }
           countingDate.add(Calendar.DAY_OF_MONTH, +1);
       }


3 commentaires

Êtes-vous sûr que sélectionnée contient différents objets non seulement de multiples références à un seul objet? Et s'il vous plaît, écrivez votre code ayant des directives de code Java à l'esprit.


La liste sélectionnée contient des objets de la classe c_taketimeobjects et ils ont toutes des valeurs différentes attribuées. Comme le démarrage et l'arrêt du temps ou du statut. Dans mon exemple, la sélection sélectionnée a 5 objets.


J'ai ajouté le journal complet.I. avec la liste sélectionnée ayant 5 éléments


3 Réponses :


0
votes

Essayez de déplacer cette ligne c_taketimeobjects addingoDOBJ = nouveau c_takétimeobjects (1,1, "", true, ceci); dans pour ADDFingOBJ = c_taketimeObjects; < / code>

EDIT:

Je ne comprends pas votre code. Mais pouvez-vous essayer EDITList.add (c_taketimeObjects); au lieu de EDITLIST.ADD (addingoDOJ);


5 commentaires

Désolé, c'était ce que je voulais poster au début.


Vous vous avez peut-être demandé pourquoi j'ai fait l'objet AddingObj, car je pourrais utiliser C_TAKETIMEOBJECT directement. Mais j'ai fait cela, parce que je pensais que cela peut aider à briser la référence entre ces deux objets.


Oui vous avez raison. Je me demande quel est le résultat de c_helperclass_caltostringdate.get (compteringdate, 0,0,0) ?


J'ai fait cette aide, pour obtenir une date de chaîne (format dd.mm.yy) de la valeur de calendrier. Les valeurs INT dans le dos ne sont que quelques jours, mois ou années, vous souhaitez ajouter ou soustraire du calendrier que vous passez à l'avant.


Ok, faisons comme ceci: C_TAKETTIMEOBjects AddingoDOBJ = Nouveau c_taketimeObjects (1,1, "", vrai, ceci); AddingoDOBJ.SetSactivityDate (C_HELPERCLASS_CALTOSTOSTRINGDATE.GET (ComptageDate, 0, 0, 0));



0
votes

Permettez-moi de deviner: votre sélectionnée code> ne contient que 1 élément, non?
En fait, en faisant xxx pré>

, vous remplacez toujours votre variable addingoDOBJ code> avec c_taketimeobjects code> donc à la fin, vous avez ajouté 5 fois la même instance ( c_taketimeObjects) à votre Edition code> (et vous avez même modifié le contenu de votre sélectionnée code>) de
Donc, vous créez une nouvelle instance et copiez les attributs dont vous avez besoin manuellement p> xxx pré>

ou vous implémentez l'interface clonable p> xxx pré>

edit strong> Disons que vos 5 cas dans la liste sélectionnée sont A, B, C, D, E
1ère itération: avec p> xxx pré>

addingoDOBJ est F. Puis avec p>

addingObj = c_takeTimeObjects


10 commentaires

sélectionnéeList a 5 éléments dans mon exemple.


Donc, je ne comprends pas comment log.Je peut afficher des dates différentes: le jour du mois est augmenté à l'extérieur de la boucle


L'augmentation du champ n'est pas du mois, c'est le jour du mois.


J'ai déjà édité mon commentaire mais cela ne change pas le fait que compteringdate n'est jamais modifié dans la boucle


@Oliver Le jour du mois doit être attribué à tous les éléments de la liste et que l'incrément. Après cela, il devrait être attribué à tous les éléments de la liste et ainsi de suite.


Après avoir vu vos journaux mises à jour, je confirme que ma première réponse est correcte: vous avez ajouté 4 fois les 5 instances de votre sélectionnée sélectionnée et vous avez modifié la date de ces 5 instances à la dernière date = 28.06.2019. Seulement en créant des copies de ces instances peut résoudre votre problème


@Oliver Comment impliqueriez-vous une interface clothèque?


Juste ce Classe publique C_TAKETTIMEOBjects implémente la clonable dans votre déclaration de classe peut suffire. Sinon, vous devrez remplacer la méthode clone () de cette interface.


En fait, il y a aussi des inconvénients à propos de l'utilisation de la clonable, donc pratiquable au contexte dans lequel vous l'utilisez: Stackoverflow.com/questions / 4081858 / About-Java - Clonable . Le point principal ici est de rester en mesure de vous assurer de créer et d'utiliser une nouvelle instance quelle que soit la méthode que vous utilisez.


@Oliver maintenant s'il vous plaît éditer votre réponse et dites-moi pourquoi c_taketimeObjects AddObj = nouveau c_taketimeObject (1,1, "", vrai, this); addobj = c_taketimeObject; ne fonctionne pas, mais: addobj.setsAsactivityDate (c_taketimeobject.getsActivityState ()); Travaux.



0
votes

Si vous utilisez une arrachelist, rappelez-vous que même si vous ajoutez les objets à une autre arraylist, les deux tableaux feront référence au même objet.

Cela signifie que ce processus va comme:

pour chaque itération de la boucle tandis que vous ithétiez la boucle pour la boucle, modifiant l'attribut des objets. Après cela, vous les ajoutez à la nouvelle arraylist. Lorsque vous arrivez à la suivante tandis que l'itération, la boucle de la boucle change à nouveau les valeurs des mêmes objets, que vous ajoutez à nouveau à la nouvelle arrachelist.

Essayez cette solution de contournement:

génère un constructeur en c_takétimeobjects où vous pouvez passer un objet C_TAKETIMETIMECTS complet, puis modifier le code comme xxx


0 commentaires