[英]Java: Instance ArrayList Derived From Other ArrayList in Static Method
我的代碼的問題在於,當我在下面調用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;
}
}
問題是您嘗試通過重用相同的對象來過早優化:
pausePredKseArr.clear();
創建一個新的ArrayList
而不是清除舊的ArrayList
,就可以了。
我的代碼的問題在於,當我在下面調用generateCSV()時,ArrayList的輸出不正確。 它僅用要實例化的最后一個實例替換所有實例,即,最后一個實例替換所有先前的事件。
我沒有詳細閱讀您的代碼,也許您可以嘗試減少它。 但這幾乎總是因為同一對象(修改后)被添加到集合中,而不是每次都創建一個new
實例:
SomeType s = new SomeType();
while (condition) {
s.setAttr1(value1);
s.setAttr2(value2);
collection.add(s);
}
collection
中每個索引處s
對象都是相同s
。 它的屬性將具有在上一次迭代中添加的相同值。
您需要的是:
while (condition) {
SomeType s = new SomeType();
s.setAttr1(value1);
s.setAttr2(value2);
collection.add(s);
}
通過在循環內創建對象,可以在每次迭代中添加不同的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.