我目前的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]
如果有人可以帮忙解释一下这段代码背后的过程如何?谢谢!
答案 0 :(得分:3)
注意这段代码(更好的是调试!):
for ( int i = 0; i < n; i++ )
{
if ( strings.size() > 0 )
strings.remove( i );
}
当i
= 0
:
[&#34;侵蚀&#34; ,&#34; rosion&#34;,&#34; osion&#34;,&#34; sion&#34;,&#34 ;离子&#34;,&#34; on&#34;,&#34; n&#34;] =&gt; [&#34; rosion&#34 ;, &#34; osion&#34;,&#34; sion&#34;,&#34; ion&#34;,&#34; on&#34;,&#34; n&#34;]
删除了第0个元素。
然后i
= 1
:
[&#34; rosion&#34;,&#34; osion&#34; ,&#34; sion&#34;,&#34; ion&#34;,&#34 ; on&#34;,&#34; n&#34;] =&gt; [&#34; rosion&#34 ;, &#34; sion&#34;,&#34; ion&#34;,&#34; on&#34;,&#34; n&#34;]
第一个元素被删除了。
最后,当i
= 2
时:
[&#34; rosion&#34;,&#34; sion&#34;,&#34; ion&#34; ,&#34; on&#34;,&#34 ; n&#34;] =&gt; [&#34; rosion&#34;,&#34; sion&#34;,&#34; on&#34;, &#34; N&#34;]
第二个元素已被删除。
现在,如果您希望代码只删除前3个元素,那么您可以执行以下操作:
for ( int i = 0; i < n; i++ )
{
if ( strings.size() > 0 )
strings.remove( 0 );
}
答案 1 :(得分: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.
}
}
Cybernetic Twerk清楚地说明了他的答案中发生了什么:当你在索引之前删除一个项目时,你的索引不再指向同一个项目。
道德:永远不要写这样的代码。
有时候,如果你反向迭代,,即从最后一个元素到第一个元素,向后迭代,你就可以侥幸逃脱。为什么这种方法正常工作留给读者练习。
正确的解决方案是仅将原始列表中的所需项目添加到新列表中。
答案 2 :(得分:0)
您的原始列表就是您在其上调用delete并将其循环4次。 [侵蚀,rosion,osion,sion,ion,on,n]
然后它转到循环并删除列表0元素,这是“侵蚀” 现在列表成为这个 [rosion,osion,sion,ion,on,n]
现在它删除列表1元素,它是“osion”所以它变成了 [rosion,sion,ion,on,n]
现在你的列表2元素被移除,这是“打开”所以你得到的结果为 [rosion,sion,on,n]
答案 3 :(得分:0)
您正在根据索引从ArrayList中删除元素。在您的示例中,首先删除0元素,但现在结果列表中包含“rosion”,“osion”,“sion”,“ion”,“on”,“n”,因此当您删除1个元素时,是“osion”,留下“rosion”,“sion”,“ion”,“on”,“n”,当你删除2元素时,你有“rosion”,“sion”,“on”,“n ”
您可以将删除(i)更改为删除(0)。或者,您可以使用removeRange,例如
public static void deleteBlock( ArrayList<String> strings, int n )
{
if ( strings.size() < n ) strings.clear();
else strings.removeRange(0, n);
}