如何按输入顺序输出 C++11 unordered_map/unordered_set 和 Java HashMap/HashSet 值?

Posted

技术标签:

【中文标题】如何按输入顺序输出 C++11 unordered_map/unordered_set 和 Java HashMap/HashSet 值?【英文标题】:How to output C++11 unordered_map/unordered_set and Java HashMap/HashSet values by input order? 【发布时间】:2014-05-11 14:54:59 【问题描述】:

如何按键的输入顺序输出 hashmap 值? 在 C++11 unordered_map 中,它不是有序的。查看 C++ 参考页

http://www.cplusplus.com/reference/unordered_map/unordered_map/begin/

  mymap = "Australia","Canberra","U.S.","Washington","France","Paris";
  std::cout << "mymap contains:";
  for ( auto it = mymap.begin(); it != mymap.end(); ++it )
    std::cout << " " << it->first << ":" << it->second;

输出序列为

mymap 包含:法国:巴黎 澳大利亚:堪培拉 美国:华盛顿

但我希望澳大利亚:堪培拉 美国:华盛顿 法国:巴黎

如何输出以上结果?以及如何在 Java 中实现(我在 HashSet/HashMap 中测试,键 也没有订购)?

谢谢!

【问题讨论】:

不能用链表哈希表吗?还是您也需要删除? 【参考方案1】:

在 Java 中,您可以使用 LinkedHashMap 和 LinkedHashSet。这是一个使用 LinkedHashMap 的示例,它以与插入到地图中的相同顺序打印条目:

Map<String, String> map = new LinkedHashMap<>();
map.put("Australia", "Canberra");
map.put("U.S.", "Washington");
map.put("France", "Paris");
for (Map.Entry<String, String> e : map.entrySet()) 
    System.out.printf("%s:%s\n", e.getKey(), e.getValue());


对于 C++,请查看 Boost Multi-Index Containers。您可以在教程中关于sequenced indices 的部分中找到类似的示例。在您的情况下,它可能如下所示:

struct country

    std::string name;
    std::string capital;
;

multi_index_container<
    country,
    indexed_by<
        hashed_unique<member<country,std::string,&country::name>>
        sequenced<>>> countries;

【讨论】:

【参考方案2】:

unordered_map 本身在概念上是无序的 :-)

但考虑维护一个键列表以跟踪插入顺序

然后

for (auto& key : KeyOrderList)
    cout << "(" << key << ", " << MyMap[key] << ")" << endl;

【讨论】:

【参考方案3】:
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <iterator>
#include <vector>

using namespace std;
int main(int argc, char *argv[]) 
    unordered_map<std::string, std::string> mymap = "Australia", "Canberra","U.S.","Washington","France","Paris";
    vector<std::string> keys;
    transform(mymap.begin(), mymap.end(), back_inserter(keys),
        [](const decltype(mymap)::value_type& pair) 
            return pair.first;
        );
    sort(keys.begin(), keys.end());
    cout << "mymap contains: ";
    for (auto const& key: keys) 
        cout << " " << key << ":" << mymap[key];
    
    cout << endl;

【讨论】:

糟糕。我现在看到问题询问如何按输入顺序而不是按键排序。

以上是关于如何按输入顺序输出 C++11 unordered_map/unordered_set 和 Java HashMap/HashSet 值?的主要内容,如果未能解决你的问题,请参考以下文章

Python 如何对输出的词频结果按字母顺序排序(NLTK)

C语言结构体排序

c语言题。 按顺序打印输出26个英文字母,

Python字典如何按键(1,2,3,4…)输出,而不是(1,10,11…)?

c语言:输入4个整数,要求按从小到大的顺序输出。

输入3个整数,按从小到大的顺序输出(用指针处理)