java数据存储常用数据结构的实现:栈(先进后出),队(先进先出),字典(键值对),集合(去重)

java数据存储常⽤数据结构的实现:栈(先进后出),队(先进先出),字典(键值对),集合(去重)对于变得强⼤,⾸先你能尽量做的,就是接受弱⼩的事实。
⼤部分情况下,我们在从输⼊流中读出数据的时候,不会对数据进⾏分析,不会想究竟⽤什么数据结构存储它⽐较好。⼀拍脑袋都怼进了数组⾥⾯,然后根据题意去⼀遍遍制定循环数组的规则,⼀遍⼀遍,直到完成任务。
这篇⽂章我们来谈谈⼏个简单的数据结构好吗。⽐如有些数据存储⽅式如果⽤队列(先进先出FIFO)的话,后⾯处理数据会更加⽅便。有⼀些存进栈(先进后出FILO)⾥⾯,后⾯对数据的处理会更⽅便。还⽐如有些数据是键值对的形式,我们当然可以⽤数组去存,但处理起来就⿇烦多了。以及某些数据的重复项对解决问题没有作⽤,我们怎样去重的问题,⼀个个去判断吗?可以,耗时耗⼒,太⿇烦,接下来我们就来简单说说怎样实现这⼏个简单的数据结构吧。(⼀切从简,记忆的东西越少越好。)som
⾸先如果数据需要按“先进先出”的⽅式提取,也就是我们数据结构中学的“队列”。想⼀想中午吃饭时候的队伍,⼈家先排的在队⾸,也会先打完饭,先出队列。我们可以⽤stack类来实现。
对“先进后出”的提取⽅式,就是我们学的“栈”。尝试去想⼀⼝井,然后你开始“落井下⽯”,当把井填满的时候,你⼜开始从井⾥往外拿(有点像撑得),你先拿到的是最后放进去的那个⼤⽯头,最后拿完了,才能拿到你最开始丢下去的基⽯。我们可以⽤queue类来实现。
上⾯说了,减少记忆量,我们都不⽤,我们⽤⼀个结构实现上⾯两个功能——LinkedList。
LinkedList是个双向链表。
来看下怎样定义⼀个LinkedList对象:
LinkedList <Integer> l = new LinkedList <Integer>()
<>内的内容为list中元素的类型,还可以是⾃定义的类型,很强⼤。
对象的add⽅法往list中加⼊数据。这个⽅法可以模拟数据进栈或者进队的过程,那么怎样模拟队列或栈的取出过程呢。
⽤list对象的removeLast⽅法,这个⽅法删除list的最后⼀个数据并将其返回。
对于队列数据取出的模拟,估计也想到了,对应的removeFirst⽅法,删除list第⼀个数据并将其返回,也就是先进先出。
public static void stack(){
LinkedList <Integer> l = new LinkedList <Integer>();
l.add(1);
l.add(2);
l.add(3);
System.out.veLast());
System.out.println(l);
}
public static void queue(){
LinkedList <Integer> l = new LinkedList <Integer>();
l.add(1);
太湖水污染l.add(2);
l.add(3);
System.out.veFirst());
System.out.println(l);
}
模拟下栈和队列:
public static void main(String[] args) {
stack();
queue();
}
结果:
接下来我们来说下对于键值对数据怎样存储,提取的时候⽐较⽅便,数组当然可以。但是我们可以尝试着⽤map,⽤完之后,再存储键值对的时候你就不会想起数组了。
map有两个⼦类,hashMap和treeMap。为了减少记忆量,简单了解下,treeMap会对key排序,⽽hashMap的速度较快。所以如果你需要排序,⽤tree。只是存进去拿出来,⽤hash就可以。
How to define a object(和上⾯的如出⼀辙):
Map <String, Integer> map = new HashMap<String, Integer>();
How to put data in map?
松崖别业图额,题⽬就是答案,⽤put⽅法就⾏。
How to get data from map?
同上,⽤get就⾏。
public static void hashMap(){
Map <String, Integer> map = new HashMap<String, Integer>();
map.put("English", 80);
map.put("Math", 90);
map.put("Compute", 100);
System.out.println(map.keySet()); //.getClass() 同type
配合力System.out.("Compute"));
System.out.("sad")); //return null
System.out.println(map);
}
⽤put⽅法把键值对放进map,通过get(key)取出,那么如果key不存在呢。它会返回null,别担⼼,不会抛出异常导致程序崩溃。
另外有个⼩技巧,map对象的keySet⽅法,可以返回map⾥的所有key值,类⽐也会想到,它还有个valueSet⽅法,不需解释了。
来看下结果:
这⾥写个怎样循环遍历⼀个个取出key值或者value值的⼩技巧(所有序列结构的遍历都可以使⽤这种⽅法,⽐起传统的for循环标准语句,⾼级了⼀些。会让别⼈对你发出“XX”的感叹。):
for(String s: map.keySet()){
System.out.(s));
}
for(Integer i : map.values()){
System.out.println(i);
}
回去我们看下treeMap,还吃栗⼦吗?吃吧,拿都拿来了:
public static void treeMap(){
Map <String, Integer> map = new TreeMap<String, Integer>();
map.put("English", 80);
map.put("Math", 90);
map.put("Compute", 100);
System.out.println(map);
}
基本上没有改变什么,就连put的顺序都是⼀样的。猜猜看最后的结果会是怎样,那⼏个科⽬是否还深爱着对⽅。
有看出什么不同吗?hashMap的结果:
You are right,它对key按字母顺序排序了,这就是区别了。
最后我们讲下数据去重,很多数据⾥⾯有重复值,⽽有些操作我们不需要计数,只想得到那些不同的值。⼀般情况下我们可能会⼀个个判断,看看这个值是否在我的数组⾥⾯,如果没有就放进去,有就
丢掉。也⾏,但其实我们⽆论是学习数学还是计算机,我们都知道“集合”这个东西的⼀个重要特性就是不能含有相同元素。所以我们根本不⽤考虑,把所有的数据不加判断的⼀股脑放进set⾥⾯让它⾃⼰去重就完事了。这样你就可以在别⼈还⼀个个判断的时候,说句:“我好了,你们呢?”
去重后,我们⼀个强转list,就⼜回到了我们熟悉的领域,⾃⼰的地盘,直接可以使⽤了呀。
咳咳,你知道我下⾯要说啥......
public static void hashSet(){
Set <Integer> s = new HashSet<Integer>();
s.add(3);
石大科技
s.add(2);
s.add(1);
s.add(3);
s.add(4);
System.out.println(s);
System.out.Class());
先烈路LinkedList <Integer> l = new LinkedList<Integer>(s);
System.out.println(l);
System.out.Class());
}
结果:
我们已经完成去重了,我们做了啥?把数据放进set,然后转成list。我好了,你们呢。
同样的set有hashSet还有treeSet,我查到的是treeSet会对元素排序,不过我这⾥看来hashSet也对元素排了序。我们并没有按1、2、3、4的顺序add,但还是很⼯整。hash可能看tree不顺眼了吧,它可能想告诉tree:“我不但能做你的⼯作,还⽐你快!”
让我们祝福hash。
That's all. 这个系列不会再写了,我会时间把前⾯的⽂章好好改改。有撰写不妥之处,望不惜吝教指出。

本文发布于:2024-09-22 01:25:37,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/106408.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   时候   模拟   队列
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议