-2

我有一个带有值的数组列表

ArrayList<String> HexValues = new ArrayList<String>();

    HexValues.add("a");
    HexValues.add("b");
    HexValues.add("f");
    HexValues.add("1");
    HexValues.add("4");
    HexValues.add("0");
    HexValues.add("31");
    HexValues.add("32");
    HexValues.add("37");
    System.out.println("The content of HexValues is: " + HexValues);


    int start = HexValues.lastIndexOf("f");

    if (start != -1) {
        List<String> HexValuesEnd = HexValues.subList(start, HexValues.size());


        System.out.println("The content of HexValuesEnd before leaving is: " + HexValuesEnd);
        if (HexValuesEnd.size() > 0) {               

            HexValuesEnd.remove(1);
            HexValuesEnd.remove(2);
            HexValuesEnd.remove(3);
            System.out.println("The content of HexValuesEnd after removing values at indexes 1 ,2,3: " + HexValuesEnd);
        }
    }

输出是

The content of HexValues is: [a, b, f, 1, 4, 0, 31, 32, 37]
The content of HexValuesEnd  before leaving is: [f, 1, 4, 0, 31, 32, 37]
The content of HexValuesEnd after removing values at indexes 1 ,2,3: [f, 4, 31, 37]

但第二个数组列表中的预期值应该是

"The content of HexValuesEnd after removing values at indexes 1 ,2,3: " [f,31,32,37]

我哪里错了才能得到预期的结果..

4

5 回答 5

5

当您删除其中一个值时,它后面的值将被移动以填补空白。

你的意思是

remove(1);
remove(1);
remove(1);
于 2013-01-03T05:32:59.427 回答
1

是因为之后

HexValuesEnd.remove(1);

数组列表是

[f, 4, 0, 31, 32, 37]

现在它执行

HexValuesEnd.remove(2);

所以你得到

[f, 4, 31, 32, 37]

以此类推……

你需要做的是

HexValuesEnd.remove(1);
HexValuesEnd.remove(1);
HexValuesEnd.remove(1);
于 2013-01-03T05:36:18.807 回答
0

你有过[f, 1, 4, 0, 31, 32, 37]

然后你在索引 1 处删除并得到[f, 4, 0, 31, 32, 37]

然后索引 2:([f, 4, 31, 32, 37]索引 20在第一次删除后在列表中)

等等。

请记住,删除会更改列表。

似乎您想删除索引13 次:

HexValuesEnd.remove(1);
HexValuesEnd.remove(1);
HexValuesEnd.remove(1);
于 2013-01-03T05:33:47.930 回答
0

尝试

 if (HexValuesEnd.size() > 0) {               
                HexValuesEnd.remove(1);
                HexValuesEnd.remove(1);
                HexValuesEnd.remove(1);
于 2013-01-03T05:37:41.433 回答
0

最简单的方法是使用支持过滤器的高阶方法的函数式编程库。我知道 Apache-commons、Guava 和 lambdaJ 都支持过滤器。

下面是一些关于 synatx 的 sudo 代码:

Predicate predicate = new Predicate(){{
    public boolean evaluate(Object object){
     // If statement comparison goes here
    }
}};
filter(HexValuesEnd, predicate);

由于这是本机 Java,因此您需要创建一个谓词对象来对集合中的每个元素进行检查,并且每个库都有自己的执行方式。

Apache-commons 和 Gauva 有自己的谓词对象,而 lambdaJ 构建在 hamcrest 之上并使用它的匹配器作为谓词对象。

除了小的、高度可读的代码之外,还有一个额外的好处是这些库应该具有内置的并发优化,因此如果您想提高性能,就不必处理线程。

还要小心.remove,如果你在一个循环中使用它,你会很糟糕。如果您想使用迭代方法从集合中删除元素,请尝试使用迭代器。

于 2013-01-03T05:41:29.190 回答