Info

2つのデータリストを比較して完全一致するかどうか、一致してなかった場合はそのデータを出力するような処理方法はいろいろあると思いますが、アルゴリズムによって処理速度の差が生じます。

頭に浮かびやすい方法は片方(左)から一つのデータ取得、もう一方(右)のデータをループして左から取得したデータと比較し処理を行う、一致されたデータを何らかの方法でリストから削除する。全件検索して一致されなかった場合はそのデータを出力して次のデータを取り出して比較処理を行う。

下にあるJavaコードも2つのデータリスト(ArrayList)から完全一致チェックを行い、不一致項目を出力するプログラムです。この処理は上の処理とは違って片方を中心にして処理するではなく、添え字を操作して処理を行います。


/* * Copyright (C) footmark All rights reserved. * * Matchinger.java */ import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * マッチングクラス * * @author dongrikin@gmail.com */ public class Matchinger { public static void main(String[] args) { ArrayList left = new ArrayList(); left.add("A"); left.add("1"); left.add("B"); left.add("2"); ArrayList right = new ArrayList(); right.add("1"); right.add("3"); right.add("A"); right.add("2"); if(checkUnmatch(left, right)){ System.err.println("アンマッチ"); }else{ System.err.println("マッチ成功"); } } /** * チェック処理処理 * @param lL 左側リスト * @param lR 右側リスト * @return unmatch アンマッチフラグ */ public static boolean checkUnmatch(List lL, List lR){ //ソート Collections.sort(lL); Collections.sort(lR); //アンマッチフラグ初期化 boolean unmatch = false; int lsize = lL.size(); int rsize = lR.size(); //項目値初期化 String cnL = null; String cnR = null; int comp = 0, idxR = 0, idxL = 0; while(true){ //両側共に未完 if ( idxL < lsize && idxR < rsize ){ cnL = (String)lL.get(idxL); cnR = (String)lR.get(idxR); comp = cnL.compareTo(cnR); //両側共に完了 }else if ( idxL >= lsize && idxR >= rsize ){ break; //左側完了 }else if (idxL >= lsize){ cnR = (String)lR.get(idxR); comp=1; //右完了 }else if( idxR >= rsize ){ cnL = (String)lL.get(idxL); comp=-1; } //比較結果によって添え字操作 if (comp==0){ idxL++;idxR++; }else if (comp>0){ idxR++; unmatch=true; System.err.println("R-"+cnR); }else if (comp<0){ idxL++; unmatch=true; System.err.println("L-"+cnL); } } return unmatch; } }

Comments

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Basic HTML is allowed. Your email address will not be published.

Subscribe to this comment feed via RSS