【问题标题】:How to merge objects having same/common field?如何合并具有相同/公共字段的对象?
【发布时间】:2012-04-03 17:10:58
【问题描述】:

我有一个要求,我将以排序形式从数据库中检索所有记录。这些记录将按 DB 中的“EnteredIds”字段排序。我完美地得到了这些记录。我将这些记录放在地图中。所以我肯定会有我的地图:

<field1, EnteredId1> 
<field4, EnteredId1> 
<field3, EnteredId1> 
<field2, EnteredId1> 
<field6, EnteredId2> 
<field1, EnteredId2> 
<field2, EnteredId2> 

其中EnteredId 是排序形式(即 1,1,1,1,2,2,2,...)。 现在我想要另一个列表,其中包含根据EnteredIds Like 的对象

Object1 will contain 4 records having EnteredId = EnteredId1.
Object2 will contain 3 records having EnteredId = EnteredId2.

等等.. 我已经使用 Map 进行了尝试,但逻辑似乎非常耗时且优化程度非常低。

请帮忙.. 提前谢谢..

【问题讨论】:

  • 我不太明白你的例子:你说你正在使用地图,但你似乎也有多个相同的键。这不适用于法线贴图。你的意思是MultiMap 吗?
  • 您还说地图将按EnteredId 排序,这是地图值。我知道的唯一允许您执行类似操作的标准映射是LinkedHashMap,它将按插入顺序对条目进行排序,因此必须已经对值进行排序。

标签: java sorting map merge


【解决方案1】:

虽然我还没有完全理解你的问题,但我会尝试回答它。

我假设你有一张这样的地图:

field1->id1
field2->id1
field3->id1
field4->id2
...

我进一步假设你想反过来,即

id1 -> field1, field2, field3
id2 -> field4
...

这可以通过使用Map&lt;Id,List&lt;Field&gt;&gt; 或更好的MultiMap 来实现,Google GuavaApache Commons Collections 提供。

【讨论】:

  • 你能详细说明你的答案吗? Map&lt;Id,List&lt;Field&gt;&gt; 中的意思是什么 Id 和字段考虑到我的例子?
  • @adn_295 只是我懒惰:Id = EnteredIdField 是您示例中键的类型(即field1field2 等)
  • 好的。但是我怎样才能以独特的方式获得那些EnteredIds 呢?表示来自map&lt;field, EnteredId&gt;,如何获得唯一的EnteredIds?因为它们是具有相同EnteredIds 的多条记录,如示例所示。
  • @adn_295 正如我试图指出的:使用反向映射。映射键通常是不同的,因此从EnteredId 映射到字段列表。为了让生活更轻松,请使用MulitMap
  • 我用另一种方式解决了这个问题,即直接以这样的方式触发查询,我将获得所需的 o/p。但是感谢您的帮助..
【解决方案2】:

是否需要以排序方式保持元素?否则,您可以使用LinkedHashMap,它只是一个哈希映射,它将具有相同键的元素放在一个链表中。因此,如果您添加 3 个带有 enterId1 (作为键)的元素,它们将存储在映射相同索引处的链表中,这将允许 O(1) 访问键。这将非常快,除非您将使用相同的键存储大量元素。你可以阅读更多关于它的信息here:

【讨论】:

  • 感谢您的回复.. 我一定会检查的。
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 2023-02-13
  • 2019-10-03
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多