【问题标题】:Java: iterating through one list in order of the objects in other listJava:按另一个列表中的对象的顺序遍历一个列表
【发布时间】:2014-03-23 22:57:11
【问题描述】:

我有一个对象列表List<Field> fieldList 和一个字符串列表List<String> fieldNameListfieldList 中的每个 Field 对象由字符串 filedName 和各种属性组成。

迭代fieldList 并按照fieldNameList 的顺序访问其属性的最佳方法是什么?

例如,

fieldList:[name, color, size]

包含:

  [field1, red, 10]
  [field2, yellow, 8]
  [filed3, green, 9]
  [field4, blue, 10]

fieldNameList 包含:

  [field2, field3, field1, field4]

我想按 fieldNameList 的顺序访问 fieldList,即 颜色 = 黄色、绿色、红色、蓝色

我知道的一种方法是先遍历fieldList,然后创建HashMap<String, Field> nameFieldMap,然后遍历fieldNameList,并按顺序通过fieldNames 访问所需的字段属性。

但是,这涉及 2 次迭代,因此 花费的时间将是 2n

有没有更好的方法来做到这一点?这可以一次性实现吗 迭代?

【问题讨论】:

  • 可以根据fieldListNamefieldlist进行排序。
  • 如果您只想访问一次并打印它,那么您的方法似乎很好。请注意,尽管需要 2 次迭代,但算法仍然是 O(n)
  • 您的解决方案是最好的(也是最易读的),IMO。如果每次都将字段列表转换为 Map,则只有 2 次迭代。为什么不从一开始就用 Map 替换字段列表? LinkedHashMap 看起来是您需要的唯一数据结构。
  • 我不能,因为 Apache Cayenne 仅提供 List 格式的结果集。所以它不能从一开始就转换成 HashMap。如何根据 fieldListName 对 fieldlist 进行排序并在一次迭代中访问属性?
  • 排序本身会是 O(n * log(n)),如果每次你需要比较两个字段时,它甚至会是 O(n^2 * log(n))必须在列表中获取他们名字的索引。您的基于地图的解决方案更易于实施且速度更快 (O(n))。

标签: java list iteration listiterator


【解决方案1】:

如果fieldNameListfieldList 具有相同(或相似)的大小,那么您根本无法获得超过 2n 的值;每个列表一个 n。您只需为每个列表支付 O(n) 费用即可检查内容...除非至少其中一个列表有一些有趣的特征。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2017-04-09
    相关资源
    最近更新 更多