如何按输入顺序输出 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)