簡體   English   中英

Java:實例ArrayList從靜態方法中的其他ArrayList派生

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM