在java中维护项目的顺序

在java中维护项目的顺序,java,Java,执行以下操作的最佳方法是什么(确保列表中的项目与列表2中的项目顺序相同): 现在结果应该是这样的 清单三 harry marry peter janice jerry 逐步: 对于列表中的每个项目: 将项目的第一部分与列表2中的项目进行比较 如果它们相等,则将其添加到列表三 如果项目存在于列表中,但不在列表2中,请不要执行任何操作并保存它 某处 从步骤1继续 您位于列表的末尾,添加在步骤中跳过的项目 三, 我知道这么多(实际上我不知道,我想我知道),我相信有更好的方法来做到这一点 为什么我得到

执行以下操作的最佳方法是什么(确保列表中的项目与列表2中的项目顺序相同):

现在结果应该是这样的

清单三

harry
marry
peter
janice
jerry
逐步:

对于列表中的每个项目:

  • 将项目的第一部分与列表2中的项目进行比较

  • 如果它们相等,则将其添加到列表三

  • 如果项目存在于列表中,但不在列表2中,请不要执行任何操作并保存它 某处

  • 从步骤1继续

  • 您位于列表的末尾,添加在步骤中跳过的项目 三,
  • 我知道这么多(实际上我不知道,我想我知道),我相信有更好的方法来做到这一点


    为什么我得到了否决票,我错过了什么吗?

    如果您将角色(按顺序将键存储在
    ArrayList
    中)和键值映射反转到
    SortedMap
    ,例如TreeMap或
    ConcurrentSkipListMap
    ,可能会更容易些。排序映射的比较器可以使用
    List.indexOf
    作为元素比较的基础

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

    或者,使用常规映射,而不是排序映射,在列表上使用迭代,并从映射中获取值。例如

    ArrayList keysList;
    Map keyValues;
    for(String key: keysList) {
       String value = keyValues.get(key);
    }
    

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

    如果您将角色(按顺序将键存储在
    数组列表中)和
    SortedMap
    中的键值映射(如TreeMap或
    ConcurrentSkipListMap
    中)颠倒,可能会更容易。排序映射的比较器可以使用
    List.indexOf
    作为元素比较的基础

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

    或者,使用常规映射,而不是排序映射,在列表上使用迭代,并从映射中获取值。例如

    ArrayList keysList;
    Map keyValues;
    for(String key: keysList) {
       String value = keyValues.get(key);
    }
    
    编辑:Commons collections有一个列表,可以像集合一样确保唯一性。它还具有各种类型的OrderedMap,特别是按列表顺序维护键/值映射的OrderedMap。有关泛型支持,请参阅。

    使用

    你可以称之为

    map.put(one,value1);
    
    稍后再打电话

    map.get(one);
    
    将返回值1

    此外,哈希映射不接受重复的密钥,因此如果调用

    map.put(one,value2);
    
    在此之后,将替换原始值

    你可以用

    map.containsKey(one)
    
    要检查一个密钥是否已经存在,请使用

    你可以称之为

    map.put(one,value1);
    
    稍后再打电话

    map.get(one);
    
    将返回值1

    此外,哈希映射不接受重复的密钥,因此如果调用

    map.put(one,value2);
    
    在此之后,将替换原始值

    你可以用

    map.containsKey(one)
    

    要检查一个元素是否已作为键存在

    如果仅比较元素的键,则可以将它们存储在LinkedHashSet中,并使用LinkedHashSet的contains方法检查元素是否以恒定时间O(1)存在

    LinkedHashMap也可以用于此目的,但是它需要额外的空间来存储值,这不是必需的,我们只对键感兴趣


    请参阅:

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

    LinkedHashMap也可以用于此目的,但是它需要额外的空间来存储值,这不是必需的,我们只对键感兴趣


    参考:

    谢谢您的快速回复,我忘了提到我不能有重复的条目,这就是我使用LinkedHashSet的原因,顺序也很重要。您能否详细说明一下“排序映射的比较器可以使用List.indexOf作为元素比较的基础”。@c0mrade-请参阅我的编辑。Commons collections为您提供了所有功能,无需编写任何自定义比较器等。感谢您的快速响应,我忘了提到我不能有重复的条目,这就是我使用LinkedHashSet的原因,顺序也很重要。请详细说明“排序映射的比较器可以使用List.indexOf作为元素比较的基础”。@c0mrade-请参阅我的编辑。Commons collections为您提供了所有功能,无需编写任何自定义比较器等。
    three~value3
    的意思是什么?@Gunslinger47 itemName~item value、模拟名称/值raylists没有项目名称,这就是我问的原因。这些值由索引引用。@Gunslinger47 my bad three~value3是一个arraylist项,我打算将其拆分为name value,以便更好地使用hashmap,正如mdma所建议的“为什么我得到了否决票,我错过了什么?”可能是因为您的问题很难理解。
    three~value3
    是什么意思?@Gunslinger47 itemName~item value,模拟名称/值raylists没有项目名称,这就是我问的原因。这些值由索引引用。@Gunslinger47 my bad three~value3是一个arraylist项,我打算将其拆分为name value,以便更好地使用hashmap,正如mdma所建议的“为什么我得到了向下投票,我错过了什么?”可能是因为您的问题很难理解。