0

データベースから情報を収集するプログラムがあります。

以前の質問で、私は実行について尋ねましたが、応答の 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);

            }

        }
    }
4

2 に答える 2

2

説明

を作らないqueuesでください。これにより、 O(n)ではなくO(1)時間で重複がキャッチされます。クエリの読み込みが完了したら、いつでも からデータを取り出して、将来の目的のために に入れることができます (これには、 を作成する時間を正確に知ることができるという利点があります。それはO(nになります) コピーしますが、他の方法のように毎回行うのではなく、一度だけ行う必要があります。ArrayListHashSetSetHashSetArrayListArrayList

これを正しく行うには、おそらくCallQueue.hashCode()andをオーバーライドする必要がありますが、それは簡単で、フィールドのandメソッドを.equals()返すだけです。.hashCode().equals()String name

バグ??

ちなみに は だと思い込んでいqueryましたjava.sql.ResultSetResultSetはありません ありgetIntegerますgetInt。コードはコンパイルされますか?

コード

私が何を意味するかを見るために、コードは次のとおりです。

HashMap<String, CallQueue> queues = new HashMap<String, CallQueue>(); 

while (query.next()) {
  if (!queues.isEmpty()) {
    if (queues.containsKey(query.getString("NAME"))) {
      CallQueue oldQueue = queues.get(query.getString("NAME"));
      double decimalTime = query.getDouble("DATE");
      int hourOfDay = (int)Math.round(24 * decimalTime);
      int callAmount = query.getInt("NoC");
      if (hourOfDay > 19) {
        hourOfDay = 19;
      }

      oldQueue.addCallsByTime(hourOfDay, callAmount);
    } 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.getInt("NoC");
        if (hourOfDay > 19) {
          hourOfDay = 19;
        }
        cq.addCallsByTime(hourOfDay, callAmount);
        queues.put(query.getString("NAME"), cq);
      }
    }
  }
}

// you could return this if you just want a collection...
Collection<CallQueue> values = queues.values();

// Or this if you MUST have an ArrayList...
return new ArrayList(values);
于 2012-11-28T23:14:19.790 に答える
1

これは、名前によるグループまたは個別の選択を使用して SQL で行うこともできます。

于 2012-11-28T23:16:08.290 に答える