Java HashMap键映射不';我看起来不对劲
请有人再检查一下,看看我下面的代码有什么问题,我们将不胜感激。 我尝试了很多次,不同的方法,但仍然给了我意想不到的结果 下面是返回映射值的方法 我调用了1,传入值==0,它工作正常 -->结果正常,第一个键=0,值正确且全部正确 我用传入值=1进行了第二次呼叫 -->结果是错误的,第一个键==16,我期望它应该是=12Java HashMap键映射不';我看起来不对劲,java,dictionary,hashmap,Java,Dictionary,Hashmap,请有人再检查一下,看看我下面的代码有什么问题,我们将不胜感激。 我尝试了很多次,不同的方法,但仍然给了我意想不到的结果 下面是返回映射值的方法 我调用了1,传入值==0,它工作正常 -->结果正常,第一个键=0,值正确且全部正确 我用传入值=1进行了第二次呼叫 -->结果是错误的,第一个键==16,我期望它应该是=12 public Map<Integer, String[]> noteNumberNoteNameMap; public Map<Integer, Str
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-andgetNoteNumberNotNameMap(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-andgetNoteNumberNotNameMap(1)。get(12)
返回String[1]{“C”}
。看起来工作正常LinkedHashMap工作正常!。谢谢卡莉和所有人。用过的LinkedHashMap就像预期的一样完美!。谢谢卡莉和大家。