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()

以下でこのメソッドを呼び出すと、最初の部分は各インスタンスを提供しますが、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;
    }
}
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);

}

ループ内でオブジェクトを作成することにより、反復ごとに異なるオブジェクトが追加されます。

于 2012-12-16T02:45:51.017 に答える