質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4516閲覧

java 二つの文字列を比較して何文字違うか求める

porpora_0316

総合スコア37

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/08/23 07:09

0

1

前提・実現したいこと

javaで、二つの文字列が何文字違うかを求めたいと思っています。

java

1public class Main { 2 public static void main(String[] args) { 3 String A = "Banana"; 4 String B = "Bakana"; 5 String[] a = A.split(""); 6 String[] b = B.split(""); 7 int NO = 0; 8 9 for(int i=0;i<A.length();i++){ 10 if(a[i] != b[i]){ 11 NO=NO+1; 12 } 13 } 14 System.out.print(NO); 15   } 16}

[出力結果]
6

なぜ6になってしまうのでしょうか?
原因が分かりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2018/08/23 07:18

[原因] まず、"Banana"のような連続した文字がsplitできていない(Bとaが""という文字で区切られているわけではないから)。forループは6回まわるが、1文字ずつに分けられていないのでa[i]とb[i]が一致しない。
porpora_0316

2018/08/23 07:44

splitは作動しています。for文でSystem.out.println(a[i]);をしたらBananaと出たので。
guest

回答2

0

ベストアンサー

文字列同士の比較にはString#equalsを用いるべきだからです。
ただし、最初からString#charAtを使って文字同士の比較に落とし込んだ方が楽ですが。

アカウントを作り直したんでしょうか?
teratail - javaで採点をしたい

投稿2018/08/23 07:12

LouiS0616

総合スコア35678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

porpora_0316

2018/08/23 07:15

はい。本来掲載してはいけないことがわかったのですが、削除が出来なかったのでアカウントを作り直しました。
porpora_0316

2018/08/23 07:18

あと、問題文全てを掲載するのではなく、自分でデバッグをしたうえで何度か試してやり直してみて、それでもできなかったら質問しようかと…。
LouiS0616

2018/08/23 07:44

済んでしまったことはどうしようもない面もありますが、対処としてはちょっとまずったような気がします。 --- アカウントを作り直したことについて --- tetatailの規約では『複数のユーザーIDを1人で保有する行為』が禁止されています。 今回のようにアカウントを作り直す行為は直接抵触しないのかもしれないですが、おそらく歓迎される行為ではないように思います。 --- Paizaに関する質問をすることについて --- Paizaの規約では『当社がpaizaで出題した問題の内容、当該問題に対する解答、解答へのヒント等の示唆およびカンニング等の不正を助長する内容等を掲載する行為。』が禁止されています。 どこまで汎化すれば質問が許されるかは不透明なので、Paiza由来の質問は全くしないのが無難な選択なように思います。 公開可能な練習問題はネット上にいろいろありますので、学習目的には別のサイトを利用しては。 --- Paizaに関する質問をしたことについて --- 直接teratail運営に連絡して対処してもらうべきだったかと。
porpora_0316

2018/08/23 07:45

すいませんでした。もしもまた何かあったら気を付けます…。
porpora_0316

2018/08/23 07:58

paizaのスキルチェックはもう少し力をつけてからすることにしました。
guest

0

[解決方法]
1) 文字列を1文字ずつの配列にするには、Stringオブジェクトのsubstringメソッドを使います。
Aという文字列を、1文字ずつに分けて配列aに入れるなら、次のような感じになります。

for (i=0; i<A.length; i++) { a[i] = A.Substring(i,i+1) }

2)文字列の比較(何文字違うか)はレーベンシュタイン距離と呼ばれます。「レーベンシュタイン距離」でweb検索すれば、プログラム例が見つかると思います。
文字列の差は、対応する文字が違う、余分な文字が入っている、文字が抜けている、文字の順序が違う、など様々ケースがあり、それぞれを何文字違いとして扱うかもいくつかの流儀があります。
質問に書かれたコードよりも、だいぶ複雑なプログラムです。

投稿2018/08/23 07:30

coco_bauer

総合スコア6921

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/23 07:40

charAt / toCharArray をつかえばいいじゃんw。
porpora_0316

2018/08/23 07:45

ありがとうございます!レーベンシュタイン距離、勉強します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問