我正在尝试清空列表,这意味着删除所有项目。据我的教授说,我应该手动追踪for循环。我知道随着每个项目的删除,大小会发生变化,但我不明白这与问题的关系。顺便说一下,当您看到下面的代码时,它们都与MainActivity分开。这是我正在处理的代码:
public void removeAll(View view)
{
//Declare the reference
StringList the_list;
int i;
//Access the singleton list class
the_list = StringList.getInstance();
//Try to remove all items in the list
try
{
//Look through the list to remove each item
for(i = 0; i <= the_list.size(); i++)
{
the_list.remove(i);
}
Toast.makeText(RemoveAllActivity.this, "All items are removed successfully!",
Toast.LENGTH_SHORT).show();
}
catch(IndexOutOfBoundsException e)
{
Toast.makeText(RemoveAllActivity.this, "Error: Removing all items have failed!",
Toast.LENGTH_SHORT).show();
}
}
如果你想知道MainActivity的样子,我将展示我正在使用的功能:
public class MainActivity extends Activity {
public static TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StringList the_list;
// set the reference to the "main" textview object so
// we do not have to retrieve it in every method below
tv = (TextView) findViewById(R.id.text_main);
// create/access the list of strings
the_list = StringList.getInstance();
// put some strings on the list (if the list is empty). Note that the
// "new" list might not be empty due to a restart of the app
if(the_list.isEmpty())
{
the_list.add(the_list.size(), "pizza");
the_list.add(the_list.size(), "crackers");
the_list.add(the_list.size(), "peanut butter");
the_list.add(the_list.size(), "jelly");
the_list.add(the_list.size(), "bread");
}
} // end onCreate
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/*Some code*/
public void onOption6(MenuItem i)
{
// YYY: Remove all items from the list
startActivity(new Intent(this, RemoveAllActivity.class));
tv.setText("Removing all items from the list.");
} // end onOption6
如果你想知道单例列表类的含义:
public final class StringList extends LinkedList<String>
{
private static StringList instance = null;
private StringList()
{
// Exists only to defeat additional instantiations.
}
public static StringList getInstance()
{
if(instance == null)
instance = new StringList();
return instance;
}
} // end StringList
答案 0 :(得分:2)
手动循环列表可能是错误的方法。这种方法存在的原因是:LinkedList.clear。停止尝试重新发明轮子,只需拨打the_list.clear()
。
备注:Java样式约定强烈建议不要在变量名中使用下划线。它应该是theList
而不是the_list
。
答案 1 :(得分:0)
你应该使用Iterator(如果你不想使用clear()):
像(非常粗糙)的东西:
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
有关示例,请参阅:http://examples.javacodegeeks.com/core-java/util/arraylist/arraylist-listiterator-example/
答案 2 :(得分:0)
您在列表中按索引删除并在每一步重新评估size
,最后不删除列表的后半部分...
由于您的列表是Linkedlist
,您可以删除列表的头部,直到没有其他元素:
while (the_list.isEmpty()) {
the_list.remove();
}
甚至更简单,使用clear()
方法:
the_list.clear();
但是如果你真的想要遍历所有元素并使用大小,你可以从最后一个元素开始,但这可能不是非常有效,因为你将在每个循环遍历列表 - 通过索引访问最后一个元素:
for(int i = the_list.size() -1; i >= 0; i--) {
the_list.remove(i);
}
答案 3 :(得分:0)