为什么列表不是空的?

时间:2015-03-09 13:43:45

标签: java android eclipse

我正在尝试清空列表,这意味着删除所有项目。据我的教授说,我应该手动追踪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

4 个答案:

答案 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)

不要打扰自己以编程方式执行此操作!

只需使用列表中的“清除”方法即可。

All types of list in Java has this method.

ex:the_list.clear();