Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C字典(顺序键)与Java SortedMap字典顺序_Java_C# - Fatal编程技术网

C字典(顺序键)与Java SortedMap字典顺序

C字典(顺序键)与Java SortedMap字典顺序,java,c#,Java,C#,我正在Java中使用SortedMap,并尝试按键排序C字典。比较输出,我希望看到相同的订单,但是订单不同,我不知道为什么 SortedMap orderedByKey=新树状图; 按键排序。计算0:10; orderedByKey.put10:12+; 按键排序。put2:10; 按键排序。put1:10; 按键排序。put10:1; Java命令他们如下 0:10 10:1 10:12+ 1:10 2:10 C 0:10 1:10 10:1 10:12+ 2:10 我在这里想的一句话是,我的

我正在Java中使用SortedMap,并尝试按键排序C字典。比较输出,我希望看到相同的订单,但是订单不同,我不知道为什么

SortedMap orderedByKey=新树状图; 按键排序。计算0:10; orderedByKey.put10:12+; 按键排序。put2:10; 按键排序。put1:10; 按键排序。put10:1; Java命令他们如下

0:10 10:1 10:12+ 1:10 2:10

C

0:10 1:10 10:1 10:12+ 2:10


我在这里想的一句话是,我的C排序已经对字典进行了排序,但使用了与Java不同的先例,即C认为“:”在“0”之前,而在Java中,“0”在“:”之前

您可能正在寻找表示按键排序的键/值对集合的方法。

这里的问题是,在C中,默认情况下会考虑区域性,这与使用纯词典比较的Java方法的结果略有不同

如果您希望C字符串比较的行为类似于Java,那么我们可以简单地指定StringComparer.Ordinal作为比较类型,它只比较每个字符的序号位置:

private static void Main()
{
    Dictionary<string, string> tmp = new Dictionary<string, string>
    {
        {"0:10", ""},
        {"10:12+", ""},
        {"2:10", ""},
        {"1:10", ""},
        {"10:1", ""}
    };

    var javaSorted = tmp.OrderBy(item => item.Key, StringComparer.Ordinal)
        .ToDictionary(i => i.Key, i => i.Value);

    Console.WriteLine(string.Join(", ", javaSorted.Select(item => item.Key)));

    GetKeyFromUser("\nDone! Press any key to exit...");
}
输出


这真的会产生不同的排序结果吗?我看到的排序是不同的,我不确定OP为什么会得到一个新的排序字典,它的var orderedByKey=tmp.OrderByy=>y.Key.ToDictionaryy=>y.Key,y=>y.Value@Stvnbrkdell我相信OP要求的是一个类似的数据结构,他不必通过Anks Rahul明确订购。我试过这个,我看到了同样的行为。我希望C中的SortedDictionary的顺序与Java中的SortedMap相同,但我看到。。。Java=0:10,10:1,10:12+,1:10,2:10 C=0:10,1:10,10:1,10:12+,2:10为什么您希望ToDictionary返回的字典有任何特定的顺序?字典中项目的顺序未定义。无论您以什么顺序添加项目,结果仍然具有未定义的顺序。在课程的文档中这样说。我同意这里的@Andreas。在.NET中,当枚举字典或其键或值集合时,字典元素的出现顺序是未定义的。依赖文档明确告诉您不要依赖的偶然行为是个坏主意,当您切换到不同的.NET版本或目标平台.NET Framework、.NET Core、Mono等时,这种行为可能会发生变化。@RufusL Hi Rufus。我的目标是能够在Java和C中按键以相同的顺序输出键值对。我不介意使用什么类型的字典、映射等,也不介意它们是在插入时排序的还是在插入所有项之后排序的。只要我将键值对输出到文本文件(例如,用于差分)时,它们的顺序就保证相同。@Andreas感谢您指出这一点,这就解释了为什么依赖字典排序是个坏主意。我也尝试过使用SortedDictionary,我知道它将按键顺序枚举,我看到返回的顺序完全相同,即Java中的SortedMap与C中的SortedDictionary顺序不同。排序不是基于您使用的容器,而是基于字符串类型本身及其默认字符串。Comparestring,string方法。如果希望顺序比较的行为类似于Java,则必须指定需要顺序比较。下面是我的答案,如果你想让Java表现得像C,你可以在TreeMap中使用a,例如new TreeMapColletor.getInstance
private static void Main()
{
    Dictionary<string, string> tmp = new Dictionary<string, string>
    {
        {"0:10", ""},
        {"10:12+", ""},
        {"2:10", ""},
        {"1:10", ""},
        {"10:1", ""}
    };

    var javaSorted = tmp.OrderBy(item => item.Key, StringComparer.Ordinal)
        .ToDictionary(i => i.Key, i => i.Value);

    Console.WriteLine(string.Join(", ", javaSorted.Select(item => item.Key)));

    GetKeyFromUser("\nDone! Press any key to exit...");
}