如何删除ArrayList的项目并更新元素的索引

时间:2015-07-29 23:00:49

标签: java arrays arraylist indexing

我有一个ArrayList来存储名为QuestionText的对象。这是下面对象的类。

package me.bigbaddevil7.QnA;

public class QuestionText {
    int index;
    String username;
    String message;

    public QuestionText(int index, String username, String message){
        this.index = index;
        this.username = username;
        this.message = message;
    }


    public void setIndex(int i){
        index = i;
    }

    public void setUsername(String user){
        username = user;
    }

    public void setMessage(String msg){
        message = msg;
    }

    public int getIndex(){
        return index;
    }

    public String getUsername(){
        return username;
    }

    public String getMessage(){
        return message;
    }
}

我遇到的这个问题是,所有问题对象都将存储在一个可以在以后访问和操作的ArrayList中,我希望索引能够正确更新。

例如,我们添加了#34; Abby"," Bob"," Carl"。用相应的索引为0,1,2。如果我做了一个简单的删除(1)。然后就是" Abby"," Carl"并且将显示的索引是0,2,我想要0,1。使用getIndex()显示索引。

我查看了Arrays如何处理删除项目并将数组复制到新项目,但由于这可能发生很多次,我不知道这是否是解决此问题的最佳方法。 / p>

3 个答案:

答案 0 :(得分:2)

您正在接近此问题,就好像索引是QuestionText类的属性一样。但事实并非如此。更改ArrayList中问题的顺序不应影响QuestionText个对象。该指数是其在ArrayList中的地位的结果;它不是问题的固有部分。

我会从index类中完全删除QuestionText变量和关联的getter / setter。索引取决于ArrayList类。与数组一样,这些索引是固定的,从0开始。请将索引用于ArrayList

答案 1 :(得分:1)

为什么你需要在课堂上记录它的索引?你不能随时调用list.indexOf(QuestionText)吗?由于索引易于改变,因此存储易于改变的值并不是一个好主意。无论何时修改列表,都必须更新修改后的每个元素的索引。

要回答你的问题,我会将你的二传手改为

public void setIndex(){
    index = list.indexOf(this);
}

您必须在课程中保留对您的列表的引用。同样,无论何时修改列表,都必须在修改后的元素后面的所有元素上调用setIndex

另一种方式,可能更好,就是让你的二传手保持原样。但是,无论你修改你的arraylist,你都必须做这样的事情。

for(int i = (index of modified element);i<list.length();i++){
    list.get(i).setIndex(i);
}

如果你厌倦了我说'#34;任何时候你修改......&#34;,那么你肯定会厌倦在每次修改列表后调用这个循环,并且不可避免地,对象中的索引值不正确。我建议重新考虑你的方法。

答案 2 :(得分:0)

使用ArrayLists&#39;方法remove(index)已经自动为您执行此操作。位置索引+ 1到ArrayList末尾的项目将自动向下移动以填充现在在列表中创建的间隙。但是,对于数组而言,情况并非如此。

此外,除非有理由在ElementList中存储元素的索引或位置,否则应删除索引变量。 ArrayList本身将为您解决这个问题。

如果需要保留一个实例变量来保存ArrayList中的对象位置,您可以始终执行以下操作:

将方法setIndex(index)放在QuestionText类

public void setIndex(int index)
{
   this.index = index;
}

并遍历ArrayList并利用该方法为变量赋值

for (int i = 0; i < [list_name].size(); i++)
{
    [list_name].get(i).setIndex(i);
}