3

現在、ベクターから「ノイズ」を除去しようとしていますが、エレガントな方法が見つかりません。私は現在、文字列のベクトルと、それらの文字列が連続して発生する回数を表す別のベクトルを持っています。

何らかの理由で、私はそれを機能させることができないようです。これを行うために作成したメソッドを以下に示します。

public static void correctDisturbance(Vector<String> names, Vector<Integer> lengths, int lengthGuard){

    int guard = lengths.size();

    int total = 0;

    for(int i = 0; i < guard; i++)
    {
        if(lengths.elementAt(i) <= lengthGuard)
        {
            int newTotal = total + lengths.elementAt(i);

            while(total < newTotal)
            {
                System.out.println("Removing: " + names.elementAt(newTotal));
                names.removeElementAt(newTotal);
                newTotal--;
            }
            lengths.removeElementAt(i);
            guard--;
        }
        else
        {
            total += lengths.elementAt(i);
        }
    }

必要なもののいくつかは削除されますが、他のものは削除されません。しきい値を 5 に設定しています。

長さベクトルの内容の例: [15, 15, 1, 15, 2, 1, 1, 2, 1, 3, 1, 2, 1, 5, 1, 4, 1, 1, 3 ]

助けてくれてありがとう。

4

2 に答える 2

0

あなたの方法にはほとんど間違いがありませんでした。デバッグされたバージョンは次のとおりです。

public static void correctDisturbance(List<String> names,
        List<Integer> lengths, int lengthGuard) {
    int guard = lengths.size();
    int total = 0;
    for(int i = 0;i < guard;i++) {
        if (lengths.get(i) <= lengthGuard) {
            int newTotal = total + lengths.get(i);
            while( total < newTotal ) {
                newTotal--; // LINE MOVED
                System.out.println("Removing: " + names.get(newTotal));
                names.remove(newTotal);
            }
            lengths.remove(i);
            i--; // LINE ADDED
            guard--;
        } else {
            total += lengths.get(i);
        }
    }
}

ご覧のとおり、必要な変更は 2 つだけです。Java の配列とリストはゼロベースであるため、最初newTotalに使用する前にデクリメントする必要がありました。2 つ目は、リストからアイテムを削除したときに、エントリを見逃さないようlengthsにデクリメントする必要があったことです。i

于 2011-04-24T14:49:39.207 に答える
0

ベクターの代わりにハッシュを使用してカウントを保持します。キーは行で、値はカウントです。

また、Vector の代わりに ArrayList を使用します。必要に応じて、スレッドセーフにすることができます。

于 2011-03-23T13:17:13.977 に答える