【问题标题】:Add additional info to arraylist向数组列表添加附加信息
【发布时间】:2013-05-17 16:06:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不直接存储在对象中呢?这是最好的方法。
  • 你最好让你的对象包含一个布尔实例变量。
  • 创建一个方法 public boolean checkCheckity(MyObject o) 并调用它。
  • 因为它与对象无关。基本上 myMethod 向用户显示对象并为每个对象获取用户输入(真或假)。基于这个布尔变量,主程序为每个对象做一些事情。但是,用户输入仅用于此决定,因此将其存储在对象中会很奇怪。
  • 如何使用 Map?

标签: java arraylist


【解决方案1】:

您可以在 Object 周围创建一个自定义包装器,该包装器具有一个 object 类型的字段和一个 boolean 字段。这是最好的解决方案,因为您将能够为该字段选择一个有意义的名称。 或者,您可以使用内置类 Pair 并创建一个List&lt;Pair&lt;MyObject, Bool&gt;&gt;。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      假设您使用HashSet,您需要确保MyObject 实现equals 和hashCode。另一种方法是使用String、Long 等唯一标识每个MyObject,并维护这些ID 的Set。

      【讨论】:

        【解决方案4】:

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

         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 比布尔值更复杂,

        然后我会创建一个包装器,用 result 包装 MyObject 并返回 List&lt;MyObjectResult&gt;。

        编辑:顺便说一句,如果布尔字段实际上不是该对象状态的一部分,我认为您不包含布尔字段是正确的 - 即,如果它是某些操作的临时结果。

        【讨论】:

          【解决方案5】:

          您可以扩展 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 实例

          【讨论】:

          • 相信我,这不是最好的方法。顺便说一句,您只是为数组中的所有元素设置一个布尔标志,而不是为数组中的每个元素。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-21
          • 1970-01-01
          • 2021-10-03
          • 1970-01-01
          相关资源
          最近更新 更多