说是算法优化,基本上是在吹牛,只不过算是记录下,我写代码时候的思路。毕竟还是小菜鸟。
我要开一个party,与会者都是情侣,但是情侣并不是一起过来的,而是有先有后,但是每位与会者来的时候都拿着一束鲜花,第一件事情就是送给自己的伴侣。
设计一个算法,最高效率的解决这个事情。
最开始的时候,是这样的。
import java.util.ArrayList; import java.util.List; public class TestParty { List<Person> persons = new ArrayList<Person>(); void onPersonArrived(Person A){ persons.add(A); String name = getGirlFriendName(); for(Person p:persons){ if(p.getName().equals(name)){ sendFlow(p); } } } private void sendFlow(Person p) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return "小丽"; } }
相当于A来了以后,挨个问所有到场的人的名字,看看跟自己的女朋友名字一样不一样,如果一样,就把花送给他。
但是很明显,挨个问是非常没有效率的事情。
所以应该用hashmap,所以代码变成这样。
import java.util.HashMap; import java.util.Map; public class TestHashMapParty { private Map<String,Person> persons = new HashMap<String,Person>(); void onPersonArrived(Person A){ persons.put(getPositionByName(A.getName()), A); String name = getGirlFriendName(); Person B = persons.get(getPositionByName(name)); if(B != null){ sendFlow(B); } } private void sendFlow(Person b) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return null; } private String getPositionByName(String name) { // TODO Auto-generated method stub return null; } }
这次我们的party组织的更好了,每个人来了之后,会从组织者那里根据自己名字拿到自己安排的座位,然后坐上去,同时,还可以根据女朋友的名字拿到女朋友的座位,然后直接走过去,把花送给她。
故事到这里讲完了吗?对于一个人来说,故事已经结束了,但是对于代码来说,还没有。
代码里有一个方法叫
private String getPositionByName(String name) { // TODO Auto-generated method stub return null; }
我在这里没有实现,但是如果具体实现的话,应该是某种算法,或者数据库记录。因为java对象所有的记忆功能都是我们代码赋予的。如果我们没有赋予它记住自己女朋友的功能,那么每次给女朋友送花的时候,都需要调用一次这个方法,事实上也是低效的。
于是贴出最终的代码。Person.java
public class Person { private String name; private String position; private String girlFriendPosition; String getName(){ return name; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public String getGirlFriendPosition() { return girlFriendPosition; } public void setGirlFriendPosition(String girlFriendPosition) { this.girlFriendPosition = girlFriendPosition; } public void setName(String name) { this.name = name; } }
TestHashMap.java
import java.util.HashMap; import java.util.Map; public class TestHashMapParty { private Map<String,Person> persons = new HashMap<String,Person>(); void onPersonArrived(Person A){ String position = getPositionByName(A.getName()); persons.put(position, A); A.setPosition(position); A.setGirlFriendPosition(getPositionByName(getGirlFriendName())); Person B = persons.get(A.getGirlFriendPosition()); if(B != null){ sendFlow(B); } } private void sendFlow(Person b) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return null; } private String getPositionByName(String name) { // TODO Auto-generated method stub return null; } }
我们给了Person两个成员变量,专门用来记住自己的位置和女朋友的位置。这样效率应该是最高了。但是比较繁琐。
终极优化应该是。
MyMap = new MyMap(); B = map.get(A); A = map.get(B);
现在的HashMap是没办法处理null 的,因为A和B不是同时来,所以现在的HashMap如果想用A做B的key,B做A的key会遇到NULL问题。
至于MyMap怎么写。以后再研究吧。
相关推荐
liballoc 中的 hashmap 默认使用 SipHash,它并没有我们想要的那么快。在编译器中,我们并不真正担心 DOS 尝试,因此我们使用快速非加密哈希。 这与 Firefox 使用的算法相同——它是一种不基于任何广为人知的算法的...
list 转化成hashmap例子 java程序
这篇集合总结一共包括十二节,介绍了一些接口和实现类的底层源码以及基本的增加、删除元素等的操作(包括List、Map、Set接口、ArrayList、Vector、LinkedList、HashSet、TreeSet、HashMap、TreeMap等实现类)。...
HASHMap迭代集合的例子好用,逻辑算法
HashMap源码实现红黑树添加元素和删除元素
4)打印集合的大小,然后删除集合中的第3个元素,并显示删除元素的内容,然后再打印目前集合中第3个元素的内容,并再次打印集合的大小。 3、编写程序练习Map集合的基本使用: 1)创建一个只能容纳String对象的...
java 集合 优化 菜单,本人所总结,都是项目中所用道德,
在本篇文章中小编给大家分享了关于HashMap和List遍历方法及如何遍历删除元素知识点总结,需要的朋友们参考下。
经典讲解List和ArrayList和Vector和HashTable和HashMap区别
delphi hashmap集合 支持delphi5, delphi6, delphi7, delphi2010
树tree、动态数组dyArray、hashMap、拼图算法.zip
集合,ArrayList,hashmap
ArrayList集合与HashMap的扩容原来.docx
1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中, 放着的就是Map中的某一对key-value; 2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、...
java 集合和泛型 1. Map接口 2. HashMap底层实现 3. Hash数据结构和算法 4. 红黑树数据结构和算法
map接口是一个双边队列,拥有key,value两个属性,其中key在存储的集合中不允许重复,value可以重复。 HashMap特点 存储结构在jdk1.7当中是数组加链表的结构,在jdk1.8当中改为了数组加链表加红黑树的结构。 HashMap...
工程(VS2013)主要构造了HashMap和list集合,通过查找集合中的元素对两者的效率进行比较
在jdk1.8中对hashMap等map集合的数据结构优化。hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode ...
这个是利用iterator迭代器来对hashMap进行迭代元素,数据java基础的内容。有兴趣的朋友可以看看。
hashMap基本工作原理,图解分析,基础Map集合