Javaで2つの文字列から共通しない値を抽出して連結する方法
Javaでは、2つの文字列を比較し、どちらか一方にしか含まれない文字(共通しない値)を抽出して連結することができます。以下のコードでは、HashMapを活用することで効率的にこの処理を実現しています。
サンプルコード
import java.util.*;
import java.lang.*;
import java.io.*;
public class Demo{
public static String concat_str(String str_1, String str_2){
String result = "";
int i;
HashMap<Character, Integer> my_map = new HashMap<Character, Integer>();
for (i = 0; i < str_2.length(); i++)
my_map.put(str_2.charAt(i), 1);
for (i = 0; i < str_1.length(); i++)
if (!my_map.containsKey(str_1.charAt(i)))
result += str_1.charAt(i);
else
my_map.put(str_1.charAt(i), 2);
for (i = 0; i < str_2.length(); i++)
if (my_map.get(str_2.charAt(i)) == 1)
result += str_2.charAt(i);
return result;
}
public static void main(String[] args){
String my_str_1 = "ABMCD";
String my_str_2 = "MNCPQR";
System.out.println("The uncommon values concatenated from both strings is : ");
System.out.println(concat_str(my_str_1, my_str_2));
}
}
実行結果
The uncommon values concatenated from both strings is : ABDNPQR
コードの仕組み
Demoクラスには、2つの文字列を引数として受け取る「concat_str」メソッドが定義されています。処理の流れは以下の通りです。
- HashMapへの登録: まず、Character型をキー・Integer型を値とするHashMapのインスタンスを作成し、2つ目の文字列の各文字をすべて値「1」で登録します。
- 1つ目の文字列の走査: 1つ目の文字列を先頭から順に調べ、HashMapに存在しない文字は結果用の文字列「result」に追加します。すでに存在する文字(共通文字)は、値を「2」に更新することで、後の判定から除外できるようにします。
- 2つ目の文字列の再走査: 最後に2つ目の文字列を再度調べ、値がまだ「1」のままの文字(1つ目の文字列に現れなかった文字)だけを「result」に追加します。
こうして、どちらか一方の文字列にのみ含まれる文字だけが連結された文字列が完成し、メソッドの戻り値として返されます。
mainメソッドでの動作確認
mainメソッドでは「ABMCD」と「MNCPQR」という2つの文字列を用意し、concat_strメソッドを呼び出しています。この例では「M」と「C」が両方の文字列に共通するため除外され、残りの文字が連結された「ABDNPQR」がコンソールに出力されます。
計算量について
各文字列をそれぞれ1回ずつ走査するため、文字列の長さをn・mとすると時間計算量はO(n + m)です。また、HashMapには片方の文字列の文字数分のエントリが格納されるため、空間計算量はO(m)となります。
補足: StringBuilderの活用
サンプルコードでは文字列連結に「+=」を使用していますが、ループ内で頻繁に連結を行う場合は、StringBuilderを使うことで不要なオブジェクト生成を抑え、パフォーマンスを向上させることができます。
-
【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方
はじめに この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。 問題文 2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。 解決のアプローチ ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。 空の辞書を用意する 各文字列をsplit()で単語ごとに分割する 各単語の出現回数を辞書に記録する 出現回数がちょうど1回の単語だけを結果として返す 実装例 # 珍しい単語を見つける関
-
Javaで文字列を比較する方法|equals()とequalsIgnoreCase()の使い分けを徹底解説
Javaで文字列の等価性を比較する際は、Stringクラスが提供するequalsメソッドまたはequalsIgnoreCaseメソッドを使用するのが基本です。この記事では、それぞれのメソッドの使い方に加えて、==演算子で文字列を比較してはいけない理由についても詳しく解説します。 equals()メソッドで文字列を比較する 2つの文字列を比較し、大文字と小文字の違いまで厳密に判定したい場合はequals()メソッドを使用します。 次のコード例では、2つのStringインスタンスが大文字小文字を含むすべての文字において一致しているかどうかを判定しています。 public class Compare