`
小码哥BASE64
  • 浏览: 122129 次
社区版块
存档分类
最新评论

内部元素一一对应的集合的算法优化,从list到hashmap

阅读更多

说是算法优化,基本上是在吹牛,只不过算是记录下,我写代码时候的思路。毕竟还是小菜鸟。

我要开一个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怎么写。以后再研究吧。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics