java - 如何根据列表副本中的位置从列表中删除值?

标签 java android

我正在尝试根据这些特定项目在值列表中的位置来删除它们。 下面的代码,由于复制列表缩小太多而引发错误

private ArrayList<String> removeGen(int addLines, int labLines, int venLines, ArrayList<String> values){
        ArrayList<String> copy = new ArrayList<>();
        copy = (ArrayList<String>) values.clone();
        for(int i = 0; i < values.size(); i++) {
            if (i > 100 && i < (100 + (addLines * 5) + 1)) {
                copy.remove(i);
            }

            if (i > (100 + (addLines * 5)) + 9 && i < 100 + (addLines * 5) + (labLines * 4) + 10) {
                copy.remove(i);
            }

            if (i > 100 + (addLines * 5) + (labLines * 4) + 21 && i < 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) {
                copy.remove(i);
            }
        }

        return copy;

问题是有些值彼此无法区分,所以我也不能使用remover(obj)。

如何返回在上述位置删除了值的列表?

最佳答案

您正在按索引删除,而不是按值删除,但在删除某些内容后,您忘记了values 的索引与copy 中的索引不同。 每个对象在删除后都会获得另一个索引,因此列表不再相同。

示例: 删除索引 4 后,索引 5 将获取索引 4 上的新值。此切换效果将一直持续到列表末尾。

因此有两种方法可以使这个正确:

  1. 扭转您的条件,将所有有效数据添加到副本中,然后返回此列表。
  2. 将索引 i 处的值清空,然后在返回之前过滤列表。 return copy.filter(x -> x != null).collect(Collectors.toList()); 如果您使用的是 java 7 及更低版本,则可以使用 copy.removeAll(Collections.singleton(null));

这是第一个结果:

ArrayList<String> copy = new ArrayList<>();
for(int i = 0; i < values.size(); i++) {
    if (i < 100 && i > (100 + (addLines * 5) + 1)) {
        copy.add(values.get(i));
    }

    if (i < (100 + (addLines * 5)) + 9 && i > 100 + (addLines * 5) + (labLines * 4) + 10) {
        copy.add(values.get(i));
    }

    if (i < 100 + (addLines * 5) + (labLines * 4) + 21 && i > 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) {
        copy.add(values.get(i));
    }
}

return copy;

这是第二个结果:

ArrayList<String> copy = new ArrayList<>();
copy = (ArrayList<String>) values.clone();
for(int i = 0; i < values.size(); i++) {
    if (i > 100 && i < (100 + (addLines * 5) + 1)) {
        copy.get(i) = null;
    }

    if (i > (100 + (addLines * 5)) + 9 && i < 100 + (addLines * 5) + (labLines * 4) + 10) {
        copy.get(i) = null;
    }

    if (i > 100 + (addLines * 5) + (labLines * 4) + 21 && i < 100 + (addLines * 5) + (labLines * 4) + (venLines * 4) + 22) {
        copy.get(i) = null;
    }
}

return copy.filter(x -> x != null).collect(Collectors.toList());

关于java - 如何根据列表副本中的位置从列表中删除值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46668446/

相关文章:

java - 将字符串从 thymeleaf 传递到 Controller

java - 垃圾收集器如何快速知道哪些对象不再有对它们的引用?

c# - 使用什么设计模式来验证数据和创建对象

android - 什么是百分比支持库的 minSDK?

android - 如何更改 ndk-build 命令生成的 .so 文件目录?

java.lang.NoClassDefFoundError Android Studio Unity

java - 部署到不同机器时如何使用selenium/standalone-chrome?

java - 设置第一个 ListView 项目的布局

0 台设备支持 Android 应用

Android:如何通知其他 Activity 完成的 Activity ()