【问题标题】:structure for holding data in this instance (Hashmap/ArrayList etc)?在这种情况下保存数据的结构(Hashmap/ArrayList 等)?
【发布时间】:2011-05-03 15:20:26
【问题描述】:

描述这种情况的最佳方式是解释情况。

假设我有一家生产椅子的工厂。现在工厂分为5个部分。椅子可以完全在一个区域或多个区域制作。椅子的制造者将椅子的属性添加到椅子对象中。在一天结束时,这些对象由我的虚构程序收集并添加到 X 数据类型(ArrayList 等)中。

添加椅子时,它必须检查椅子是否已经存在,如果存在则不替换现有椅子,而是将椅子属性附加到它(不要担心这部分,我已经涵盖了)

所以基本上我想要一个结构,而不是直接插入它,否则我可以轻松检查对象是否存在,否则执行追加。所以我需要找到与某个唯一 ID 匹配的椅子。有点像一套除了不匹配同一个对象之外,如果一把椅子是在三个区域中制作的,它将是三个不同的对象——在现实生活中,它们都代表同一个对象——但我只想要一个对象来保存所有对象的全部属性内容椅子。

一旦它在工厂的所有区域收集并执行更新,它就需要遍历每个对象并将其内容添加到数据库中。再次不要考虑添加到所涵盖的数据库等。

我只是想知道 Java 中最好的数据结构是什么来匹配这个规范。

提前谢谢你。

【问题讨论】:

  • 如果两把椅子有不同的属性,你如何判断它们是否是同一把椅子?
  • 如果你贴一些代码会更容易想象。
  • @StriplingWarrior 需要与数据类型中椅子对象的唯一 id 匹配。属性作为不同的对象存储在每个椅子对象的数组列表中。如果在唯一 id 上进行匹配,则属性对象被简单地复制到现有的 chairs 属性数组列表中,否则不匹配它将整个对象添加到数据类型中。

标签: java data-structures containers


【解决方案1】:

我会说 HashMap:它可以让您快速检查是否存在具有给定唯一 ID 的对象,如果集合中存在该对象,则检索该对象。然后只需执行合并功能即可将属性添加到已在集合中的对象。

与大多数其他集合(例如 ArrayList)不同,HashMap 实际上已针对通过唯一 ID 查找内容进行了优化,并且无论您的集合中有多少对象,它都会以同样快的速度执行此操作。

这个答案最初引用了 Hashtable 类,但经过进一步研究(以及一些好的 cmets),我发现使用 HashMap 总是更好。如果需要同步,可以拨打Collections.synchronizedMap()就可以了。请参阅here 了解更多信息。

【讨论】:

  • 干杯,从我在写这篇文章之前收集到的信息来看,hashtables 与 arraylist 相比是优化的。很高兴看到一些确认。
  • 感谢线程提示,对于这个项目线程安全不应该是一个问题
  • 澄清一下:哈希表是一个通用的 CS 术语,Hashtable 是一个特定的 Java 类,你不应该使用!!!它古老且设计糟糕,HashMap 是更高效的继任者
  • @Sean Patrick Floyd:感谢您的评论。我更新了答案。
【解决方案2】:

我会说使用 ArrayList。覆盖 Chair 对象上的 hashcode/equals() 方法以使用唯一 ID。这样你就可以使用 list.contains(chair) 来检查它是否存在。

【讨论】:

  • 如果你已经重新定义了 hashcode 和 euqals 为什么不使用 HashSet 而不是 List。我认为没有必要保留列表顺序。
【解决方案3】:

我会说使用EnumMap。为所有可能的零件类别定义一个enum,这样您就可以查询EnumMap 缺少哪个零件

public enum Category {
    SEAT,REST,LEGS,CUSHION
}

【讨论】:

  • 这是一个明智的选择,但是系统在许多实施类似例程的工厂中工作的方式,部件名称和变化发生了巨大变化。我还想淡化整个概念,因为它不仅是椅子,而且可能是任何类型的家具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多