FC2ブログ
一陣の神風が舞う
東北弁炸裂するショボプログラマの日々(´・ω・`)
10 | 2019/11 | 12
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Javaでbyte配列の比較をしたいっ!

Javaでファイルアップロードに挑戦しようと考えているが、 その前段としてストリームを解析する為に必要なbyte配列を比較する機能が欲しい。
しかも、どうせうあるならStringクラスみたいな実装にしたいっ!!

ってコトでそういうクラスを作ってみた。



▼ indexOf() を考える

イメージとしては、自分と引数に指定したbyte[]を比較して 自分の中に部分配列が見つかったインデックスを返すものである。

なぜこれを最初に考えるかと言うと、他のほとんどのメソッドが こいつを基盤とした実装が可能だからである。

例えば、startWith()であれば、indexOf()の戻り値が`0`の時のみ`true`だし、 equals()であれば、startWith()が`true`かつ、配列要素数(length)が等しくなる。
indexOf()をやるとすればこんな感じだろうか。


/**
 * `org`内で、`dest`が最初に出現する位置を返す
 * @param org 検索元
 * @param dest 検索対象
 * @return 見つかったインデックス
 */
public int indexOf(byte[] org, byte[] dest){

    // 評価以前の問題
    if ((org== null)||(dest== null)){
        throw new IllegalArgumentException("`org` or `dest` is null.");
    }

    if ((org.length== 0)||(dest.length== 0)	// 長さが無いので比較しようが無い
            ||(org.length< dest.length))		// 探したい配列の方が長いので見つかるワケがない
    {
        return -1;
    }

    // 評価する限界値
    int limitIndex= org.length - dest.length + 1;

    for (int i= 0; i< limitIndex; i++){
        for (int j= 0; j< dest.length; j++){		// (A)
            if (org[i + j]== dest[j]){			// (B)
                // 最後まで一致したら戻り値に設定する
                if (j== dest.length - 1){
                    return i;
                }
            }
            else{
                break;
            }
        }
    }
    // 最後まで見つからなかった
    return -1;
}

for文とif文のネストが深くなってしまったが、やっていることは紙に書いてみると単純だと分かる。

dest[0]と等しい要素を探す

△ (A) のループの処理を示した図


org’[j] == dest[j] になるかをチェックする
△ (B) のループの処理を示した図


▼ それ以外のメソッド

  • concat() → 2つのbyte[]の長さの合計を求めて連結
  • subBytes() → 要は部分切り出し。まあガンバレ。
  • startWith() → indexOf()が`0` かつ 配列の長さが等しいかどうか
  • replace() → 配列要素数が変わる可能性あり。ByteArrayStreamを使って順番に書き込むと良いかも
  • こんだけあればいいか

    |・x・)っ[成果物]

    テーマ:プログラミング - ジャンル:コンピュータ

    この記事に対するコメント

    この記事に対するコメントの投稿














    管理者にだけ表示を許可する


    この記事に対するトラックバック
    トラックバックURL
    →http://ciablo.blog70.fc2.com/tb.php/61-2fa5da42
    この記事にトラックバックする(FC2ブログユーザー)

    プロフィール

    Mahny

    Author:Mahny
    趣味PG派生の職業PG(+SE?)。頭のデキはきっと残念ω

    最近の記事

    最近のコメント

    最近のトラックバック

    月別アーカイブ

    カテゴリー

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索

    RSSフィード

    リンク

    このブログをリンクに追加する

    ペット