Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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 为什么data.entrySet().iterator()的顺序与HashMap不同<;长字符串>;数据?_Java_Json_Iterator_Hashmap - Fatal编程技术网

Java 为什么data.entrySet().iterator()的顺序与HashMap不同<;长字符串>;数据?

Java 为什么data.entrySet().iterator()的顺序与HashMap不同<;长字符串>;数据?,java,json,iterator,hashmap,Java,Json,Iterator,Hashmap,我有输入数据(时间戳、Json字符串),存储在HashMap中。为了处理JSON字符串,我使用了迭代器 我使用Iterator it=data.entrySet().Iterator()以获取作为迭代器的入口集 现在我的问题是HashMap的组织方式如下: 123,{String1} 124,{String2} 125,{String3} 更好地表达:我将A添加到HashMap,Z添加到HashMap,E添加到HashMap,I添加到HashMap。我希望A,Z,E,I和我在迭代器中

我有输入数据(时间戳、Json字符串),存储在
HashMap
中。为了处理JSON字符串,我使用了迭代器

我使用
Iterator it=data.entrySet().Iterator()
以获取作为迭代器的入口集

现在我的问题是HashMap的组织方式如下:

 123,{String1} 
 124,{String2} 
 125,{String3}
更好地表达:我将A添加到HashMap,Z添加到HashMap,E添加到HashMap,I添加到HashMap。我希望A,Z,E,I和我在迭代器中的顺序相同

如果我把它放在迭代器中,我会得到:

124, {String2}
123, {String1}
125, {String3}

Iterator的顺序与HashMap顺序不同。对我来说,迭代器的顺序必须与HashMap的顺序完全相同。我做错了什么,迭代器正在更改数据的顺序?

HashMap
没有按任何特定顺序组织,或者更准确地说,顺序没有保证。如果您想要一个有序映射,请使用
SortedMap
TreeMap
实现,如果您需要覆盖键的默认顺序,则提供一个
比较器

HashMap
没有按任何特定顺序组织,或者更准确地说,顺序没有保证。如果您想要一个有序映射,如果您需要覆盖键的默认顺序,请使用
SortedMap
TreeMap
实现,提供一个
比较器

文档说明

此类不保证地图的顺序;在里面 特别是,它不能保证订单保持不变 随着时间的推移

因此,在迭代视图
entrySet
keySet
值时,不应依赖顺序

一些
Map
的实现,如
TreeMap
提供了订购保证,正如@Oleg S和@Smutje已经建议的那样。

文档说明

此类不保证地图的顺序;在里面 特别是,它不能保证订单保持不变 随着时间的推移

因此,在迭代视图
entrySet
keySet
值时,不应依赖顺序


一些
Map
的实现,如
TreeMap
提供订购保证,正如@Oleg S和@Smutje已经建议的那样。

摘自
java.util.Map
API文档:“映射界面提供三个集合视图,允许将映射的内容视为一组键、值集合或一组键值映射。映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他的,比如HashMap类,则没有。”

摘自
java.util.Map
API文档:“Map接口提供三个集合视图,允许将映射的内容视为一组键、值集合或一组键值映射。映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些map实现,比如TreeMap类,对它们的顺序做出了特定的保证;其他的,如HashMap类,则没有。”

除了上述发现,
即使您可以使用下面给出的LinkedHashMap,LinkedHashMap也会确保按插入顺序存储值

public static void main(String[] args) {
    Map<Integer, String> map = new LinkedHashMap<Integer, String>();
    Map<Integer, String> map2 = new HashMap<Integer, String>();
    map.put(1, "oneone");
    map.put(3, "twoone");
    map.put(2, "threeone");
    map2.put(1, "oneone");
    map2.put(3, "twoone");
    map2.put(2, "threeone");
    for(Entry<Integer, String> entry:map.entrySet()){
        System.out.println(entry.getKey());

    }

    for(Entry<Integer, String> entry:map2.entrySet()){
        System.out.println(entry.getKey());

    }

}
publicstaticvoidmain(字符串[]args){
Map Map=newlinkedhashmap();
Map map2=新的HashMap();
地图放置(1,“一个”);
地图放置(3,“两个一”);
地图放置(2,“三个一”);
map2.put(1,“一个”);
map2.put(3,“两个一”);
map2.put(2,“三个一”);
for(条目:map.entrySet()){
System.out.println(entry.getKey());
}
for(条目:map2.entrySet()){
System.out.println(entry.getKey());
}
}
这里的结果是,

1
3
2
1
2
3

除了上述发现,
即使您可以使用下面给出的LinkedHashMap,LinkedHashMap也会确保按插入顺序存储值

public static void main(String[] args) {
    Map<Integer, String> map = new LinkedHashMap<Integer, String>();
    Map<Integer, String> map2 = new HashMap<Integer, String>();
    map.put(1, "oneone");
    map.put(3, "twoone");
    map.put(2, "threeone");
    map2.put(1, "oneone");
    map2.put(3, "twoone");
    map2.put(2, "threeone");
    for(Entry<Integer, String> entry:map.entrySet()){
        System.out.println(entry.getKey());

    }

    for(Entry<Integer, String> entry:map2.entrySet()){
        System.out.println(entry.getKey());

    }

}
publicstaticvoidmain(字符串[]args){
Map Map=newlinkedhashmap();
Map map2=新的HashMap();
地图放置(1,“一个”);
地图放置(3,“两个一”);
地图放置(2,“三个一”);
map2.put(1,“一个”);
map2.put(3,“两个一”);
map2.put(2,“三个一”);
for(条目:map.entrySet()){
System.out.println(entry.getKey());
}
for(条目:map2.entrySet()){
System.out.println(entry.getKey());
}
}
这里的结果是,

1
3
2
1
2
3

从其他答案复制?@OlegS。你不能认为这是因为我复制了什么。stackoverflow的所有用户都会多次编辑答案,以使答案更完整。你和我碰巧有相同的答案并不意味着我复制了。我想这是在同时编写。;-@OlegS。总之,我还添加了e在我的帖子中提到了这两个答案,这只是为了说明我是多么不愿意抄袭。你不应该对相同的答案如此挑剔。你会发现一些问题,每个人都有相同的答案。他们都相互抄袭??不,这不是一个社区的工作方式。每个人都有平等的机会表达他们的答案。B由于相对较新,你很快就会发现。在其他两个帖子发布后,你编辑了你的答案,首先添加了关于TreeMap的信息,然后添加了关于SortedMap的信息,因此这与大致同时提出一个原始想法无关。从其他答案复制?@OlegS。你不能认为这是因为我复制了或其他什么。stackoverflow的所有用户都会对答案进行多次编辑,以使答案更完整。您和我碰巧有相同的答案