Java从错误的变量中获取数据

时间:2011-04-28 03:31:01

标签: java generics

我正在写一篇涉及泛型的简短作业。其中一种方法旨在替换通用集中的对象。我已经发布了以下代码。我已经修复了大部分错误,但问题仍然存在,即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,我不知道为什么。

4 个答案:

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