2013-05-22 78 views
2

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

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

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

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

+1

为什么你不想将它直接存储在对象中?这是最好的方式。 – MasNotsram

+0

你可能很好地让你的Object包含一个布尔实例变量。 – Zerkz

+1

使一个方法公共布尔checkCheckity(MyObject o),只是调用它。 –

回答

1

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

3

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

1

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

假设您使用HashSet,您需要确保执行MyObjectequalshashCode。另一种方法是用String,Long等唯一标识每个MyObject,并保持这些ID的Set

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的所有功能,并且你有一个additinal boolean字段。

编辑:

如果您Boolean值无关与Originalobject,为什么不写一个Wrapperclass?有以下两种方式来解决此问题:

  1. 扩展您的基类MyObject
  2. 写有2个属性,一个是boolean和其他一类新的的MyObject
+0

相信我,这不是最好的方法。顺便说一下,您只需为数组中的所有元素设置布尔标志,而不是为数组中的每个元素设置布尔标志。 –

+0

哦,你是对的。忽略了... –

1

比如我会建议只是返回 a映射到布尔值的源对象(或名称,如果唯一)的映射。

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没有实现(平等的对象,所以你可能会错过哈希)
  • 名并非唯一或
  • 如果result更完整X比布尔,

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

编辑:顺便说一句,我认为你不应该在MyObject包括布尔字段,如果它不是该对象的状态的一部分 - 即如果它是一些操作的暂时结果。