Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
Java HashMap键映射不';我看起来不对劲_Java_Dictionary_Hashmap - Fatal编程技术网

Java HashMap键映射不';我看起来不对劲

Java HashMap键映射不';我看起来不对劲,java,dictionary,hashmap,Java,Dictionary,Hashmap,请有人再检查一下,看看我下面的代码有什么问题,我们将不胜感激。 我尝试了很多次,不同的方法,但仍然给了我意想不到的结果 下面是返回映射值的方法 我调用了1,传入值==0,它工作正常 -->结果正常,第一个键=0,值正确且全部正确 我用传入值=1进行了第二次呼叫 -->结果是错误的,第一个键==16,我期望它应该是=12 public Map<Integer, String[]> noteNumberNoteNameMap; public Map<Integer, Str

请有人再检查一下,看看我下面的代码有什么问题,我们将不胜感激。 我尝试了很多次,不同的方法,但仍然给了我意想不到的结果

下面是返回映射值的方法

我调用了1,传入值==0,它工作正常

-->结果正常,第一个键=0,值正确且全部正确

我用传入值=1进行了第二次呼叫

-->结果是错误的,第一个键==16,我期望它应该是=12

public Map<Integer, String[]> noteNumberNoteNameMap;    
public Map<Integer, String[]> getNoteNumberNoteNameMap(int octave ) {
    noteNumberNoteNameMap = new HashMap<>();
    noteNumberNoteNameMap.put(12*octave+0,  new String[] { "C" });
    noteNumberNoteNameMap.put(12*octave+1,  new String[] { "C#", "Db" });
    noteNumberNoteNameMap.put(12*octave+2,  new String[] { "D" });
    noteNumberNoteNameMap.put(12*octave+3,  new String[] { "D#", "Eb" });
    noteNumberNoteNameMap.put(12*octave+4,  new String[] { "E" });
    noteNumberNoteNameMap.put(12*octave+5,  new String[] { "F" });
    noteNumberNoteNameMap.put(12*octave+6,  new String[] { "F#", "Gb" });
    noteNumberNoteNameMap.put(12*octave+7,  new String[] { "G" });
    noteNumberNoteNameMap.put(12*octave+8,  new String[] { "G#", "Ab" });
    noteNumberNoteNameMap.put(12*octave+9,  new String[] { "A" });
    noteNumberNoteNameMap.put(12*octave+10,  new String[] { "A#", "Bb" });
    noteNumberNoteNameMap.put(12*octave+11,  new String[] { "B" }); 
    return noteNumberNoteNameMap;
}
公共地图noteNumberNotNameMap;
公共地图GetNoteNumberNotNameMap(整数倍频程){
NoteNumberNodeNameMap=新HashMap();
NoteNumberNotNameMap.put(12*octave+0,新字符串[]{“C”});
NoteNumberNotNameMap.put(12*倍频程+1,新字符串[]{“C#”,“Db”});
NoteNumberNotNameMap.put(12*octave+2,新字符串[]{“D”});
noteNumberNoteNameMap.put(12*倍频程+3,新字符串[]{“D#”,“Eb”});
NoteNumberNotNameMap.put(12*八度+4,新字符串[]{“E”});
NoteNumberNotNameMap.put(12*八度+5,新字符串[]{“F”});
NoteNumberNotNameMap.put(12*倍频程+6,新字符串[]{“F#”,“Gb”});
NoteNumberNotNameMap.put(12*八度+7,新字符串[]{“G”});
noteNumberNoteNameMap.put(12*倍频程+8,新字符串[]{“G#”,“Ab”});
NoteNumberNotNameMap.put(12*八度+9,新字符串[]{“A”});
NoteNumberNotNameMap.put(12*倍频程+10,新字符串[]{“A#”,“Bb”});
NoteNumberNotNameMap.put(12*八度+11,新字符串[]{“B”});
return note numbernotemap;
}
请告知。
提前感谢。

HashMap不遵循插入顺序。如果要将顺序作为插入顺序,请使用LinkedHashMap,因为HashMap不遵循插入顺序。如果您希望将顺序作为插入顺序来遵循,请使用LinkedHashMap

我不确定我是否完全理解问题所在,但请记住,
HashMap
没有隐含的顺序。如果需要保持插入顺序,请使用
LinkedHashMap
。如果您需要自定义订单,请使用
SortedMap
实现(例如
TreeMap
)。请查看文档-注意,其中说明此类不保证地图的顺序。在哈希映射的某个地方,应该存在键12。它只是不能保证是您看到的第一个条目。Hi Slaw,详细地说,当我调用如下代码所示的方法时:public static void main(String[]args)抛出异常{MyClass mc=new MyClass();Map test=mc.getnoteNumberNodeNameMap(1);}结果“test”映射第一个索引[0],键是==16,我希望它应该是12。安德鲁·詹姆斯:我核实过了,没有12的钥匙。谢谢您的回答。当我使用您的代码调用
GetNoteNumberNodeNameMap(1)
,然后是
NoteNumberNodeNameMap.get(12)
,它返回一个字符串数组,其中包含一个条目(“C”)——我认为正确。将此与您正在做的进行比较。这就是订单无法保证的问题。条目
[0]
通常不是哈希映射访问数据的方式。而是使用键,如我的示例中所示。或者,正如@Slaw所提到的,使用一些保留插入顺序的东西。将代码复制并粘贴到jshell-and
getNoteNumberNotNameMap(1)。get(12)
返回
String[1]{“C”}
。似乎工作正常我不确定我是否完全理解问题所在,但请记住,
HashMap
没有隐含的顺序。如果需要保持插入顺序,请使用
LinkedHashMap
。如果您需要自定义订单,请使用
SortedMap
实现(例如
TreeMap
)。请查看文档-注意,其中说明此类不保证地图的顺序。在哈希映射的某个地方,应该存在键12。它只是不能保证是您看到的第一个条目。Hi Slaw,详细地说,当我调用如下代码所示的方法时:public static void main(String[]args)抛出异常{MyClass mc=new MyClass();Map test=mc.getnoteNumberNodeNameMap(1);}结果“test”映射第一个索引[0],键是==16,我希望它应该是12。安德鲁·詹姆斯:我核实过了,没有12的钥匙。谢谢您的回答。当我使用您的代码调用
GetNoteNumberNodeNameMap(1)
,然后是
NoteNumberNodeNameMap.get(12)
,它返回一个字符串数组,其中包含一个条目(“C”)——我认为正确。将此与您正在做的进行比较。这就是订单无法保证的问题。条目
[0]
通常不是哈希映射访问数据的方式。而是使用键,如我的示例中所示。或者,正如@Slaw所提到的,使用一些保留插入顺序的东西。将代码复制并粘贴到jshell-and
getNoteNumberNotNameMap(1)。get(12)
返回
String[1]{“C”}
。看起来工作正常LinkedHashMap工作正常!。谢谢卡莉和所有人。用过的LinkedHashMap就像预期的一样完美!。谢谢卡莉和大家。