维护java中项目的顺序

时间:2010-07-20 22:14:37

标签: java

执行以下操作的最佳方法是什么(确保List中的项目遵循与ListTwo中的项目相同的顺序):

List 

harry~20
marry~22
peter~40
jerry~33
janice~20

ListTwo

harry
marry
peter
janice

现在结果应该是这样的

ListThree

harry
marry
peter
janice
jerry

一步一步:

对于List中的每个项目:

  
      
  1. 将项目的第一部分与ListTwo中的项目进行比较

  2.   
  3. 如果相等则将其添加到ListThree

  4.   
  5. 如果项目存在于列表中而不存在于ListTwo中,则不执行任何操作但保存它   某处

  6.         

    从第1步继续

         
        
    1. 您在列表的末尾添加您在步骤之前跳过的项目   3
    2.   

我知道这一点(实际上我不知道,我想我知道),有更好的方法来做到这一点我确定

为什么我会投票,我是否错过了什么?

3 个答案:

答案 0 :(得分:3)

如果您反转角色(按顺序存储ArrayList中的键)和SortedMap中的键值映射(例如TreeMap或{{1})可能会更容易}。有序映射的比较器可以使用ConcurrentSkipListMap作为元素比较的基础。

通过这种安排,地图定义了键/值映射,这对于地图来说是很自然的,并且列表保持了所需的顺序,这对于List来说是很自然的。

或者,使用常规Map,而不是有序地图,并使用列表上的迭代,并从地图中获取值。 E.g。

List.indexOf

编辑:Commons集合有SetUniqueList - 一个确保像Set一样的唯一性的列表。它还有各种类型的OrderedMap,特别是ListOrderedMap,它按照列表的顺序维护键/值映射。有关泛型支持,请参阅commons collections with generics

答案 1 :(得分:1)

使用LinkedHashMap

你可以打电话给

map.put(one,value1);

以后再打电话

map.get(one);

将返回value1

哈希映射也不接受重复键,所以如果你调用

map.put(one,value2);

之后,原始值被替换。

你可以使用

map.containsKey(one)

检查一个是否已作为密钥存在

答案 2 :(得分:0)

如果只是比较元素的键,那么可以将它们存储在LinkedHashSet中,并使用linkedHashset的contains方法来检查元素是否存在于常量时间O(1)中。

LinkeHashMap也可以达到目的,但它需要额外的空间来存储值,这不是必需的,我们只对键感兴趣。

参考:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html