// //////////////测试数据///////////////
if (tabTitle != null && tabTitlesize() > 0) {
tabTitleclear();
}
for(int i = 0; i < 5; i++) {
List<SeatTime> list = new ArrayList<SeatTime>();
for (int k = 0; k < 30; k++) {
SeatTime st = new SeatTime();
stsetTime("10:00_" + k);
stsetDatetime("2014-11-18_" + k);
stsetDatedesc("11月18日 明天 10:30_" + k);
if (k % 3 == 0) {
stsetState("1");
} else {
stsetState("0");
}
listadd(st);
}
ConfigLog("zrck", "i========"+i);
timeMapput("日期" + i, list);
}
//获取map里的key值
Iterator it = timeMapentrySet()iterator();
while (ithasNext()) {
Entry entry = (Entry) itnext();
tabTitleadd(entrygetKey()toString()replaceAll(" ",""));
ConfigLog("zrck", "============"+entrygetKey()toString());
}
测试后的结果
输入时按顺序插入的,但是取出时数据就乱套了,查了下资料发现,hashmap是散列映射,也就是它不会记录数据存储时的顺序,也就无法保证你取出时的顺序,为了解决这个问题,很简单采用LinkedHashMap或者是TreeMap即可,当然会造成一些额外开销,但并不影响什么。
重写自定义对象的hashcode()方法,让内容相同的对象返回一样的hashcode默认情况自定义对象是以内存地址为hashcode,你“重新创建一个一样的对象”,存在“重新创建”就会导致对象不一样所以要重写覆盖hashcode方法才能获取到map值
另外,也可以低层一点,你的自定义对象上设一个int id属性 而Map转为以id为键,比如Map<int, Value>。
public class TestMapSort {
/
@param args
/
public static void main(String[] args) {
TreeMap map = new TreeMap();
for(int i=0; i<10; i++) {
int s = (int)(Mathrandom()10);
Systemoutprintln(s); //打印随机产生的数据无序
mapput(s,s); //测试随机put10个数字
}
Collection col = mapkeySet(); //从map里取键集合,这里应该是排序的
Iterator it = coliterator(); //遍历
while(ithasNext()) {
int key =IntegerparseInt(itnext()toString()); //强制转换为int
Systemoutprintln(key); //打印键
Systemoutprintln(mapget(key)); //打印键对应的值
}
}
}
按照楼上的建议重新写了一个 我没有在Structs里面测,对立面的标签用起来感觉不习惯,我打印测试了 可以实现排序的功能
import javautil;
public class TreeMapTest {
@SuppressWarnings("unchecked")
public static MapEntry[] getSortedTreeMap(TreeMap treemap) {
Set set = treemapentrySet();
MapEntry[] entries = (MapEntry[]) settoArray(new MapEntry[set
size()]);
Arrayssort(entries, new Comparator() {
public int compare(Object arg0, Object arg1) {
Object key1 = ((MapEntry) arg0)getKey();
Object key2 = ((MapEntry) arg1)getKey();
return ((Comparable) key1)compareTo(key2);
}
});
return entries;
}
public static void main(String[] args) {
TreeMap tb = new TreeMap();
tbput("11", "aad");
tbput("ss", "aaaa");
tbput("bb", "aa");
tbput("aaa", "aad");
tbput("fff", "aad");
MapEntry[] set = getSortedTreeMap(tb);//调用上面方法排序
for (int i = 0; i < setlength; i++) {
Systemoutprintln(set[i]getKey()toString());
Systemoutprintln(set[i]getValue()toString());
}
}
}
以上就是关于为什么HashMap取出的数据顺序和存储时的顺全部的内容,包括:为什么HashMap取出的数据顺序和存储时的顺、java中的Map的键如果是自己写的一个类的对象,怎么根据这个键获取值、JAVA 中 Map的按顺序 PUT如何实现 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)