我正在写一篇涉及泛型的简短作业。其中一种方法旨在替换通用集中的对象。我已经发布了以下代码。我已经修复了大部分错误,但问题仍然存在,即Java正在使用newObject而不是List.get(i)中的数据。我输入了输出语句来测试它,每当我要求它从List中打印任何东西时,它都会给我来自newObject的数据。 OldObject没有问题地输出信息。
public boolean replaceObject(T oldObject, T newObject){
if (theList.size()==0){
System.out.println("The set is empty");
}
for (int i = 0; i < theList.size(); i++){
if ((oldObject.toString().compareToIgnoreCase(theList.get(i).toString()))==0){
theList.remove(i);
theList.add(newObject);
return true;
}
}
return false;//executes if nothing found
}
编辑:感谢所有的回复,但我关心的问题不是搜索跳过条目,而是搜索通过theList,它只是查看newObject。 theList.get(i)不是从List返回数据,程序正在读取newObject,我不知道为什么。
答案 0 :(得分:0)
我想你想要一个替换操作:theList.set(i, newObject);
。
编辑:这是逻辑错误:在同一个循环中调用remove()和add()。
假设list = ['a','b','c']:
循环:
当i = 0时,删除列表[0]并添加“d”,列表将为['b','c','d']。
当i = 1时,跳过'b'!
答案 1 :(得分:0)
当您从列表中删除某个项目时,其下方的所有项目都会向上一步以占据较新的位置。
例如 - 假设列表如下:
index 0 --> a
index 1 --> b
index 2 --> c
for (int i = 0; i < theList.size(); i++) { }
// int i最初为0。
删除索引0(删除a,但保留索引,然后b和c将向上移动)
删除0后(因为i == 0)
index 0 --> b
index 1 --> c
添加新项目d(这将占用最后一个索引,即2)
index 0 --> b
index 1 --> c
index 2 --> d //this is new.
现在递增i(i ++)因此我将等于1,
然后删除索引1(因为我是1)
列表变为
index 0 --> b
index 1 --> d
// notice that c is removed because that was at index 1. now d takes index 1
添加新元素e
index 0 --> b
index 1 --> d
index 2 --> e
等等。
所以每次删除和添加时,都没有得到正确的值,因为ArrayList会重新排列项目的索引。
使用“set”可能不起作用,因为它用于替换现有元素。它不能用于添加新元素。
选项1) 更好的选择是使用HashMaps。这将确保您删除正确的元素。 您还可以使用适当的键值向HashMap添加新元素。
选项2) 而不是删除元素,将其设置为空String / Object。使用“设置”。这样你永远不会改变索引。
答案 2 :(得分:0)
在使用shap knifes进行迭代时,在列表中添加和删除:
for (int i = 0; i < theList.size(); i++){
if ...
theList.remove(i);
theList.add(newObject);
迭代器不同步。
相反,您可以使用中间列表来存储要移除和添加的对象,并在最后一步中添加和删除它们: 样品,仅删除:
public void remove (String name)
{
List <Person> blacklist = new ArrayList <Person> ();
for (Person p : people)
{
if (p.getName ().equals (name))
{
blacklist.add (p);
}
}
people.removeAll (blacklist);
}
答案 3 :(得分:0)
一切都很适合我。请确保您正确设置列表。
以下是简单的示例代码。
public class Test<T> {
public List<T> theList;
public Test()
{
this.theList = new ArrayList<T>();
}
public boolean replaceObject(T oldObject, T newObject)
{
if (theList.size() == 0) {
System.out.println("The set is empty");
}
for (int i = 0; i < theList.size(); i++) {
if ((oldObject.toString().compareToIgnoreCase(theList.get(i).toString())) == 0) {
theList.remove(i);
theList.add(newObject);
return true;
}
}
return false;//executes if nothing found
}
public static void main(String[] args)
{
Test<String> t = new Test<String>();
t.theList.add("ABC");
t.theList.add("DEF");
t.theList.add("GHI");
System.out.println(t.replaceObject("DEF", "PQR"));
System.out.println(t.theList.toString());
}}
输出符合预期: 真正 [ABC,GHI,PQR]