При добавлении объекта в ArrayList, другой объект с ArrayList в качестве атрибута, который уже находится в списке, изменяется? - PullRequest
0 голосов
/ 03 декабря 2018

На данный момент у меня есть класс "Test" с observableList объектов "Question" и ArrayList объектов "Question".

Каждый объект имеет следующие атрибуты: - private String question;частные заявления ArrayList;частная строковая категория;private String feedback;

Когда я добавляю новый объект Question в списки.Мои старые объекты (которые уже есть в списке) меняются.Атрибуты ArrayList атрибутов становятся значением последних добавленных операторов object-ArrayList

Сначала я подумал, что метод .add из observableList имеет какую-то особую функцию, поэтому я добавил arrayList, но это ничего не меняет.

Я сделал несколько 'system.out.println', чтобы показать проблему.

Тест класса:

package model;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import java.util.ArrayList;


public class Test {
    private ObservableList<Category> categories;
    private ObservableList<Question> questions;
    private ArrayList<Question> questionArray;



public Test () {
    categories = FXCollections.observableArrayList();
    questions = FXCollections.observableArrayList();
    questionArray = new ArrayList<>();
}


public ObservableList<Category> getCategories(){
    return categories;
}

public ObservableList<Question> getQuestions() {
    return questions;
}

public void addCategory(Category category){
    categories.add(category);
}

public void addQuestion(Question question){
    questions.add(question);
}

public void makeCategories(ArrayList<String> elementen) {
    try {
        for (int i = 0; i < elementen.size(); i += 3) {
            String naam = elementen.get(i);
            String description = elementen.get(i + 1);
            String hoofdCategorie = elementen.get(i + 2);
            Category category = null;
            if (hoofdCategorie.equals("null")) {
                category = new Category(naam, description);
            } else {
                category = new Category(naam, description, hoofdCategorie);
            }
            categories.add(category);
        }
    } catch (Exception e) {
        throw new ModelException("Categorie aanmaken is niet gelukt");
    }
}


public void makeQuestions(ArrayList<String> primitieveQuestions) {
    ArrayList <String> statements = new ArrayList();
    for (int i = 0; i < primitieveQuestions.size();i+=4) {
        String question = primitieveQuestions.get(i);
        String category = primitieveQuestions.get(i+1);
        String feedback = primitieveQuestions.get(i+2);
        String primitieveStatements = primitieveQuestions.get(i+3);
        statements.clear();
        for (String woord:primitieveStatements.split("\\s",0)) {
            statements.add(woord);
        }
        Question x = new Question(question, statements, category, feedback);
        System.out.println("object");
        System.out.println(x.toString());


        questions.add(x);
        questionArray.add(x);

        // magic

        System.out.println("observableList");
        for (Question y : questions) {
            System.out.println(y.toString());
        }
        System.out.println("array");
        for (Question y : questionArray) {
            System.out.println(y.toString());
        }
        System.out.println(" ");

    }
}
}

Вопрос о классе

package model;

import javafx.collections.ObservableList;
import java.util.ArrayList;

public class Question {
    private String question;
    private ArrayList<String> statements;
    private String category;
private String feedback;

public Question (String question, ArrayList<String> statements, String category, String feedback ) {
    setQuestion(question);
    setStatements(statements);
    setCategory(category);
    setFeedback(feedback);
}

public Question (String question, ObservableList<String> statements, String category, String feedback ) {
    setQuestion(question);
    for (String x : statements) {
        setStringStatements(x);
    }
    setCategory(category);
    setFeedback(feedback);
}

//getters
public String getQuestion() {
    return question;
}

public ArrayList<String> getStatements() {
    return statements;
}

public String getCategory() {
    return category;
}

public String getFeedback() {
    return feedback;
}

//Setters
public void setQuestion(String question) {
    this.question = question;
}
//setter van een meegegeven arrayList
public void setStatements(ArrayList<String> statements) {
    this.statements = statements;
}

//setters als we een string aan onze lijst van statments willen toevoegen
public void setStringStatements(String statement) {
    this.statements.add(statement);
}

public void setCategory(String category) {
    this.category = category;
}

public void setFeedback(String feedback) {
    this.feedback = feedback;
}

@Override
public String toString() {
    return  category + " " + statements;
}
}

OUTPUT:

object
Design Patterns [Strategy, Facade, Observer, State]
observableList
Design Patterns [Strategy, Facade, Observer, State]
array
Design Patterns [Strategy, Facade, Observer, State]

object
Design principles [Juist, Fout, fout, fout]
observableList
Design Patterns [Juist, Fout, fout, fout]
Design principles [Juist, Fout, fout, fout]
array
Design Patterns [Juist, Fout, fout, fout]
Design principles [Juist, Fout, fout, fout]

object
principe [ik, wordt, zot]
observableList
Design Patterns [ik, wordt, zot]
Design principles [ik, wordt, zot]
principe [ik, wordt, zot]
array
Design Patterns [ik, wordt, zot]
Design principles [ik, wordt, zot]
principe [ik, wordt, zot]

Обратите внимание, как изменяется атрибут ArrayList каждого объекта в списке.Он получает значение последнего добавленного объекта его атрибута ArrayList.

...