一点保存类

时间:2014-04-05 16:06:51

标签: java class arraylist save

我有一个4个数组列表的保存类来制作ctrl + z的东西。问题是有时类会返回一个空数组。但是我总是在课堂上给出完整的阵列 - 任何人都可以帮忙吗?我试图找出问题,但我发现的唯一一件事就是当我第一次拨打“addtempsave”两次,然后拨打“getlastsave”然后一次“addtempsave”并且然后一次“getlastsave”。然后该方法返回空ArrayList

这是班级:

package main;

import java.util.ArrayList;

public class Undo {

    private ArrayList<ArrayList<Object>> tempsaves = new ArrayList<ArrayList<Object>>();

    public Undo() {

    }

    @SuppressWarnings("unchecked")
    public void addtempsave(ArrayList<Integer> mapLetters, ArrayList<Integer> gegnerLetters, ArrayList<Background> bgFinish, ArrayList<Background> bgFinish2) {

        ArrayList<Object> save = new ArrayList<Object>();

        ArrayList<Integer> ml = (ArrayList<Integer>) mapLetters.clone();
        ArrayList<Integer> gl = (ArrayList<Integer>) gegnerLetters.clone();
        ArrayList<Background> b1 = (ArrayList<Background>) bgFinish.clone();
        ArrayList<Background> b2 = (ArrayList<Background>) bgFinish2.clone();

        save.add(0,  ml);
        save.add(1,  gl);
        save.add(2,  b1);
        save.add(3,  b2);


        if(tempsaves.size() > 100) {
            tempsaves.remove(0);
        }

        tempsaves.add(save);
    }

    public ArrayList<Object> getlastsave() {

        if(tempsaves.size() == 1) {

            return tempsaves.get(0);

        }
        else {
            tempsaves.remove(tempsaves.size() - 1);

            return tempsaves.get(tempsaves.size() - 1);
        }
    }
}

这就是我加载旧东西的方式就是这样吗?

mapLetters.clear();
bgFinish.clear();
bgFinish2.clear();
gegnerLetters.clear();
UpdateArrayList tempsave =  backwart.getlastsave();
mapLetters = tempsave.ml;
gegnerLetters = tempsave.gl;
bgFinish = tempsave.b1;
bgFinish2 = tempsave.b2;

2 个答案:

答案 0 :(得分:0)

tempsaves.remove(tempsaves.size() - 1);//removing it first
return tempsaves.get(tempsaves.size() - 1);//then trying to return this

我认为您需要先将内容保存到某个对象

然后将其删除并返回已保存的内容

答案 1 :(得分:0)

下面的条件是危险的,如果tempsaves为空或size = 1(当第一个元素为空时)将抛出Exception

if(tempsaves.get(tempsaves.size() - 1).isEmpty()) {
        return tempsaves.get(tempsaves.size() - 2);
}

一般而言,不是针对空ArrayList案例进行编码(因为你写的是意料之外的,不应该发生)我会深入挖掘,试图了解导致问题的原因。尝试确定导致问题的输入序列(最后在你尝试做的事情中没有任何不确定性)并从中获取。

另外,我个人也考虑使用Stack代替ArrayList,因为它似乎与您要实现的目标相匹配(如果您正在寻找固定大小)堆栈看这里:Creating a fixed-size Stack)。

另外,为了帮助调试你考虑将这4个arraylists包装成一个Update类,即:

public class Update {

    final ArrayList<Integer> ml;
    final ArrayList<Integer> gl;
    final ArrayList<Background> b1;
    final ArrayList<Background> b2;

    public Update(ArrayList<Integer> ml, ArrayList<Integer> gl, ArrayList<Background> b1, ArrayList<Background> b2) {
        this.ml = (ArrayList<Integer>)ml.clone();
        this.gl = (ArrayList<Integer>)gl.clone();
        this.b1 = (ArrayList<Background>)b1.clone();
        this.b2 = (ArrayList<Background>)b2.clone();
    }

}

然后您可以轻松管理Stack<Update>集合,Update类本身可以轻松进行单元测试,打印等?