重複のアルゴリズム(配列)

前回は、相互チェック(重複エラーチェック)を2重ループで実装した。しかし、ループを1回で実装することもできる。

 前回の内容は下記参照。

instery.hatenablog.com

 

画面イメージ

一覧形式の入力項目にエラーチェックを実装しようとする。

製品入庫登録

 

 

No.製品番号数量
1
2
3
4
5

 

仕様

①登録ボタンを押下後、製品番号が重複している場合、エラーを表示する。

 

エラーを画面上部に表示する場合

重複データを単純に知らせたい場合、画面の上部もしくはJavaScriptのalertでポップアップエラーを表示することがある。

製品入庫登録

 

 

No.製品番号数量
1
2
3
4
5

ソース

ボタンを押した時に呼び出される関数は、下記に記載。

  1. function buttonfunction1() {
  2.     var ary = new Array(5);
  3.     ary[0]=document.getElementById('seiban1_1').value;
  4.     ary[1]=document.getElementById('seiban1_2').value;
  5.     ary[2]=document.getElementById('seiban1_3').value;
  6.     ary[3]=document.getElementById('seiban1_4').value;
  7.     ary[4]=document.getElementById('seiban1_5').value;
  8.     
  9.     var count = 0;
  10.     var errorFlg = false;
  11.     for (i = 0; i < 5; i++) {
  12.         if (ary[i] == "") {
  13.             count++;
  14.             continue;
  15.         }
  16.         if (ary.indexOf(ary[i]) < i){
  17.             errorFlg = true;
  18.         }
  19.     }
  20.     if (count == 5) {
  21.         document.getElementById('msg1').innerHTML = "<font color='red'>登録データがありません。</font>";
  22.         return;
  23.     }
  24.     if (errorFlg) {
  25.         document.getElementById('msg1').innerHTML = "<font color='red'>製品番号が重複しています。</font>";
  26.     } else {
  27.         document.getElementById('msg1').innerHTML = "登録しました。";
  28.     }
  29. }

解説

大きな処理は3つ。

配列・変数の定義、重複判定処理、メッセージ・エラー表示。

前回との変更点としては、重複判定はFor文のみで実装している。

  1. 2~7行目 入力項目を配列にセット。
  2. 9行目 全てが空行か判定する変数(※1)
  3. 10行目 重複行があるか判定する変数(※2)
  4. 11行目 For文 全行判定します。
  5. 12~15行目 空行の場合、次の行に移る。空行判定変数(※1)にインクリメント。
  6. 16~18行目 現在行の値が配列の何番目か取得、現在行より小さい場合は重複エラー変数(※2)をtrue。
  7. 21~24行目 空行判定変数(※1)が全行の場合、エラーを表示。処理終了。
  8. 27行目 重複エラー変数(※2)がtrueの場合、エラーを表示。
  9. 29行目 そうでない場合、登録成功。

計算量の確認

上記のソースは、前回と比べると、試行回数がnとなっており、行数によって累次的に計算量が増加はしない。

結論

重複のエラーが存在するかだけを判定する場合は、For文1回だけで判定することができる。

この方法を用いれば、javaのList系でcontainsメソッドなどを利用して重複チェックも可能となる。