【问题标题】:Removed always last elements from array list从数组列表中删除总是最后一个元素
【发布时间】:2016-03-31 12:13:10
【问题描述】:

这是我的代码:

for (int i=0; i<mListOfItemsToDelete.size(); i++) {
            receivedMessages.remove(mListOfItemsToDelete.get(i).intValue());
            Log.e("position:", mListOfItemsToDelete.get(i).toString());
        }
        mListOfItemsToDelete.clear();

receivedMessages 包含我在 ListView 中使用的所有消息项 (MessagesModel)。 mListOfItemsToDelete 包含要从 receivedMessages 中删除的项目索引列表(例如 [4, 2, 1] - 始终排序和反转)。

receivedMessages.remove(mListOfItemsToDelete.get(i).intValue()); 总是从ArrayList 的末尾删除元素(例如,如果我选择 2 个元素,它会从末尾删除 2 个元素)。这行代码让我抓狂——你知道什么可以帮助正确删除项目吗?

编辑: 在我的代码中输入后,我在日志中发现了一些非常奇怪的东西:

private void deleteSelectedMessages() {
        Log.i("arrayIN_:", receivedMessages.toString());
        for (int i=0; i<mListOfItemsToDelete.size(); i++) {
            //TODO: receivedMessages.remove delete last elements, not selected...
            receivedMessages.remove(Integer.parseInt(mListOfItemsToDelete.get(i).toString()));
            Log.e("position:", mListOfItemsToDelete.get(i).toString());
            Log.i("arrayFOR" + i + ":", receivedMessages.toString());
        }
        Log.i("arrayIN:", receivedMessages.toString());
        mListOfItemsToDelete.clear();
    }

还有我的日志(我选择索引为 1 和 2 的项目 - 我的 ArrayList 有 5 个元素,索引中为 0-4):

04-04 16:48:29.536 5829-5829/app.com.mmm I/arrayIN_::
[app.com.mmm.models.MessageModel@3ae1bbc, 
app.com.mmm.models.MessageModel@cfd4745, 
app.com.mmm.models.MessageModel@17ec8e9a, 
app.com.mmm.models.MessageModel@2847d3cb, 
app.com.mmm.models.MessageModel@231f37a8]

04-04 16:48:29.536 5829-5829/app.com.mmm E/position:: 2

04-04 16:48:29.536 5829-5829/app.com.mmm I/arrayFOR0:: 
[app.com.mmm.models.MessageModel@3ae1bbc, 
app.com.mmm.models.MessageModel@cfd4745, 
app.com.mmm.models.MessageModel@2847d3cb, 
app.com.mmm.models.MessageModel@231f37a8]

04-04 16:48:29.536 5829-5829/app.com.mmm E/position:: 1

04-04 16:48:29.536 5829-5829/app.com.mmm I/arrayFOR1:: 
[app.com.mmm.models.MessageModel@3ae1bbc, 
app.com.mmm.models.MessageModel@2847d3cb, 
app.com.mmm.models.MessageModel@231f37a8]

04-04 16:48:29.536 5829-5829/app.com.mmm I/arrayIN:: 
[app.com.mmm.models.MessageModel@3ae1bbc, 
app.com.mmm.models.MessageModel@2847d3cb, 
app.com.mmm.models.MessageModel@231f37a8]

04-04 16:48:29.536 5829-5829/app.com.mmm I/arrayOUT:: 
[app.com.mmm.models.MessageModel@3ae1bbc, 
app.com.mmm.models.MessageModel@2847d3cb, 
app.com.mmm.models.MessageModel@231f37a8]

请注意,arrayOUT 位于我调用上述方法的位置下方...

它从ArrayList 中正确删除,但为什么我的ListView 总是删除最后一个元素?!

【问题讨论】:

  • receivedMessages.remove(0); 总是删除第一个元素...你是在 for 循环中这样做吗?
  • 是的,我知道它应该删除第一个元素......但它总是删除最后一个元素 - 在调试模式下我看到了。如果我选择 3 个元素,它 (receivedMessages.remove(0);) 会删除最后 3 个对象...
  • 我想从位置(索引)0 移除对象,例如它仍然从最后一个位置删除对象...
  • 你应该告诉我们receivedMessages的类型。另请注意,如果mListOfItemsToDelete 不是按降序排列,则索引将在第一次删除后关闭。

标签: java arraylist


【解决方案1】:

对我来说这是可行的:

 ArrayList<String> some_data=new ArrayList<String>();
    ArrayList<Integer> indexes_to_delete=new ArrayList<Integer>();

 some_data.add("one");
        some_data.add("two");
        some_data.add("three");
        some_data.add("four");
        some_data.add("five");

        indexes_to_delete.add(4);
        indexes_to_delete.add(2);

        for(int i=0;i<indexes_to_delete.size();i++) {
            some_data.remove(indexes_to_delete.get(i).intValue());
        }

我的 some_data 现在包含“一”、“二”和“四”

【讨论】:

  • 我有相同的代码(唯一的区别是some_data 的类型是MessageModel 而不是String...这表明我的代码似乎很好。我说的对吗?
【解决方案2】:

试试这个: receivedMessages.remove(mListOfItemsToDelete[i]);

【讨论】:

  • 但这是ArrayList,我只能使用:mListOfItemsToDelete.get(i)
  • int indexToRemove = mListOfItemsToDelete.get(i); receivedMessages.remove(indexToRemove); mListOfItemsToDelete 的数据类型是 Integer,要么将其更改为 'int',要么使用上面的代码,它应该适合你。