Java中是否存在类似Map的对象,用于存储和访问键/值对,但可以返回键的有序列表和值的有序列表,这样键和值列表的顺序是相同的?

因此,作为代码解释,我正在寻找一些行为类似于我虚构的OrderedMap的东西:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}

当前回答

是否存在一个类似Map的对象用于存储和访问键/值对,但可以返回键的有序列表和值的有序列表,这样键和值列表的顺序是相同的?

你正在寻找java.util.LinkedHashMap。你会得到一个Map列表。条目<K,V>对,总是以相同的顺序迭代。这个顺序和你放东西的顺序是一样的。或者,使用java.util。SortedMap,其中键必须具有自然排序或由比较器指定。

其他回答

自Java 6以来,也有非阻塞线程安全的TreeMap替代方案。 看到ConcurrentSkipListMap。

我认为您从框架中得到的最接近的集合是SortedMap

是否存在一个类似Map的对象用于存储和访问键/值对,但可以返回键的有序列表和值的有序列表,这样键和值列表的顺序是相同的?

你正在寻找java.util.LinkedHashMap。你会得到一个Map列表。条目<K,V>对,总是以相同的顺序迭代。这个顺序和你放东西的顺序是一样的。或者,使用java.util。SortedMap,其中键必须具有自然排序或由比较器指定。

SortedMap接口(带有TreeMap实现)应该是您的朋友。

接口有如下方法:

keySet()返回一组按升序排列的键 Values()返回所有值的集合,按相应键的升序排列

所以这个接口完全满足了您的要求。但是,键必须有一个有意义的顺序。否则,您可以使用LinkedHashMap,其中的顺序由插入顺序决定。

我已经使用简单哈希映射,链表和集合排序映射的值。

import java.util.*;
import java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

输出结果为:

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5