如何均衡列表集合的大小Java

问题描述 投票:0回答:1

所以我有一个列表集合,其中包含来自流式传感器的数据。然后我做了一个 for 循环将其形成为稍后我将用来发送到其他地方(网络服务器)的格式。但有时列表的大小会相差 1 或 2。当这种情况发生时,代码将抛出越界异常。

这是我用来组装格式的代码,

for (int i = 0; i < acceleroElaps.size(); i++) {
                    HashMap data = new HashMap();
                    data.put("person", "Adi");
                    data.put("tool", "Accelerometer");
                    data.put("time", acceleroTime.get(i));
                    data.put("elapsed", acceleroElaps.get(i));
                    data.put("xaxis", acceleroXval.get(i));
                    data.put("yaxis", acceleroYval.get(i));
                    data.put("zaxis", acceleroZval.get(i));

                    accelData.add(data);
                }

但有时其中一个列表的大小不同。我尝试用这样的迭代器迭代它

ListIterator<String> iterAT = acceleroTime.listIterator();
                ListIterator<String> iterAE = acceleroElaps.listIterator();
                ListIterator<String> iterAX = acceleroXval.listIterator();
                ListIterator<String> iterAY = acceleroYval.listIterator();
                ListIterator<String> iterAZ = acceleroZval.listIterator();

                while (iterAT.hasNext() && iterAE.hasNext() && iterAX.hasNext() && iterAY.hasNext() && iterAZ.hasNext()){
                    String at = iterAT.next();
                    String ae = iterAE.next();
                    String ax = iterAX.next();
                    String ay = iterAY.next();
                    String az = iterAZ.next();

                    HashMap data = new HashMap();
                    data.put("person", "Adi");
                    data.put("tool", "Accelerometer");
                    data.put("time", at);
                    data.put("elapsed", ae);
                    data.put("xaxis", ax);
                    data.put("yaxis", ay);
                    data.put("zaxis", az);

                    accelData.add(data);
                    a++;
                    f++;
                }

但它会抛出ConcurrentModificationException。所以我尝试均衡列表的大小,因为它只是有 1 或 2 个数据不同。或者也许还有另一种解决方案,我已经没有主意了

java android for-loop arraylist iterator
1个回答
0
投票

但它会抛出 ConcurrentModificationException。

如果不看到完整的代码,很难判断,但上面提示了可能出现的问题,当集合在迭代过程中更改时会抛出此异常。在您的代码中,没有更改传感器集合,因此可能您的读取线程正在更改它。这也会导致越界异常。

如果您的传感器读取发生在与数据发送不同的线程中,那么您应该确保您的集合更新正确同步。最简单的测试是:

final Object syncObj = new Object();

// in reading thread
synchronized(syncObj) {
  // here update your acceleroElaps,... collections
}

// in data send thread
synchronized(syncObj) {
  // here prepare data to send to server
}
© www.soinside.com 2019 - 2024. All rights reserved.