在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不能这样做,对吗?
答案 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
已实施equals
和hashCode
。另一种方法是使用MyObject
,String
等唯一标识每个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?有两种可能解决这个问题:
MyObject
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
上包含布尔字段,如果它不是该对象状态的一部分 - 即它是某个操作的瞬态结果。