zoukankan      html  css  js  c++  java
  • 内部元素一一相应的集合的算法优化,从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怎么写。以后再研究吧。


  • 相关阅读:
    wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地
    D3
    java/javac命令行如何同时引用多个包;错误 TypeError: 'JavaPackage' object is not callable 的含义
    在python里调用java的py4j的使用方法
    如何实现一个网站多个域名:目的是为了一个共同的前端+多个多语言实现的后端
    jvm内存回收机制
    xcode卸载后导致git/make异常
    TOC工具Table of content
    java.lang.IllegalAccessException;java.lang.Class.newInstance
    mac下xampp的使用
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3747817.html
Copyright © 2011-2022 走看看