Java 向arraylist添加其他信息

Java 向arraylist添加其他信息,java,arraylist,Java,Arraylist,在arraylist中存储一个附加属性的最佳方法是什么? 假设我将一个对象的ArrayList传递给一个方法,并使用一个附加标志返回一个ArrayList ArrayList<MyObject> list = new ArrayList<MyObject>(); //fill list = myMethod(list); ArrayList list=new ArrayList(); //填满 列表=我的方法(列表); 我想为每个对象得到一个布尔值,但我不想将它直接存

在arraylist中存储一个附加属性的最佳方法是什么? 假设我将一个对象的ArrayList传递给一个方法,并使用一个附加标志返回一个ArrayList

ArrayList<MyObject> list = new ArrayList<MyObject>();
//fill
list = myMethod(list);
ArrayList list=new ArrayList();
//填满
列表=我的方法(列表);
我想为每个对象得到一个布尔值,但我不想将它直接存储在对象中。 所以我的方法之前的数据是:苹果,香蕉,葡萄柚 在myMethod之后:苹果=>true,香蕉=>false,葡萄柚=>false


当不在对象中时,如何存储该附加属性?最好的数据类型是什么?ArrayList不能这样做,对吗?

使用一个类,该类有一个
列表
字段和一个
列表
字段,其元素是与添加到
列表
中的每个
MyObject
平行的标志。由于这太麻烦了,只需在
MyObject
中添加布尔标志即可。如果无法修改该类,请扩展它并在
ExtendedMyObject扩展MyObject
类中添加
boolean
标志。如果无法扩展它,请创建一个
MyObject
的包装类,该类具有
MyObject
字段和
boolean
标志。

您可以围绕对象创建一个自定义包装,该对象具有Object类型的字段和boolean字段。这是最好的解决方案,因为您可以为字段选择一个有意义的名称。
或者,您可以使用内置类对并创建一个
列表

您可以单独维护一个-
集中的成员资格将对应于该对象的
真值


假设您使用了,您将需要确保
MyObject
得到实现和使用。另一种方法是使用
字符串
等唯一地标识每个
MyObject
,并维护这些ID的
集。

您可以扩展ArrayList并为其提供一个新属性。例如:

public class MyArrayList<E> extends ArrayList<E>{

    private boolean value;

    public boolean isValue() {
        return value;
    }

    public void setValue(boolean value) {
        this.value = value;
    }
}
公共类MyArrayList扩展了ArrayList{
私有布尔值;
公共布尔值(){
返回值;
}
公共void设置值(布尔值){
这个值=值;
}
}
在这里,您可以拥有ArrayList中的所有功能,还可以拥有一个额外的布尔字段

编辑:

如果您的
Boolean
值与Originalobject无关,为什么不编写一个包装器类呢?有两种可能解决此问题:

  • 扩展基类
    MyObject
  • 编写一个包含两个属性的新类,一个用于
    boolean
    ,另一个用于
    MyObject
  • 我建议只返回一个映射到布尔值的源对象(或名称,如果唯一)

     Map<MyObject,Boolean> result = myMethod(list);
    
    Map结果=myMethod(列表);
    
    或者,如果名称是唯一的:

     Map<String,Boolean> result = myMethod(list);
    
     for (MyObject item : list) {
         Boolean result = result.get(item.getName());
         if (result) {
             ...
         }
     }
    
    Map结果=myMethod(列表);
    对于(MyObject项:列表){
    布尔结果=result.get(item.getName());
    如果(结果){
    ...
    }
    }
    
    如果:

    • MyObject
      未实现
      #hashCode
      (因此可能会丢失相等对象的哈希)
    • 名称不唯一或不完整
    • 如果
      结果
      比布尔值更复杂
    然后我将创建一个包装器,用结果包装MyObject,并返回一个
    列表


    编辑:顺便说一句,如果布尔字段不是对象状态的一部分,也就是说,如果它是某个操作的瞬时结果,我认为您不在
    MyObject
    上包含该布尔字段是正确的。

    为什么不直接将其存储在对象中?这是最好的方法。你最好让你的对象包含一个布尔实例变量。让一个方法成为公共布尔校验(MyObject o)并调用它。因为它与对象无关。基本上,myMethod将对象显示给用户,并为每个对象获取用户输入(true或false)。基于这个布尔变量,主程序为每个对象执行一些操作。然而,用户输入仅用于此决策,因此将其存储在对象中会很奇怪。使用Map如何?相信我,这不是最好的方法。顺便说一下,您只是为数组中的所有元素设置布尔标志,而不是为数组中的每个元素设置布尔标志。