0

我的代码的问题是,当我generateCSV()在下面调用时,ArrayList 的输出不正确。它正在用仅最后一个要实例化的实例替换所有实例,即最后一个实例正在替换所有先前的事件。

我的基类PausePred接受一个字符串和一个 ArrayList

public class PausePred {

    private String predString;  // the keys preceding the pause
    private ArrayList<KSE> kseArr;  // the arraylist of KSEs comprising the PausePred

    public PausePred(String predStr) { 
        this.predString = predStr;
        kseArr = new ArrayList<KSE>();
    } 

    public void setKseArr(ArrayList<KSE> kseArr) {
        this.kseArr.addAll(kseArr);
    }

PausePred中,我有一个静态方法来创建PausePreds.

public static Collection<PausePred> parseKseArray(KSE[] kArr) {

    Collection<PausePred> pausePredArray = new ArrayList<PausePred>();

    String pausePredStr = "";       // to store incrementally appended events preceding pause
    int pauseDur = 0;               // to store pause duration
    boolean startPosSet = false;    // checks if startPos has been set
    ArrayList<KSE> pausePredKseArr = new ArrayList<KSE>();;


    for (int kseArrIdx = 0; kseArrIdx < kArr.length; kseArrIdx++) {
        if (kArr[kseArrIdx].isKeyPress()) { // only down-keys
            // if start positio"n has not been set, set it, and update flag
            // set time stamp, as well
            if (startPosSet == false) {
                startPosSet = true;
                // get first char of PredStr by going back one index
                if (kseArrIdx > 0) {
                    pausePredStr = VisualCharStream.vkCodetoString(kArr[kseArrIdx-1].getKeyCode());
                    pausePredKseArr.add(kArr[kseArrIdx-1]);
                }
            }

            if (kArr[kseArrIdx].getM_pauseMs() < PauseBursts.PAUSE) {   // is not a pause
                //append vkCode (to string) to pausePred
                pausePredStr += VisualCharStream.vkCodetoString(kArr[kseArrIdx].getKeyCode());
                pausePredKseArr.add(kArr[kseArrIdx]);
            }

            else {  // is a pause

                //start incrementing pause duration, until a non-pause is reached
                while (kArr[kseArrIdx].getM_pauseMs() >= PauseBursts.PAUSE) {
                    pauseDur = (int) kArr[kseArrIdx].getM_pauseMs();
                    kseArrIdx++;
                }

                //add to pausePred array
                PausePred pp = new PausePred(pausePredStr);
                pp.setKseArr(pausePredKseArr);
                pausePredArray.add(pp);

                //reset variables
                pausePredStr = "";
                startPosSet = false;
                pausePredKseArr.clear();
                //need to take one step back from above while loop
                kseArrIdx--;
            }
        } // close outer if loop
    } // close for loop
    return pausePredArray;
} // close parseKseArray()

当我在下面调用此方法时,第一部分给出了每个实例,但第二部分只给出了数组中最后一个实例的 kseArr。

    public static void generateCSV(String fileName,ArrayList<PausePred> pausePredArr) {
        for (PausePred pp : pausePredArr)
System.out.println(pp.getPredString()+"\t"+pp.kseArr.get(pp.kseArr.size()-1).getKeyCode()); 
}

这是调用上面 parse 方法的提取方法。我不确定它是否与这个问题密切相关。

public class ExtractPausePred implements ExtractionModule {

    private static ArrayList<PausePred> pausePredArray = new ArrayList<PausePred>();

    @Override
    public void extract(DataNode data) {

        for (Answer a : data) {
            //create KSE array
            KSE[] kseArr = parseSessionToKSE(a.getKeyStrokes());

            //from above KSE array, extract Pause Predecessors
            pausePredArray.addAll(PausePred.parseKseArray(kseArr));
            PausePred.generateCSV("testing123",pausePredArray);
        }

        return null;
    }
}
4

2 回答 2

1

问题是您试图通过重用相同的对象来过早优化:

pausePredKseArr.clear();

创建一个新ArrayList的而不是清除旧的,你会没事的。

于 2012-12-16T02:42:29.917 回答
-1

我的代码的问题是,当我在下面调用 generateCSV() 时,ArrayList 的输出不正确。它正在用仅最后一个要实例化的实例替换所有实例,即最后一个实例正在替换所有先前的事件。

我没有详细阅读您的代码,也许您可​​以尝试减少它。但这几乎总是因为同一个对象(修改后)被添加到集合中,而不是new每次都创建一个实例:

SomeType s = new SomeType();
while (condition) {
      s.setAttr1(value1);
      s.setAttr2(value2);
      collection.add(s);

}

您所拥有的是.s中每个索引处的相同对象collection。它的属性将在最后一次迭代中添加相同的值。

你需要的是:

while (condition) {
      SomeType s = new SomeType();    
      s.setAttr1(value1);
      s.setAttr2(value2);
      collection.add(s);

}

By creating the object inside the loop, a different object is added in every iteration.

于 2012-12-16T02:45:51.017 回答