二つの文字列を比較する方法

このQ&Aのポイント
  • 二つの文字列を比較して違う箇所を発見したとき、何らかの処理を行うようなプログラムを書きたいです。
  • 具体的には、変数exStr1とexStr2に文字列を宣言し、それらのどこが異なるかを知る処理が必要です。
  • 現在、exStr1とexStr2を「+」で区切って配列に入れ、更に「|」で区切りなおしていますが、違う箇所を探すための処理がうまく動作していません。
回答を見る
  • ベストアンサー

2つの文字列を比較する方法

二つの文字列を比較して違う箇所を発見したとき 何らかの処理を行うようなプログラムを書きたいのですが、 私の想像力が貧困な為そのアルゴリズムを考え付く事ができません どなたか知恵を貸していただけないでしょうか? 具体的には以下のようなことをやっています。 私は現在,変数で var exStr1="||||||||||+|1|2|3|4|5|6|7|8|9|+||||||||||"; var exStr2="||2||||||||+|1||3|4|5|6|7|8|9|+||||||||||"; と宣言しているとき私は exStr1とexStr2では文字列の何処が違うか知る処理を知りたいのです。 とりあえず今私は変数X1とX2に X1 = exStr1.split("+"); X2 = exStr2.split("+"); として「+」を区切り文字にして配列に入れてみて 更にソレを「|」で区切りなおしてみてます。 for(i=0;i<10;i++){   Y1 = X1[i].split("|");   Y2 = X2[i].split("|"); } そこで違う場所を探すための処理として私は以下のように書いて見ました。 しかし現在全然動いてくれません。 for(i=0;i<10;i++){   if(X1[i] != X2[i]){     for(j=0;j<4;j++){       if(Y2[j] != Y1[j] && Y2[i]==""){         //ここで何らかの処理をしたい。しかし今はif文の条件がおかしいのか、この行の処理に入らない。       }     }   } } う~。なんか質問の域を越えてるとも思いますし、 それに我ながら質問の意味がわかりづらいとは思うのですが お願いします。なんらかのヒントのようなものでも頂けたら幸いです。

  • youhi
  • お礼率83% (20/24)

質問者が選んだベストアンサー

  • ベストアンサー
  • Ap3
  • ベストアンサー率100% (1/1)
回答No.1

================ var exStr1 = "||||||||||+|1|2|3|4|5|6|7|8|9|+||||||||||"; var exStr2 = "||2||||||||+|1||3|4|5|6|7|8|9|+||||||||||"; var result = new Array(); for (X = 0;X < exStr1.length;X++){ if (exStr1.charAt(X) != exStr2.charAt(X)){ result[result.length] = X; } } ================  上記スクリプトにより、配列resultに何文字目が違うかが入ります。 ピンぼけでないことを祈りつつ、参考までに。

youhi
質問者

お礼

ありがとうございました。 私自身もっとよくまとめて問題を抽出してから書くべきだと思いながら書いてしまった事が一番問題でした。 大変申し訳ありません。 Ap3さんのサンプルは大変ためになりました。 ありがとうございました。

関連するQ&A

  • for文を使って変数に値を入れる方法

    以下のプログラムでfor文を使ってx1に1, x2に2, x3に3を代入したいのですが、 変数x1~3をfor文を使って表す方法がわかりません。 下記のように var test = "x" + i; で変数testにx1という文字列を持たせ、そこにiを代入すれば上手くいくかなと思いましたが 上手くいきません。どのようにすれば期待通りになるか教えていただけないでしょうか。 ============================================ var x1 = 0; var x2 = 0; var x3 = 0; for(var i=1; i<=3 ; i++){ //x1に1, x2に2, x3に3を代入したい var test = "x" + i; test = i; } alert("x1=" + x1 + ",x2=" + x2 + ",x3=" + x3); ============================================

  • 文字列から指定した文字を取り出す

    たとえば $test = "■-●-△-★-■■-■-■"; という文字列があったとして、 -で文字を区切り、■■は含めず■のみを取り出したい場合、 どのようにしたらいいのでしょうか。 $split = split("-",$test); $count_split = count($split); for($i=0; $i < $count_split; $i++){ if($split[$i] == "■"){ echo "{$split[$i]}"; } } としていますが、もっとスマートにできないのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列の比較について

    BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

    • ベストアンサー
    • Java
  • 変数を文字列として扱う方法

    VB初心者なのですが、 変数を、その変数のまま文字列で扱う方法がないかと悩んでいます。具体的に言うと、 たとえば、 Dim Bef(i,j) As String と宣言しておいて、 Bef(1,1)に、SCATTERBRAiN11 Bef(1,2)に、SCATTERBRAiN12 Bef(1,3)に、SCATTERBRAiN13 …… Bef(i,j)に、SCATTERBRAiNij という「文字列」を入れたいのです。 (最後の2文字i,jが、そのときの変数i,jの値。) これをFor構文を使って、 Bef(i,j)="SCATTERBRAiN" + i + j と書いたら、エラーになってしまいました。 iやjを、その変数に入っている数字の文字列として扱うには、どうすればいいのでしょうか。 よろしくお願いします。

  • excel VBAの文字列設定

    VBAで繰り返し作業を行っているのですが変数と文字列の組み合わせの設定に困っています。 for ~next(変数x)で繰り返しを行い medx の文字列を検索したいのですがうまくいきません。 疑問の部分は以下の範囲です 定義 x, y, i, ro, li as integer med1~medx までそれぞれ別の文字列(ex. med1= a med2 = b・・・ 統一性はないです) VBA部分 If y > 1 Then For x = 1 To y - 1 For i = 1 To 13 ←sheet数 For ro = 1 To 150 ←行 For li = 1 To 200 ←列 Worksheets("sheet" & i).Select If InStr(Cells(ro, li), "med" & x) > 0 Then ←疑問部分 med1、med2・・・を含むかどうか Cells(ro, li).Interior.ColorIndex = 3 Else End If Next Next Next Next else end if 上のように書くと"med1"を含むかどうがになってしまい、"a"を含むかどうかになりません。 わかりにくいかもしれませんが回答どうぞお願いします。

  • 文字列の中の1文字を比較するには?

    XP,Studio.NETでC++を書いています。 文字列の中の1文字を比較したいのですがどのようにしたらいいのかわかりません。 今以下のような文字列がstring[300]に入っているとします。 「\nは改行コードです。printf("");では"から"までの文字が画面に表示されます。」 このとき、1文字ずつを取り出し、文字を比較したいのですが (iを増加) if(string[i]=='\') flag=1; //処理→次にnが来る。 if(string[i]=='"') flag=2; //処理→文字はダブルコーテーション という処理をしたいのですが、 エラー:定数が多すぎます。 エラー:定数が2行目に続いています。 と出ます。どうしたらいいのでしょうか? どなたか教えていただけると幸いです。

  • 文字列型定数?

    この度、カウンタを埋め込みましたが どうしても、上記タイトルのスクリプトエラー が発生します。 <head> <script language="JavaScript"> <!-- function MM_preloadImages() { //v3.0 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array(); var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++) if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}} } function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc; } function MM_findObj(n, d) { //v3.0 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x; } function MM_swapImage() { //v3.0 var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3) if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];} } //--> </script> </head> 文字オーバーの為次へ(文字列型定数2)

  • [Fortran]文字列の並べ替え方法

    Fortranで以下のような文字列を使いやすい形に並べ替える方法を教えてください。 (元) x1_y1 x2_y2 x3_y3 ... (変更後) x1_y1_x2_y2_x3_y3 x4_y4_x5_y5_x6_y6 x7_y7_x8_y8_x9_y9 ...

  • matlabでの文字列の比較

    Matlabの初心者です。 CSVファイルを読み込んで、その中から特定の文字列がどこにあるかを探したいと思っています。 最初にすべてのデータを読み込んで all= textscan(fid, '%s', 'delimiter', '\n'); idata=all{1,1}; x=find(cellfun('isempty',idata)); idata(x)=[]; data_s=whos('idata'); adata=cell(data_s.size(1),10); for n=1:data_s.size; dummy=strtrim(textscan(idata{n},'%q %q %q %q %q %q %q %q %q %q','delimiter',',')); % dummy=regexp(idata{n},',','split'); for i=1:10; adata{n,i}=dummy{i} ; end gg=strcmp(dummy,'《ファイル情報》') end と行ってみましたが、変数で見ると文字列「《ファイル情報》」がありますが、比較では0となり検出できません。 変数表示のところで、同じ所にコピー、貼り付けを行うと検出するようになります。 何か、表示では見えない文字が入っているのかもしれませんが、どのように調べれば良いのかわかりません。よろしくご教授ください。

  • 配列への文字列の格納について

    C言語で文字列を扱う時、配列に1文字ずつ格納していくか、ポインタ変数を使うと思うのですが、 ポインタ変数を使った場合の処理が上手くできずに困っています。 詳細を説明すると、値を取得して、前回取得した値と比較します。 それで、同じだった場合には"chritm1"に格納した矢印を書き込む処理なのですが、 現在はfor文により配列に格納したものを使用していますが、 この部分をポインタ変数を使用した処理(1文字1文字書くのではなく、string型変数の用に書き込みたい) に変更したいのですが、上手くできないという状況です。 何かとっかかりとなるようなことでもかまいませんので、教えてください。 よろしくお願いします。 static int mainA( char *fileName){ int loop, i, j; FILE *fd; /* 前回値格納用 */ char *preval; /* 現在値格納用 */ char *thisval; /* 同値用記号格納用 */ char chritm1[6] = " → "; -- 中略 -- for( i = 0 ; i < 150 ; i++ ) { thisval = redata[i]; /* 値の比較 */ if(preval == thisval) { for( j = 0 ; j < 6 ; j++){ /* 前回値と同じ場合は矢印 */ fprintf( fd, ",%c",chritm1[j]); } }else{ /* 前回値と異なる場合は値 */ fprintf( fd, ",%s", thisval); } preval = thisval; /*完了したら改行 */ fprintf( fd, "\n" ); } -- 以下略 --

専門家に質問してみよう