内部元素一一对应的集合的算法优化,从list到hashmap
2014-05-14 11:03
417 查看
说是算法优化,基本上是在吹牛,只不过算是记录下,我写代码时候的思路。毕竟还是小菜鸟。
我要开一个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.javapublic 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怎么写。以后再研究吧。
我要开一个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.javapublic 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怎么写。以后再研究吧。
相关文章推荐
- 内部元素一一相应的集合的算法优化,从list到hashmap
- HashMap的元素hash散列均匀必要性及算法优化
- 遍历list集合,把每个元素的值对应的计算结果展示在页面上
- c#中List <int[]>集合添加和查找元素
- 如何使用反射确定一个属性是否实现了IList接口,如何确定元素量为空的集合的元素类型。
- 集合之LinkedList、Vector、HashMap、Hashtable
- list 删除某个元素后 地址不释放其它值不会填充上来 这时候对应乱码
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- 从含有m个元素的集合中任选n个的算法
- 从一道简单的题看算法优化 ZOJ PAT Course List for Student
- [Python]两个list对应元素操作(相减)
- 将任意集合, 平分成若干份算法, 有待优化
- Java 集合(ArrayLsit,LinkedList,Vector,HashMap--HashTable)
- Java中如何循环删除一个集合(如List)中的多个元素
- 海量数据库的查询优化及分页算法方案集合1/2第1/2页
- 利用最小元素找第二小元素(算法有待进一步优化)
- c#中List <int[]>集合添加和查找元素
- Java对集合的遍历 List ArryList HashMap LinkedMap JSON 数组等
- java 集合(List)元素分组
- 在list集合中对元素进行分组