【问题标题】:Delete Object out of ArrayList<?> with another instance of the same object使用同一对象的另一个实例从 ArrayList<?> 中删除对象
【发布时间】:2020-12-17 18:06:26
【问题描述】:

所以我有一个未定义的对象,我想将它从一个数组列表中删除,而另一个未定义的对象具有相同的值,这样我就可以拥有一个可以处理我扔给它的每个对象的类,而不必创建每种对象类型都有不同的方法。

问题是,即使对象的内容相同,因为它是另一个实例,整体价值是不同的。

喜欢:
Msg.TradeMsg@1d97b82
Msg.TradeMsg@1a3337fb\

即使这 2 个对象具有相同的值,但它们是不同的,并且不会通过 .equals 返回 true

所以我的问题是,如何从数组列表中删除一个对象,当它具有相同的字段但我不知道 Object 类是什么时?

或者有没有更简单的方法?

代码:

//valueToDelete can be of any type like User, Items, Trade...
public void deleteFromJson(Object valueToDelete, String fileLocation) throws IOException {
        Gson gson = new Gson();
        ArrayList<Object> oldValues = new ArrayList<>();

        //If valueTiDelete is null, the whole content of the file will be deleted
        if (valueToDelete != null) {
            //Get Content out of array and add it to the ArrayList
            for (Object oldValue : updateOldValues(fileLocation)) {
                oldValues.add(gson.fromJson(oldValue.toString(), valueToDelete.getClass()));
            }

            //This does not work, because the objects are 2 different instances but still have all the same fields.
            //How can I remove an object from the array list, when it has the same fields but I don't know what the Object class is?
            oldValues.remove(valueToDelete);
        }

        // Write updated content in file
        Writer writer = new FileWriter(fileLocation);
        gson.toJson(oldValues, writer);

        writer.flush();
        writer.close();
    }

【问题讨论】:

  • 您在问题中一针见血:.equals() 不会返回 true。您需要重写 .equals() 方法,以便它检测到您喜欢的等效对象。一旦您编写了 equals() 方法,大多数 IDE 还会为您生成 hashCode() 方法。

标签: java arraylist gson


【解决方案1】:

要验证两个未知和不同类的对象在它们包含的值上是否相等,您可以

  1. 在可能进入该列表的所有类中同时覆盖 Object::equalsObject::hashCode,或者
  2. 使用reflection 探测对象内部并深入检查是否相等

第二个是很难做到的,如果不仔细做的话,很容易出错。 例如,Hibernate 这样做是为了完成其 脏检查 功能,所以我不会说这是一种不好的做法,但肯定会在灰色区域徘徊。

旁注:有这样的需求通常表明需要重新设计模型

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 2021-08-14
    • 1970-01-01
    • 2016-02-14
    • 2021-03-15
    • 2013-05-29
    • 1970-01-01
    • 2021-03-11
    • 2018-12-13
    相关资源
    最近更新 更多