首页 > 解决方案 > 将对象添加到 ArrayList 时,已在列表中的具有 ArrayList 作为属性的其他对象被修改?

问题描述

目前,我有一个类“Test”,其中包含一个 observableList 的“Question”对象和一个 ArrayList 的“Question”对象。

每个对象都有以下属性: - 私有字符串问题;私有 ArrayList 语句;私有字符串类别;私人字符串反馈;

当我向列表中添加一个新的问题对象时。我的旧对象(已经在列表中)被更改。属性 ArrayList statements 成为最后添加 object-ArrayList statements 的值

首先我认为 observableList 的 .add 方法有一些特殊的功能,这就是为什么我添加了一个 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;
}
}

输出:

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-attribute。

标签: javaarraylisttostringobservablelist

解决方案


推荐阅读