通过列表数组进行Java复杂迭代

时间:2018-07-18 01:53:26

标签: java arraylist iteration

我想遍历列表数组中的重复数字组,并在组更改时执行一些操作。我的问题是,当下一组包含相同的数字时,如何将这两个组分开?例如,我在数组中有以下数字: 3,3,3,10,10,10,10,10,10,10,10,10,10,5,5,5,5,5 总有3个三分之三和10个数十个等。但是如果我有 3,3,3,3,3,3(我分成两组,每三个一组)。

(某种)可行的解决方案是:

List<Integer> changeOfTableCell = new ArrayList<Integer>();
changeOfTableCell.add(3);
changeOfTableCell.add(3);
changeOfTableCell.add(3);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(10);
changeOfTableCell.add(5);
changeOfTableCell.add(5);
changeOfTableCell.add(5);
changeOfTableCell.add(5);
changeOfTableCell.add(5);

int startCounter=changeOfTableCell.get(0);
int counter=0;

for(int a=0; a<changeOfTableCell.size(); a++) { 

    if(startCounter==changeOfTableCell.get(counter)) { //the start of the group
        for(int i=0; i<startCounter; i++) { //print the group as per the size of the group

            System.out.println(changeOfTableCell.get(counter));
            counter=counter+1;
        }

        //move the start of the next group
        startCounter=changeOfTableCell.get(counter)
        System.out.println("Break");//do something here
    }
}

计数器转到18,这给了我索引超出范围的异常。解决方案对我来说并不明显,这让我发疯了!

先谢谢您。 菲尔

4 个答案:

答案 0 :(得分:1)

在第二个for循环之后,您应该有一个if防护来保护最后一次迭代。由于内部for循环的最终迭代,因此counter等于List的大小的时间是此时计数器加1

if(counter < changeOfTableCell.size()){
  startCounter=changeOfTableCell.get(counter);
}

或者宁可终止

if(counter >= changeOfTableCell.size()) break;
startCounter=changeOfTableCell.get(counter);

答案 1 :(得分:0)

如果要在组更改时执行某项操作,则无需重复该列表。下一个值的索引是当前索引+当前值。

interface OnGroupChangeListener {
    void onChange(int oldValue, int newValue);
}

static void test(List<Integer> list, OnGroupChangeListener listener) {
    int idx = 0;
    while (true) {
        int value = list.get(idx);
        idx += value;
        if (idx >= list.size()) break;
        listener.onChange(value, list.get(idx));
    }
}

public static void main(String[] args) {

    List<Integer> list = Arrays.asList(1, 1, 2, 2, 3, 3, 3, 3, 3, 3);

    test(list, new OnGroupChangeListener() {
        @Override
        public void onChange(int oldValue, int newValue) {
            System.out.println(oldValue + " -> " + newValue);
        }
    });
}

答案 2 :(得分:0)

因为counter跟踪其迭代的元素数量,所以计数器的计数达到18,并抛出IndexOutOfBoundsException。在打印出列表中的最后一个值之后,startCounter尝试获取第18个索引处的元素,该索引不存在(列表为0索引)。要解决此问题,请执行条件语句以检查counter是否已在第18个索引处。

答案 3 :(得分:0)

这是我想出的解决方案:

public class CounterTest {

public static void main(String[] args) {

    List<Integer> changeOfTableCell = new ArrayList<Integer>();
    changeOfTableCell.add(3);
    changeOfTableCell.add(3);
    changeOfTableCell.add(3);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(10);
    changeOfTableCell.add(5);
    changeOfTableCell.add(5);
    changeOfTableCell.add(5);
    changeOfTableCell.add(5);
    changeOfTableCell.add(5);
    int start=0;
    int length=changeOfTableCell.get(0);


    for(int a=0; a<changeOfTableCell.size(); a++){

    for(int i=start; i<length; i++) {

        System.out.println(changeOfTableCell.get(start));

    }if(length==changeOfTableCell.size()){
        System.out.println("Do something ");break;
        }else start=length; length=length+changeOfTableCell.get(start);
            System.out.println("Do something ");
}

}

}