【Android】定期的にサイト情報を取得4 
~差分検出をプログラミング~

前回の続きです。

正規表現でHTMLから物件情報を取得した後、②のサイト情報の差分を検出を実装したいと思います。

取得したHTMLから検出したいパターンを変数に格納します。

検出したいパターンは前々回に検証した以下のパターンですが、「.*」を「.*?」に変更します。

なぜかというと、「.*」のままだと複数の物件情報が一つの物件情報として取得されてしまうからです。

詳しく知りたい方は、最短一致や最長一致で検索してみてください。

(?<=div class=”comment web_pr”><p>).*?(?=</p>)

変数に格納しましょう。

val regex = Regex(“””(?<=div class=”comment web_pr”><p>).*?(?=</p>)”””)

では、正規表現で文字列を検出します。検出するための配列を用意し、「regex.findAll(文字列)」で文字を抽出します。

val matchResults: Sequence = regex.findAll(body)

結果は配列に格納しましょう。

//配列を用意
var bukken_list : MutableList<String> = mutableListOf()
matchResults?.forEach {
    //配列に追加
    bukken_list.add(it.value)
}

取得した物件情報を見てみましょう。

取得できているようですが、重複が多いですね。

重複を削除しましょう。

bukken_list = bukken_list.distinct().toMutableList()

重複は削除されたようです。

では、せっかく抽出した情報をどこかに保存したいので、「SharedPreferences」を使って保存します。

//SharedPreferencesからデータを取得する
val dataStore: SharedPreferences = applicationContext.getSharedPreferences(“DataStore”, MODE_PRIVATE)
var dataString = dataStore.getString(“Input”, null)
//データが何もない場合、保存する
if(dataString== null){
    editor.putString(“Input”, bukken_list.joinToString(“,”))
    editor.apply()
}

上記は、「DataStore」という名前のインスタンスを取得し、その中に「Input」という名前で物件情報「bukken_list」を登録しています。

すでに「DataStore」の「Input」に値がある場合には、今回取得した物件情報との差分をとるため、以下のように処理します。


//データが何もない場合、保存する
if(dataString== null){
    editor.putString(“Input”, bukken_list.joinToString(“,”))
    editor.apply()
}
else{
    //データが存在する場合、差分を確認する
    var old_bukken_list = dataString.split(“,”)
    //今回取得した物件情報だけに存在するものを抽出
    val sabun_list = bukken_list.minus(old_bukken_list)

    //取得したデータで上書きする。
    editor.putString(“Input”, bukken_list.joinToString(“,”))
    editor.apply()
    val sabun = sabun_list.joinToString(“,”
)     }

こうすることで、新着の物件情報があった場合、「sabun」に「,」区切りで物件名が格納されます。

ここまでで、「②サイト情報の差分を検出」の実装が完了です。

今回取得した「sabun」を、どのように通知するのか

というところを次回から実装していきます。