遍历字典时得到的顺序因语言而异。 Python dict、JS Map、C# Dictionary(文档不保证)按插入顺序;Java HashMap 和 C++ unordered_map 没有确定的顺序。 始终按键排序保存的是 C++ std::map、Java TreeMap、C# SortedDictionary。 Python 用 sorted(roster) 排好键再遍历。 JS 有两个陷阱:不带比较函数的 keys.sort() 会把数字当字符串比较,10 会排在 9 前面(请传 (a, b) => a - b);空对象 {} 只把非负整数键按从小到大放在前面,"-3" 这样的键按插入顺序放在后面。 把编号按字符串当键,任何语言都会变成字符串顺序。 C 没有字典,把结构体数组按(编号, 到达顺序)qsort,同一编号只取最后一个。 Craykon 的 字典() 像 Python 一样保持插入顺序,所以用 keys = roster.键列表; keys.排序(); 排序(数字按大小)。
Pythonmain.py · 10 行
import syslines = sys.stdin.read().split("\n")n = int(lines[0])roster = {}for line in lines[1:n + 1]: key, name = line.split() roster[int(key)] = namefor key in sorted(roster): print(key, roster[key])
JavaScriptmain.js · 9 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]);const roster = new Map();for (let i = 1; i <= n; i++) { const [key, name] = lines[i].trim().split(" "); roster.set(Number(key), name);}const keys = [...roster.keys()].sort((a, b) => a - b);console.log(keys.map((k) => `${k} ${roster.get(k)}`).join("\n"));
TypeScriptmain.ts · 10 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]);const roster = new Map<number, string>();for (let i = 1; i <= n; i++) { const [key, name] = lines[i].trim().split(" "); roster.set(Number(key), name);}const keys: number[] = [...roster.keys()].sort((a, b) => a - b);console.log(keys.map((k) => `${k} ${roster.get(k)}`).join("\n"));
JavaMain.java · 21 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Map;import java.util.TreeMap;public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine().trim()); Map<Integer, String> roster = new TreeMap<>(); for (int i = 0; i < n; i++) { String[] p = in.readLine().trim().split(" "); roster.put(Integer.parseInt(p[0]), p[1]); } StringBuilder out = new StringBuilder(); for (Map.Entry<Integer, String> e : roster.entrySet()) out.append(e.getKey()).append(' ').append(e.getValue()).append('\n'); System.out.print(out); }}
C#Main.cs · 17 行
using System;using System.Collections.Generic;class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); var roster = new SortedDictionary<int, string>(); for (int i = 0; i < n; i++) { string[] p = Console.ReadLine().Trim().Split(' '); roster[int.Parse(p[0])] = p[1]; } foreach (var kv in roster) Console.WriteLine($"{kv.Key} {kv.Value}"); }}
C++main.cpp · 16 行
#include <iostream>#include <map>#include <string>int main() { int n; std::cin >> n; std::map<int, std::string> roster; // std::map은 열쇠 순으로 정렬된 채 있다 for (int i = 0; i < n; i++) { int key; std::string name; std::cin >> key >> name; roster[key] = name; } for (const auto& [key, name] : roster) std::cout << key << ' ' << name << '\n';}
Cmain.c · 29 行
#include <stdio.h>#include <stdlib.h>struct Entry { int key; int order; /* 몇째로 들어왔나: 같은 번호면 나중 것이 이긴다 */ char name[13];};static int by_key_then_order(const void *pa, const void *pb) { const struct Entry *a = pa, *b = pb; if (a->key != b->key) return a->key < b->key ? -1 : 1; return a->order - b->order;}int main(void) { static struct Entry e[2000]; int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d %12s", &e[i].key, e[i].name); e[i].order = i; } /* C에는 사전이 없다: 번호 순으로 정렬하고, 같은 번호 묶음의 마지막 것만 쓴다 */ qsort(e, n, sizeof e[0], by_key_then_order); for (int i = 0; i < n; i++) if (i == n - 1 || e[i + 1].key != e[i].key) printf("%d %s\n", e[i].key, e[i].name); return 0;}
Craykonmain.cray · 13 行
n = 控制台.读行().转数字();roster = 字典();循环 (i = 0; i < n; i++){ p = 控制台.读行().去空白().分割(); roster[p[0].转数字()] = p[1];}keys = roster.键列表;keys.排序();遍历 (k 在 keys){ 控制台.输出(k + " " + roster[k]);}