Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

データの結合について

こんばんは、Javaに関して調べてもどうしてもわからず、皆様のお力を貸して頂きたく投稿しました。

データの結合についてです。
ArrayList<byte[]> に入った、データを最終的に1つのStringにするんですが、
それだけなら良いいんですが、byteArrayに「次データあり」というマークがある場合、
次のデータを受け取って、処理する事になります。
問題はここからなんです。

2度目のデータが1度目のデータ最終行からの数行を含んでいる場合がある時、

---1度目データイメージ----data1
xxxxxxxxx
aaaaaaa
bbbbb
ccccccc
")"                   ←(次データありマーク)

---2度目データイメージ----data2
bbbbb              ←(前回のラスト2行目)
ccccccc            ←(前回のラスト行)
zzzzzzzzzzz
yyyy
www
""                    ←(次データ無し)

と、こんな具合の時はdata2の頭(bbbbb)を、data1のラストからを見比べて行って一致すれば、data1の一致行以下を消してdata2をくっつけるという方法を取ろうと思ってました。

ただコレでは、

---data1-----
xxxxxxxx
aaaaaaaa
bbbbb
ccccccc
bbbbb
)

---data2----
bbbbb            ←前の
ccccccc          ←前の
bbbbb            ←前の
zzzzzzzzzz      ←ここから追加したいデータ
yyyy
www
""

という、データだった場合、
---結合後データ----
xxxxxxxx
aaaaaaaa
bbbbb
ccccccc
bbbbb
ccccccc
bbbbb
zzzzzzzzzz
yyyy
www
""

と、なってしまいます。

実際のデータはバイト配列の合間に改行マークがあるだけなんで、
そもそも行単位でこういう結合方法を取る事自体が間違っているのかもしれませんが、どうしても他に良い方法が思い浮かびません。

何か、良い解決策、アドバイス等ありましたら教えて下さい。

よろしくお願いします。

5

回答

3225

閲覧

5件の回答

評価

0

重複かどうかの判断を最大一致でとるのか、最小一致でとるのか、それともそれ以外の方法でとるのか分からないのでなんともいえませんね。
具体的な実装を聞くのではなく、「やりたいこと」がなんなのかを聞いたほうが回答が付きやすいと思います。

評価

0

重複は1つというデータでつくらなければ処理が複雑になるかと。

A:[1|2|3|4|5|6] 末尾を検索条件に次のデータをもってくる
B:[6|7|8|9]


表示可能件数>次とってこない
表示可能件数+次検索データ >次検索データを元に次の表示可能件数をとってくる(このときかぶってるのは 次検索データ分だけ)
というような制約をつけなければ。

何個かさなってるのかわからず結果不要な重なりがでたりします。

評価

0

適当様
ご回答ありがとうございます。
「やりたいこと」という事なんですが、重複かどうかの判断自体がやりたい事です。
重複した行を含んだ2ページ目を取得しても、重複部分を除いて一つのデータにする事が目的です。

今のところは、行単位で内容が一致しているかどうかの判定を行っておりますが、この方法では質問に書いた問題もでるので、この重複判断の方法自体が間違っているのか、それとも何か付け加えれば出来るのか、というところで困っております。
何か良い方法があれば教えて下さい。

杏様
ご回答ありがとうございます。
言葉足らずな質問でした。すみません。
次データの有無はデータの内容によって変わり、1ページ目が一行しか無いのに2ページ目がある事もあります。

なので、次データありマークを見ないと判断出来ないんです。

この時の追加データがx行だとすると、表示可能行数 − x行分が前のデータのラスト行から引き継がれて一つのデータとして渡ってきてしまいます。(この部分は下記でいうクラスA→Bの処理です)

クラスは大きく分類すると、
A:データを送信するクラス(socket)
B:データを受信し、リストに入れてCに渡す。Cから追加データありとメッセージがあれば、Aから次ページを取得しCに渡すクラス。
C:受け取ったデータを結合するクラス。

というもので、今回お聞きしたいのはこのA,Bクラスはこのままの条件で、クラスCのみのロジックで重複チェック、結合を行う方法という事です。

最初の質問が、かなり説明不足で申し訳ありません。

評価

0

1.A:全文とB:全文で endsWithを実行する。
2.B:全文の頭から区切り文字が lastIndexでマッチする場所までの文字で「1」と同じこと実行する(繰り返して lastIndexが -1をかえすまでつづけるか
1が true を返すまで続ける。

3.endsWithで trueがかえってきたらそのときの文字数より後ろから substringを実行する。

こんな感じのことをしたいのかな??

評価

0

杏様
ご回答ありがとうございます。

おっしゃる通りです。
おかげ様で何とか処理できそうです。
本当にありがとうございました!!

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。