Не удалось создать глубокую копию вектора, не затрагивая исходный векторJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Не удалось создать глубокую копию вектора, не затрагивая исходный вектор

Сообщение Anonymous »

У меня есть класс Player, в котором есть Vector, хранящий объекты Hero. Чтобы получить вектор, используйте этот метод:
public class Player {
private String playerID;
private String playerName;
private Vector heroes;

public Player(String playerID, String playerName) {
this.playerID = playerID;
this.playerName = playerName;
heroes = new Vector(2, 1);
}

// other getters and setters
public void addHero(Hero hero) {
heroes.add(hero);
}

public Vector getHeroes() {
return new Vector(heroes);
}
}

каждый раз, когда я выполняю действие (создаю игрока, добавляю героя и т. д.), я создаю сохранение (другой класс). внутри объекта Save он хранит список объектов Player, и для этого я создал класс Copier, который пытается создать глубокую копию всех Players и вектора каждого объекта Player, как показано ниже:
package memento;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import heroes.*;
import players.*;

public class Copier {
public Copier(){}

public List
getDeepCopy(List ogList){
List copyPlayerList = new ArrayList();
// loop each player
for (Player player : ogList){
try{
Player copyPlayer = createPlayerCopy(player);
// get player's heroes
Vector playerHero = new Vector();
playerHero.addAll(player.getHeroes());
// loop heroes and put into copy vector
for (Hero hero : playerHero){
Hero copyHero = createHeroCopy(hero);
// this is also adding another copy to og list why?
copyPlayer.addHero(copyHero);
}
copyPlayerList.add(copyPlayer);
}catch (Exception e){
System.out.println("Failed to copy");
e.printStackTrace();
}
}
return copyPlayerList;
}

private Player createPlayerCopy(Player player) throws Exception {
Class clazz = player.getClass();
// Create a new instance using the constructor that matches the Player class
Player copyPlayer = (Player) clazz.getDeclaredConstructor(String.class, String.class).newInstance(player.getPlayerID(), player.getPlayerName());

// If the subclass has additional properties, copy them using reflection
for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
if (!field.getName().equals("playerID") && !field.getName().equals("playerName")) {
field.setAccessible(true); // Make private fields accessible
field.set(copyPlayer, field.get(player)); // Copy value from original to copy
}
}

return copyPlayer;
}

private Hero createHeroCopy(Hero hero) throws Exception {
Class clazz = hero.getClass();
// Create a new instance using the constructor that matches the Hero class
Hero copyHero = (Hero) clazz.getDeclaredConstructor(String.class, String.class).newInstance(hero.getHeroID(), hero.getHeroName());

// Set the base stats from the original hero to the copy
copyHero.setDamage(hero.getDamage());
copyHero.setHP(hero.getHP());

// If the subclass has additional properties, copy them using reflection
for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
if (!field.getName().equals("heroID") && !field.getName().equals("heroName") && !field.getName().equals("hp") && !field.getName().equals("damage")) {
field.setAccessible(true); // Make private fields accessible
field.set(copyHero, field.get(hero)); // Copy value from original to copy
}
}

return copyHero;
}
}

однако эта строка ,copyPlayer.addHero(copyHero); каким-то образом добавляет копию Hero к исходному вектору
без изменения кода как в классе Player, так и в классе Hero, как мне этого добиться?
текущий результат:
при отображении статистики игрока отображается имя игрока, идентификатор и все герои (если создан только 1 герой, каким-то образом отображаются 2 одинаковых героя, с тем же именем, идентификатором и классом)
желаемый результат:
при отображении статистики игрока отображается имя игрока, идентификатор и все герои (если создан только 1 герой, то отображается единственный герой)
желаемый результат:
при отображении статистики игрока отображается имя игрока, идентификатор и все герои (если создан только 1 герой, то отображается единственный герой)
желаемый результат:
при отображении статистики игрока отображается имя игрока, идентификатор и все герои (если создан только 1 герой, то отображается только один герой)
p>
лучшее представление результатов:
текущий:
Showing player info for test1
ID: p01
Name: test1
Heroes:
debugging in player class
Hero: hero1 (h02)
Class: Warlock
HP: 150
Damage: 200
MP: 250

debugging in player class
Hero: hero1 (h02)
Class: Warlock
HP: 150
Damage: 200
MP: 250

желательно:
Showing player info for test1
ID: p01
Name: test1
Heroes:
debugging in player class
Hero: hero1 (h02)
Class: Warlock
HP: 150
Damage: 200
MP: 250


Подробнее здесь: https://stackoverflow.com/questions/791 ... nal-vector
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»