javaandroidfor-looparraylistiterator

How to equalize the size of the list collection Java


I have a collection of lists that contain data from a streamed sensor. I wrote a for loop to form it to the format that I would later use to send it to another place (web server). However, sometimes the size of the lists differs by 1 or 2, and when it does the code will throw an out of bounds exception.

This is the code I use to assemble the format,

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);
}

Sometimes one of the lists doesn't have the same size. I've tried to iterate it over with iterator like this

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++;
}

However, this would throw ConcurrentModificationException, so I tried to equalize the size of the lists, because it just differs 1 or 2 data points. Or maybe there's another solution? I'm running out of ideas.


Solution

  • I've found a solution, and what I did is create a function to find the smallest list.

    private int theSmallestVal(int a, int b, int c, int d, int e){
        int[] val = {a, b, c, d, e};
        Arrays.sort(val);
        return val[0];
    }
    

    Then I call the function like this:

    al = theSmallestVal(acceleroTime.size(),acceleroElaps.size(), acceleroXval.size(),
                        acceleroYval.size(), acceleroZval.size());
    

    After I found the smallest the value, I use that value to be the reference value to be iterated by for i.

    for (int i = 0; i < al; i++) {
         HashMap data = new HashMap();
         data.put("person", "Adi");
         data.put("tool", "Accelerometer");
         ....
         ....
         ....
     }
    

    By doing so, I could avoid out of bound exception.