2

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

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

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

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

4

5 回答 5

3

You can create a custom wrapper around Object that has a field of type object and a boolean field. This is the best solution as you will be able to choose a meaningful name for the field. Alternatively you can use the built-in class Pair and create a List<Pair<MyObject, Bool>>.

于 2013-05-22T14:37:35.910 回答
1

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

 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的 - 即,如果它是某些操作的瞬态结果。

于 2013-05-22T14:52:34.077 回答
1

使用具有List<MyObject>字段和List<Boolean>字段的类,其元素是与MyObject您的List<MyObject>. 由于这太麻烦了,只需在MyObject. 如果你不能修改类,扩展它并boolean在你的类中添加标志ExtendedMyObject extends MyObject。如果您不能扩展它,请创建一个MyObject包含MyObject字段和boolean标志的包装类。

于 2013-05-22T14:36:24.857 回答
1

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

假设您使用了HashSet,则需要确保MyObject实施equalshashCode。另一种方法是MyObjectStringLong等唯一标识每个,并维护Set这些 ID 中的一个。

于 2013-05-22T14:40:23.223 回答
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
于 2013-05-22T14:40:57.317 回答