【问题标题】:For loop with ArrayList - Process data by data带有 ArrayList 的 For 循环 - 按数据处理数据
【发布时间】:2013-06-04 22:09:21
【问题描述】:

我有以下代码,一个 for 循环。我想在每次迭代中处理少量数据。

ArrayList uniqueSTA = q.getUniqueStations("localserver");

返回代表 STA 的字符串 ArrayList,假设是一台计算机(名称、价格等)

dadosSTA = q.getStationData(uniqueSTA.get(i).toString(), "localserver");

dadosSTA 代表 ArrayListDados 对象,它包含有关特定计算机的所有信息,例如名称、价格等。

dataForPPong = p.detectPP(5, 3, dadosSTA);

是检测一个事件。

现在我需要为每个 STA 和 STA 按 STA 执行此操作。

伪代码:

  1. 获取所有 STA -> 返回类似 STA1、STA2、STA3、STA4...
  2. 从 STA1 获取所有数据
  3. 为 STA1 检测 PP
  4. 保存在数组中
  5. 返回 1) 并为 STA2 执行操作,以此类推

这是我的代码。

    ArrayList<Dados> dadosSTA = new ArrayList<>();
    ArrayList<Dados> dataForPPong = new ArrayList();

    ArrayList uniqueSTA = q.getUniqueStations("localserver");

    for(int i = 0; i<uniqueSTA.size(); i++)
    {

        dadosSTA = q.getStationData(uniqueSTA.get(i).toString(), "localserver");

        dataForPPong = p.detectPP(5, 3, dadosSTA);

    }

编辑

我好像不太清楚,所以这里解释一下我的问题:

假设数组 dadosSTA 有 [STA1] 然后用 p.detectPP 处理 [STA1]。下一个循环 dadosSTA 有 [STA1,STA2] 并用 p.detectPP 处理,但这里的问题是 STA1 之前已经处理过。 所有接下来的循环都会发生同样的情况,比如第三个 dadosSTA 有 [STA1,STA2,STA3] 并且它是用 p.detectPP 处理的,但是 STA1 和 STA2 已经在前面的循环中处理过了。

我想要的是调整代码以便不处理之前已经处理过的内容,我很确定问题出在 for 循环内。

谢谢

【问题讨论】:

  • 你的问题是什么?
  • 我不希望它重新处理他在之前的周期中已经处理过的数据。我尝试在每个周期开始时创建一个临时 ArrayList,并在周期结束时将处理后的数据添加到最终数组中,但出现堆错误,看起来内存不足。我的数据大约有 50 000 条记录。
  • q.getStationData(uniqueSTA.get(i).toString(), "localserver");这个功能有什么作用?或者请尽量说清楚你认为你在哪里重复处理..
  • 它返回所有要处理的数据 p.detectPP(5, 3, dadosSTA);
  • getStationData 从哪里返回它?来自 uniqueSTA 或 q ?

标签: java for-loop arraylist


【解决方案1】:

如果我正确理解了您的观点..您的问题是您正在处理数据列表..解决方案很简单..我编辑了您的代码:

            HashMap<String, Boolean> processedList = new HashMap<String, Boolean>();

然后

            String nameSTA = "localserver";
            if (!processedList.containsKey(nameSTA) || !processedList.get(nameSTA)) {

                processedList.put(nameSTA, false);
                ArrayList<Dados> dadosSTA = new ArrayList();
                ArrayList<Dados> dataForPPong = new ArrayList();

                ArrayList uniqueSTA = q.getUniqueStations(nameSTA);

                for (int i = 0; i < uniqueSTA.size(); i++) {

                    dadosSTA = q.getStationData(uniqueSTA.get(i)
                            .toString(), nameSTA);
                    dataForPPong = p.detectPP(5, 3, dadosSTA);
                }
                processedList.put(nameSTA, true);
            }

我认为 STA#1 名称是“localserver”..所以我检查它是否存在于已处理列表中或它是否存在状态为假..所以你可以处理它..

====== 更新======

如果你有 STA1,STA2 在一起,这将是一个不同的实现:

HashMap<String, Boolean> processedList = new HashMap<String, Boolean>();

然后

ArrayList<Dados> dadosSTA = new ArrayList();
ArrayList<Dados> dataForPPong = new ArrayList();

ArrayList uniqueSTA = q.getUniqueStations("localserver");

for (int i = 0; i < uniqueSTA.size(); i++) {
    String dtl=uniqueSTA.get(i).toString();


    if (!processedList.containsKey(dtl) || !processedList.get(dtl)) {
        dadosSTA = q.getStationData(dtl, "localserver");
        dataForPPong = p.detectPP(5, 3, dadosSTA);
        processedList.put(nameSTA, true);
    }
}

我认为 dtl 是一个独特的价值..

【讨论】:

  • 别告诉我所有的数据都混合在uniqueSTA中我是说STA1,后来的STA1,STA2或者STA1,STA2,...
  • 如果在我的代码中发现错误。我使用的是全局变量而不是局部变量。这个问题在 getStationData 方法中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2015-06-17
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多