私のコードの問題は、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()
以下でこのメソッドを呼び出すと、最初の部分は各インスタンスを提供しますが、2 番目の部分は配列内の最後のインスタンスの 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;
}
}