我想遍历列表数组中的重复数字组,并在组更改时执行一些操作。我的问题是,当下一组包含相同的数字时,如何将这两个组分开?例如,我在数组中有以下数字:
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,这给了我索引超出范围的异常。解决方案对我来说并不明显,这让我发疯了!
先谢谢您。 菲尔
答案 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 ");
}
}
}