从受索引影响的ArrayList中删除两个元素

时间:2014-10-04 23:34:00

标签: java for-loop arraylist indexing

我有5分,我需要删除2分,共计3分。我需要从1-5中删除所有可能组合的两个点。例如:0,0 - 0,1 - 0,2 ... 5,1 5,2 ..到最后。

for (int i = 0; i < newList.size()-1; i++){

            count = 0;
            ArrayList<Point> testList = new ArrayList<Point>(newList);

            while (count < K-1){
                testList.remove(i+1);
                count++;
            }

这就是我所拥有的。问题是,当我删除第一个点时,下一个点的索引会发生变化,所以我很难跟踪它。

我想像这样使用双循环:

for (int i = 0; i < newList.size(); i++){
        for (int j = 0; j < newList.size()-1; j++){

            count = 0;
            ArrayList<Point> testList = new ArrayList<Point>(newList);

            while (count < K-1){
                testList.remove(i);
                testList.remove(j);
                count++;
            }

但是,我仍然得到以下内容:

REMOVED: 0, 0
REMOVED: 0, 1
REMOVED: 0, 2
REMOVED: 0, 3
REMOVED: 1, 0
REMOVED: 1, 1
REMOVED: 1, 2
REMOVED: 1, 3
REMOVED: 2, 0
REMOVED: 2, 1
REMOVED: 2, 2
REMOVED: 2, 3
REMOVED: 3, 0
REMOVED: 3, 1
REMOVED: 3, 2
REMOVED: 3, 3
REMOVED: 4, 0
REMOVED: 4, 1
REMOVED: 4, 2
REMOVED: 4, 3

正如您所看到的,在两列中打印出“5”都存在问题,因为当我第一次删除时索引会发生变化。任何人都可以提供任何建议吗?

2 个答案:

答案 0 :(得分:0)

要完成此操作,请使用之前创建的newList 作为参考,并删除您已创建的testList元素。

while (count < K-1){
    testList.remove(newList.get(i+1));
    count++;
}

这种方式newList将保持不变,并且在删除元素后,所有元素(即Point)和testList都会包含元素。

答案 1 :(得分:0)

通过标准库(例如guava collections)或手动复制制作过滤后的副本:

List<Point> original = ...
List<Point> cleared = new ArrayList<Point>(original.size());
Set<Integer> dropIndex = new TreeSet<Integer>(Arrays.asList(2, 5, 128));

for (int i = 0, size = original.size(); i < size; i++)
    if (!dropIndex.contains(i))
        cleared.add(original.get(i));