我有一个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>
答案 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);
}