Java
 Computer >> コンピューター >  >> プログラミング >> Java

【Java】リスト内の文字列から入力パターンに一致するすべての文字列を見つける方法

本記事では、Javaを使って、リスト(文字列配列)の中から、指定した入力文字列と同じパターン構造を持つすべての文字列(近似一致)を見つける方法を解説します。

ここでいう「パターンが一致する」とは、文字そのものが同一であることではなく、文字の出現構造が同じであることを意味します。たとえば「ddcc」は「aabb」「xxyy」「mmnn」と同様に、「異なる2種類の文字がそれぞれ2回ずつ連続して現れる」という共通のパターンを持っています。このような一致を検出することで、見た目は違っても構造が似ている文字列を効率よく抽出できます。

サンプルコード

import java.io.*;
import java.util.*;
public class Demo{
    static String string_encoding(String str){
        HashMap<Character, Integer> my_map = new HashMap<>();
        String result = "";
        int i = 0;
        char ch;
        for (int j = 0; j < str.length(); j++) {
            ch = str.charAt(j);
            if (!my_map.containsKey(ch))
                my_map.put(ch, i++);
            result += my_map.get(ch);
        }
        return result;
    }
    static void match_words(String[] my_arr, String my_pattern){
        int len = my_pattern.length();
        String hash_val = string_encoding(my_pattern);
        for (String word : my_arr){
            if (word.length() == len && string_encoding(word).equals(hash_val))
                System.out.print(word + " ");
        }
    }
    public static void main(String args[]){
        String[] my_arr = { "mno", "aabb", "pqr", "xxyy", "mmnn" };
        String my_pattern = "ddcc";
        System.out.println("The patterns similar to ddcc in the array are :");
        match_words(my_arr, my_pattern);
    }
}

実行結果

The patterns similar to ddcc in the array are :
aabb xxyy mmnn

コードの解説

Demo クラスには、string_encoding という関数が定義されています。この関数は HashMap を生成し、文字列を先頭から1文字ずつ走査します。初めて登場した文字には新しい番号(0, 1, 2…)を割り当て、すでに登場済みの文字には同じ番号を再利用することで、文字列を「パターンを表す数値列」へ変換します。これにより、「ddcc」→「0011」、「aabb」→「0011」といったように、構造が同じ文字列は必ず同じ符号化結果になります。

次に、match_words 関数では、まず基準となるパターン文字列を string_encoding で符号化し、そのハッシュ値を保持します。続いて配列内の各単語を順にチェックし、文字数がパターンと一致し、かつ符号化結果も等しい場合に、その単語を出力します。

最後に main 関数では、比較対象となる文字列配列とパターン「ddcc」を定義し、match_words 関数を呼び出しています。その結果として、パターンに一致する「aabb」「xxyy」「mmnn」の3つの文字列がコンソールに表示されます。

ポイントまとめ

  • 文字の並びではなく構造で比較できる: 具体的な文字が異なっていても、出現パターンが同じなら一致と判定されます。
  • 文字数チェックによる高速化: 長さが異なる単語は早期に除外されるため、無駄な符号化処理を削減できます。
  • 応用範囲が広い: この手法は、類似語句の検索やデータクリーニングなど、さまざまな場面で活用できます。
  1. Pythonのdifflibでリストから入力文字列に近い一致を検索する方法

    ある単語が与えられたとき、それと完全に一致するものではなく、パターンが似ている別の単語(近似一致)を見つけたいことがあります。Pythonでは、標準ライブラリのdifflibモジュールに含まれるget_close_matchesメソッドを使うことで、このような曖昧なマッチングを簡単に実現できます。 get_close_matchesメソッドとは get_close_matchesは、difflibモジュールの一部であり、指定した候補の中から対象の単語に最も近い一致を返してくれるメソッドです。構文は以下の通りです。 difflib.get_close_matches(word, possibil

  2. Pythonでリスト内の文字列から指定文字列に近い一致をすべて見つける方法

    はじめに このチュートリアルでは、「文字列のリストの中から、指定された要素に近い一致をする文字列をすべて見つける」という問題の解決策を紹介します。まず、問題の内容を確認してみましょう。 問題の概要 文字列のリストと1つの要素が与えられたとき、リストの中からその要素と近い一致となる文字列を探し出します。以下の例を見てください。 入力: strings = ["Lion", "Li", "Tiger", "Tig"] element = "Lion" 出力: Lion Li 解決のアプローチ