この質問では、条件付きインクリメントを実行する方法を尋ねました。提供された回答は機能しましたが、巨大なデータセットではうまくスケーリングできません。
入力:
<Users>
<User>
<id>1</id>
<username>jack</username>
</User>
<User>
<id>2</id>
<username>bob</username>
</User>
<User>
<id>3</id>
<username>bob</username>
</User>
<User>
<id>4</id>
<username>jack</username>
</User>
</Users>
望ましい出力 (最適な時間複雑度で):
<Users>
<User>
<id>1</id>
<username>jack01</username>
</User>
<User>
<id>2</id>
<username>bob01</username>
</User>
<User>
<id>3</id>
<username>bob02</username>
</User>
<User>
<id>4</id>
<username>jack02</username>
</User>
</Users>
この目的のために、
- 入力をユーザー名でソート
- ユーザーごとに
- 以前のユーザー名が現在のユーザー名と等しい場合
- インクリメントカウンターと
- ユーザー名を「$username$counter」に設定します
- それ以外は
- カウンターを1に設定
- 以前のユーザー名が現在のユーザー名と等しい場合
- (再度 ID でソート -要件なし)
何かご意見は?