1

iJavaループで条件が満たされたときにインクリメントをデクリメントしようとしています。例:2つ以上の後続の等しい整数に出会ったときにそれらをマージしたい多くの(昇順でソートされた)整数を含むArrayListがあるとします。

for(int i=0; i<intArr.size();i++){

 if(intArr.get(i).equals(intArr.get(i+1))){
    intArr.set(i,(intArr.get(i) + intArr.get(i+1)));
    intArr.remove(i+1);
    i--;
 }

} 

メッセージの下部にあるより具体的な例。

これは失敗し、インクリメンター(i)は「一時的に」(i--)に設定されますが、for行に戻ると、元の値になります。次の反復でまだ比較できるように、iをデクリメントする方法がわかります(i == i + 1?)ありがとうございます

public class Test
{
  private static final long serialVersionUID = 1L;

  public static void main(String[] args)
  {

    ArrayList<Integer> intArray = new ArrayList<Integer>();
    intArray.add(1);
    intArray.add(2);
    intArray.add(3);
    intArray.add(4);
    intArray.add(4);
    intArray.add(4);
    intArray.add(5);
    intArray.add(6);
    intArray.add(7);
    intArray.add(8);
    intArray.add(9);
    intArray.add(9);
    intArray.add(9);
    intArray.add(9);
    intArray.add(10);
    intArray.add(11);
    intArray.add(12);
    intArray.add(12);

    for (int i = 0; i < (intArray.size() - 1); i++)
    {
      if (intArray.get(i).equals(intArray.get(i + 1)))
      {
        intArray.set(i, (intArray.get(i) + intArray.get(i + 1)));
        intArray.remove(i + 1);
        i--;
      }
    }

    for (int i = 0; i < intArray.size(); i++)
    {
      System.out.println(intArray.get(i));
    }
  }

}

プリント:

1
2
3
8
4
5
6
7
8
18
18
10
11
24
4

4 に答える 4

2

インデックスをジャグリングする代わりに、Iterator.removeストリークを折りたたむために使用することをお勧めします。

final List<Integer> intArr = new ArrayList(Arrays.asList(1,1,2,2,2,4,5,7));
Integer previous = null;
for (Iterator<Integer> iter = intArr.iterator(); iter.hasNext();) {
  final int curr = iter.next();
  if (previous == null) previous = curr;
  else if (previous == curr) iter.remove();
  else previous = curr;
}
System.out.println(intArr);
于 2013-01-02T12:38:41.860 に答える
2

これは、最初の2つの4が見つかると、それらが8に変更されるためです。3番目の4が来ると、配列は次のようになります。

1 2 3 8 456。。。

そのため、今回は(8 == 4)かどうかをチェックしますが、これは誤りです。したがって、次の4つをスキップします。

于 2013-01-02T12:44:44.560 に答える
2

おやおや...あなたのコーディングスタイルはきれいではありません...この方法で多くのエラーが発生します。

1)自動ボクシングは使用しないでください。特に==との比較に関してはそうではありません

2)例を書くときは、実際に実行できるようにすべての詳細を追加します(これには、使用しているバッキングリストなどに関する多くの役立つヒントも含まれています)[編集:質問を拡張したようです]

3)++iとi++の違いを理解する(実際には関連していませんが、他の状況で役立つ可能性があります)

4)[i]と[i + 1]が等しい場合、なぜジャンプバックするのですか?

5)バッキングリスト(この場合はintArr)は、アイテムを削除するときに順序を維持できない場合があります。

6)一意の値を格納するためのセットまたはマップを検討します。HashSetまたはTreeSetを使用して、要素の並べ替え/順序付けを含めます

7)それでも昔ながらの方法で使用したいので、whileループを使用します。

于 2013-01-02T12:44:52.470 に答える
1

条件変数が反復ごとに増分しない場合は、whileループを使用できます。また、読みやすさも向上します。

int i = 0;
while((i-1)<intArr.size())
{
  if(intArr.get(i).equals(intArr.get(i+1)))
  {
    intArr.set(i,(intArr.get(i) + intArr.get(i+1)));
    intArr.remove(i+1);
  }
  else
  {
    i++;
  }
} 
于 2013-01-02T12:32:47.023 に答える