1

さまざまな位置に「時間 (GMT)」、「なし」、「センサーなし」の値を含むことがある ArrayList があります。それらのすべてのインスタンスを削除したいので、この小さな for ループを書きました。

for(int i = 0; i < trackedFieldsMod.size(); i++ ) {
    if(trackedFieldsMod.get(i).equalsIgnoreCase("Time (GMT)") || trackedFieldsMod.get(i).equalsIgnoreCase("None") || trackedFieldsMod.get(i).equalsIgnoreCase("No Sensor")) {
        trackedFieldsMod.remove(i); //Don't let users find average/mean/etc for irrelevant fields
    }
}

何らかの理由で、これによりリストの先頭にある「時間 (GMT)」と、リストの末尾にある「なし」または「センサーなし」が削除されますが、ArrayList に「なし」または「センサーなし」がある場合"途中のどこでも、それらは削除されません。私は一生、理由を理解することはできません。何かご意見は?ありがとう!

4

4 に答える 4

8

位置 i のリスト項目を削除すると、以前は i + 1 にあった項目が i に移動します (すべてが i に向かって 1 セル移動します)。

ただし、次の for ループの反復では i が i + 1 になるため、基本的には、削除操作で以前に i + 1 から i に移動したアイテムをスキップしています。アイテムを削除するときは、i をデクリメントする必要があります。

于 2012-06-26T16:30:44.583 に答える
4

私は通常、イテレータを使用してこれを行います。

for (Iterator<String> iterator = trackedFieldsMod.iterator(); iterator.hasNext();) {
    String string = iterator.next();
     if("Time (GMT)".equalsIgnoreCase(string) || "None".equalsIgnoreCase(string) || "No Sendor".equalsIgnoreCase(string)) {
            iterator.remove(); //Don't let users find average/mean/etc for irrelevant fields
     }
}
于 2012-06-26T16:35:16.623 に答える
1

完全を期すために、いくつかの便利なメソッドを使用してこの種のことを行うこともできることを追加します。

List<String> toRemove = Arrays.asList("Time (GMT)", "None", "No Sendor");
trackedFieldsMod.removeAll( toRemove );
于 2012-06-26T17:21:49.207 に答える
0

文字列のメソッドを含むだけを使用してください..それはあなたの問題を解決するはずです

于 2012-06-26T16:34:21.863 に答える