У меня есть класс 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 герой, то отображается единственный герой)
лучшее представление результаты:
текущие:
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
Не удалось создать глубокую копию вектора, не затрагивая исходный вектор ⇐ JAVA
Программисты JAVA общаются здесь
1731176396
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 герой, то отображается единственный герой)
лучшее представление результаты:
текущие:
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79173391/failing-to-create-a-deep-copy-of-a-vector-while-not-affecting-original-vector[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия