質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1337閲覧

データクラスを持った配列同士の、比較について

luna12

総合スコア47

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/14 06:33

編集2016/12/14 09:41

###前提・実現したいこと
定周期でデータクラスを持った配列同士を比較したかったのですが、
前のデータと後のデータで追加されたのか、削除されたのか、それとも更新されたのかを判定する方法がわかりません
ちなみに追加・削除されたか、更新されたのか、の境目はキーとなる値が一致するかどうかです

ソースコードのほうもできれば貼りたいのですが、たぶん業務上問題があるんじゃないかなと思ったので、わかりにくいことと思いますが、文面のみでの説明とさせてください

ちなDBのデータを扱ってること前提です

データ保持クラス(){ string aa; //主キー string bb; string cc; (ゲッター・セッター略) } (別クラス内) 状態監視メソッド(){ DBアクセス用メソッドのインスタンス生成 boolean flag; while(true){ List org_list=全selectデータ 1秒後 List new_list=全selectデータ for(new_listのサイズ分){ flag=false; new_data=new_list.get(i) for(org_listのサイズ分){ org_data=org_list.get(i) if(new_dataとorg_dataのaa一致){ flag=true; if(new_dataとorg_dataの各メンバのどれか一つでも一致しない){ 更新時の処理 } } } if(!flag){ 追加時の処理 } } } }

###試したこと
二重ループで前後の配列をそれぞれ回して、その中でキーが一致するかを判定したのち、前のデータと後のデータが一致したら更新時の処理を行いました
その前にキー値が一致することがわかった時点でフラグをオンにして、1個目のforループの最後にフラグがオフだった場合に追加時の処理を行いました
ただこの方法だと削除だった場合の判定がどうしても行えず。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/12/14 07:28

DB詳しくないので少し質問します。(1)キーはユニークということでしょうか? (2)キーからデータを取り出せないのでしょうか? 以上です。簡単なものでいいのでデータのサンプルを書いてもらえると理解しやすいのですが。
fuzzball

2016/12/14 07:36

終わってた‥。
luna12

2016/12/14 09:48

キーはユニークです。いくつかまとめてユニークというケースもあります。 (2)データはすべてselectしたものをListに保存してあるので、キー値を元にすればそこから取り出すことはできます。
luna12

2016/12/14 09:50

ただ、自分としてはこれだとデータのカラムが多くなればなるほどコードが冗長なものになっていくのが見づらいなと思い… ほかのいい方法というのを聞きたかったです。。 何しろデータをひとつづつ比較を繰り返しているので…
fuzzball

2016/12/14 10:11 編集

アクセスログを取るわけにはいかないのでしょうか?
luna12

2016/12/15 02:18

すいません、自分アクセスログの活用の仕方がいまいちわからず… それを使えば所謂構造体の各メンバの比較もわかりやすく行えるものなのでしょうか
fuzzball

2016/12/15 02:26 編集

そもそも比較をやめよう、という提案です。追加・削除・更新の都度ログを取って、定時処理ではログを集計するようにします。これだとデータ量ではなくアクセス量に依存するようになります。(最初にも書きましたがDBのことはよく知らないのでトンチンカンなことを言ってるかも知れません)
luna12

2016/12/15 02:32

なるほど!そういう考え方もあるのですね。自分は初めてそのようなやり方を聞いたので少し実装は難しそうですが、今後はそういうやり方も視野に入れてみたいと思います。 貴重なご意見、ありがとうございました。
guest

回答2

0

ベストアンサー

速度が気にならないなら、ループの順番を逆にして再度行えば、削除された分はわかると思いますが。
速度が気になるなら、まずは二重ループよりContains等を使って調べるようにした方がいいと思います。

投稿2016/12/14 06:50

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna12

2016/12/14 07:01

そうですね 確かに逆にして全く同じことをすればその過程で削除された分もわかりそうです ただ、リストの中に入っているデータは数千件なので、時間がっかるなぁと・・ List.contain()は考えてみたのですが、それだとクラス内の全要素が一致するかしないかしか見れず、キー値での判定を入れることができないかなと思いました
luna12

2016/12/14 07:26

あーcontainやequalsはオブジェクトのアドレスを比較していたのですね。。 すいません、デバッグ実行できる環境もまだ整っていなかったもので。。 わかりにくい質問の中回答していただきありがとうございました
swordone

2016/12/14 14:58

containsでも結局内部ではループするので、速度的には変わらないかと…
ishi9

2016/12/15 01:16 編集

あぁそういや使用されているのはただの配列でしたね。。。 ご指摘ありがとうございます。
guest

0

業務の内容なら先輩に聞きましょう。
聞ける先輩がいないなら配列がどのように変化するかを具体的に書いてください、質問からはよくわかりません。

投稿2016/12/14 06:49

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luna12

2016/12/14 07:02

teratailで質問されている内容はすべて自身の業務とは関係ない内容、だということでしょうか。。
yona

2016/12/14 07:22

違います。 質問する先の順番を間違っているという意味です。 まず、一番回答解決に近いのは同じ環境にいる同僚や先輩で、その次が外部の人間です。 効率的に回答を得たいなら最適な質問先を探しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問