添加其他信息给arraylist

时间:2013-05-22 14:34:20

标签: java arraylist

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

ArrayList<MyObject> list = new ArrayList<MyObject>();
//fill
list = myMethod(list);

我想为每个Object获取一个布尔值,但我不想将它直接存储在对象中。 所以myMethod之前的数据:Apple,Banana,Grapefruit 在myMethod之后:Apple =&gt; true,Banana =&gt; false,Grapefruit =&gt; false。

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

5 个答案:

答案 0 :(得分:3)

您可以围绕Object创建一个自定义包装器,该包装器具有object类型和boolean字段的字段。这是最佳解决方案,因为您可以为该字段选择有意义的名称。 或者,您可以使用内置类Pair并创建List<Pair<MyObject, Bool>>

答案 1 :(得分:1)

使用包含List<MyObject>字段和List<Boolean>字段的类,其元素的标记与MyObject中添加的每个List<MyObject>平行。由于这太麻烦,只需在MyObject中添加布尔标志即可。如果您无法修改该类,请对其进行扩展并在boolean类中添加ExtendedMyObject extends MyObject标志。如果您无法扩展它,请创建一个MyObject的包装类,其中包含MyObject字段和boolean标记。

答案 2 :(得分:1)

您可以单独维护Set<MyObject> - Set中的成员资格对应于该对象的true值。

假设您使用了HashSet,则需要确保MyObject已实施equalshashCode。另一种方法是使用MyObjectString等唯一标识每个Long并保留Set个ID。

答案 3 :(得分:1)

你可以扩展ArrayList并为它们提供一个新属性。例如:

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

    private boolean value;

    public boolean isValue() {
        return value;
    }

    public void setValue(boolean value) {
        this.value = value;
    }
}

在那里你可以拥有ArrayList的所有功能,并且你有一个额外的布尔字段。

修改

如果您的Boolean值与Originalobject无关,为什么不写一个Wrapperclass?有两种可能解决这个问题:

  1. 扩展您的基类MyObject
  2. 编写一个包含2个属性的新类,一个用于boolean,另一个用于MyObject的实例

答案 4 :(得分:1)

我建议返回一个Map,其中源对象(或名称,如果唯一)映射到布尔值。

 Map<MyObject,Boolean> result = myMethod(list);

或者,如果名称是唯一的:

 Map<String,Boolean> result = myMethod(list);

 for (MyObject item : list) {
     Boolean result = result.get(item.getName());
     if (result) {
         ...
     }
 }

如果:

  • MyObject未实现#hashCode(因此您可能会错过相同对象的哈希值)
  • 名称不是唯一的或
  • 如果result比布尔值更复杂,

然后我创建一个包装器,用结果包装MyObject并返回List<MyObjectResult>

编辑:顺便说一下,我认为你不应该在MyObject上包含布尔字段,如果它不是该对象状态的一部分 - 即它是某个操作的瞬态结果。