【问题标题】:Sorting Java List using Map Values使用映射值对 Java 列表进行排序
【发布时间】:2012-06-12 01:48:46
【问题描述】:

我有一个Map 和一个ListList 应根据 Map 键值排序。例如:

Map = (<2,"Andy">,<4,"Karl">)
List = ("Kathy","Andy","Yiri","Jun","Karl")

我必须以这样的方式对列表进行排序,即在 index : (2 : Andy) 应该在那里 并且在索引处 (4 : Karl) 应该在那里。对于其余元素顺序无关紧要。 其余条件为:

  1. 地图中的条目可能出现在列表中,也可能不出现;(在此我们可以保持顺序相同)
  2. 列表可能为空
  3. 地图可能为空

我可以在 2 个循环中做到这一点,我很想知道是否有可能在一个循环中实现这一点。

【问题讨论】:

  • 我还是不太清楚,你能给我们看看代码吗?
  • 两个问题:a) 这是作业吗? b) 在 Map 中,哪个是键,哪个是值?在&lt;2, "Andy"&gt;中,“2”是键还是值?
  • 不,这不是家庭作业:),我能够满足要求的目的,但觉得可以有更好的解决方案。是的 2 这里是我排序的关键值是字符串元素
  • 为什么不使用带有包装对象的 TreeMap 作为值。仍然是 nlogn,而不是 O(n)

标签: java list collections map


【解决方案1】:

您可以使用 1 循环遍历 map 中的所有键,并使用 indexOf(Object) 在 List 中搜索对象,然后使用 set 两次将对象交换到正确的位置。

伪代码(看起来像 Java):

Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for (Map.Entry<Integer, String> e: entrySet) {
    int index;
    if ((index = list.indexOf(e.getValue())) >= 0 && index != e.getKey()) {
        list.set(index, list.set(e.getKey(), e.getValue()));
    }
}

嗯,复杂度不是很好:O(nk),其中 n 是 List 中的元素数,k 是 Map 中的元素数。

【讨论】:

  • 是的,使用 indexOf 是一种通过 List 隐藏大量迭代的方法,但是在这种情况下,由于键/值是向后的,我看不到解决方法。
  • 重建地图是另一个 NlogN 函数。
  • @BillJames:复杂性并不是一切。 List 上的许多线性搜索可能甚至比一次 O(nlog n) 反向映射加上一次遍历 List 还要慢(这可以通过以下方式实现:如果我们与当前元素之前的元素交换,我们将执行交换,但我们不会推进“指针”)。编辑:大声笑,我什至没有注意到你不是 OP。 x_x
  • 是的,我是这个的潜伏者。谈论算法复杂性吸引了我。
猜你喜欢
  • 2021-12-23
  • 2013-02-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2014-05-13
相关资源
最近更新 更多