ArrayList 执行的过程是怎样的?

What is the process in which an ArrayList executes?

我目前在 Java 的课程是关于 ArrayLists 的,我很难理解这段代码: 本练习涉及从 ArrayList 中删除项目块的问题。

public static void deleteBlock( ArrayList<String> strings, int n )
{
    for ( int i = 0; i < n; i++ ) // the for loop for checking each index
    {
        if ( strings.size() > 0 ) // if statement to check whether or not the array's size is > 0
            strings.remove( i );  // removes the index of the array at (i)
    }
}

public static void main( String[] args )
{
    String[] data = { "erosion", "rosion", "osion", "sion", "ion", "on", "n" };  //array being tested
    ArrayList<String> dataList = new ArrayList<String>();  
    for ( int i = 0; i < data.length; i++ )
        dataList.add( data[ i ] );

    deleteBlock( dataList, 3 );
    System.out.println( dataList ); // printing out the result
}

这是输出:[rosion, sion, on, n]

如果有人能帮忙解释一下这段代码背后的过程?谢谢!

注意这段代码(最好调试一下!):

for ( int i = 0; i < n; i++ )
{
    if ( strings.size() > 0 )
        strings.remove( i );
}

发生的事情是 i = 0:

["erosion", "rosion", "osion", "sion", "ion", "on", "n"] => ["rosion", "osion", "sion", "ion", "on", "n"]

删除了第 0 个元素。

然后当i = 1:

["rosion", "osion", "sion", "ion", "on", "n"] => ["rosion", "sion", "ion", "on", "n"]

第一个元素已删除。

最后,当i = 2:

["rosion", "sion", "ion", "on", "n"] => ["rosion", "sion", "on", "n"]

删除了第二个元素。

现在,如果您希望您的代码只删除前 3 个元素,那么您可以这样做:

for ( int i = 0; i < n; i++ )
{
    if ( strings.size() > 0 )
        strings.remove( 0 );
}

您向我们展示的代码块显然是为了显示当您从同时循环访问的列表中删除项目时可能出现的问题。

问题出现在这里:

public static void deleteBlock( ArrayList<String> strings, int n )
{
    for ( int i = 0; i < n; i++ )
    {
        if ( strings.size() > 0 )
            strings.remove( i ); // Kaplooey.
    }
}

Cyber​​netic Twerk 清楚地说明了他的回答中发生的事情:当您删除索引之前的项目时,您的索引不再指向同一项目。

道​​德:永远不要写这样的代码。

有时,如果您反向迭代,,即从最后一个元素到第一个元素,向后迭代,就可以避免这种情况。为什么这能正常工作留作 reader.

的练习

正确的解决方案是只将原始列表中需要的项目添加到新列表中。

您的原始列表是您调用删除并循环 4 次的列表。 [erosion, rosion, osion, sion, ion, on, n]

然后它进入循环并删除列表 0 元素,即 "erosion" 现在列表变成这个
[rosion, osion, sion, ion, on, n]

现在它删除了列表 1 中的元素 "osion" 所以它变成了 [rosion, sion, ion, on, n]

现在您的列表 2 元素已删除,即 "on" 所以您得到的结果是 [rosion, sion, on, n]

您正在根据索引从 ArrayList 中删除元素。在您的示例中,首先删除 0 元素,但现在生成的列表具有 "rosion"、"osion"、"sion"、"ion"、"on"、"n",所以当你去掉第1个元素,即"osion",留下"rosion","sion","ion","on","n",当你删除 2 元素时,你有 "rosion"、"sion"、"on"、"n".

您可以将您的 remove(i) 更改为 remove(0)。或者,您可以使用 removeRange,例如

public static void deleteBlock( ArrayList<String> strings, int n )
{
    if ( strings.size() < n ) strings.clear();
    else strings.removeRange(0, n);
}