正确的循环方式,以避免创建双重对象

时间:2012-11-28 23:10:36

标签: java object loops

我有一个程序从数据库中收集信息。

在我之前的问题中,我询问了一个执行问题,其中一个反应使我重新思考我的循环链接旧问题的想法:ConcurrentModificationExecption

所以这里是背景我从数据库中收集了大量信息,其中一个信息是存储在我的数据库中的呼叫类型的名称,例如:Mail,Telefon等。将是不同类型的联系(我们称之为CallQueues)

由于我提取的信息已经过了好几天,因此很多通话类型都会出现。以下是数据库中行如何显示的示例:

ID名称日期NoC NoAC

1 Mail 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);

            }

        }
    }

2 个答案:

答案 0 :(得分:2)

说明

不要将queues设为ArrayList,将其设为HashSet或其他某种Set。这将在 O(1)时间而不是 O(n)中为您捕获重复项。加载完查询后,您始终可以将数据从HashSet中取出并将其放入ArrayList以供将来使用(这样做的另一个好处就是您可以准确知道制作ArrayList。这将是一个 O(n)副本,但你只需要做一次,而不是每次都这样做。

要正确执行此操作,您可能必须覆盖CallQueue.hashCode().equals(),但这很简单,只需返回{.hashCode().equals()方法即可1}} field。

错误??

顺便说一下,我假设String namequery,但java.sql.ResultSet没有ResultSet,它有getInteger。你的代码是否编译?

守则

这是代码,看看我的意思:

getInt

答案 1 :(得分:1)

您也可以在sql中使用group by name或select distinct。