データベースから情報を収集するプログラムがあります。
以前の質問で、私は実行について尋ねましたが、応答の 1 つで、ループのアイデアを再考することができました 古い質問へのリンク: ConcurrentModificationExecption
データベースから多くの情報を収集する背景は次のとおりです。情報の1つは、データベースに保存されている通話タイプの名前です。たとえば、メール、テレフォンなどです。異なる種類の連絡先情報 (CallQueues と呼びます)
私が抽出している情報は数日にわたっているため、多くの通話タイプで重複があります。以下は、データベース内の行がどのように見えるかの例です。
ID 名前 日付 NoC NoAC
1 メール 2012-11-27 3 3
ここで、NoC = 通話数、NoAC = 応答した通話数。
今私の質問に。
私の最初のアイデアは、キューのリストをループして名前が再現されたかどうかを確認することでしたが、ループ中にリストを変更できなかったため、これは機能しませんでした。これがwhileループから始まる私の新しいアイデアです。私が知りたいのは、これはこの状況で重複を避けるための最良の方法ですか?そうでない場合は、どうすればよいか説明していただけますか?
**コード**
ArrayList<CallQueue> queues = new ArrayList<>();
while (query.next()) {
boolean isNew = true;
if (!queues.isEmpty()) {
for (CallQueue callQueue : queues) {
if (callQueue.getType().equals(query.getString("NAME"))) {
double decimalTime = query.getDouble("DATE");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("NoC");
if (hourOfDay > 19) {
hourOfDay = 19;
}
callQueue.addCallsByTime(hourOfDay, callAmount);
isNew = false;
}else {
isNew = true;
}
}
/* Out side the foreach loop, checks if the boolean isNew is true if it is create a new object and insert into the list*/
if (isNew) {
String queueName = query.getString("NAME");
if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
CallQueue cq = new CallQueue(query.getString("NAME"));
double decimalTime = query.getDouble("DATE");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("NoC");
if (hourOfDay > 19) {
hourOfDay = 19;
}
cq.addCallsByTime(hourOfDay, callAmount);
queues.add(cq);
}
}
/* if queues is empty which it will be the first time*/
}else {
String queueName = query.getString("NAME");
if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
CallQueue cq = new CallQueue(query.getString("NAME"));
double decimalTime = query.getDouble("DATE");
int hourOfDay = (int)Math.round(24 * decimalTime);
int callAmount = query.getInteger("NoC");
if (hourOfDay > 19) {
hourOfDay = 19;
}
cq.addCallsByTime(hourOfDay, callAmount);
queues.add(cq);
}
}
}