java 实现朋友网

昨天看到有个说小米的面试题,朋友网,今天试着写了一下,请大家过目:

/**
 * 
 */
package com.bus.cxming.group;

import java.util.HashSet;
import java.util.Set;

/**
 * @author lenovo
 *
 */
public class Group
{
	private Set<String> realationShipSet = new HashSet<String>();
	
	public Set<String> getRealationShipSet()
	{
		return realationShipSet;
	}

	public void setRealationShipSet(Set<String> realationShipSet)
	{
		this.realationShipSet = realationShipSet;
	}

	private String firstChild;
	
	public String getFirstChild()
	{
		return firstChild;
	}

	public void setFirstChild(String firstChild)
	{
		this.firstChild = firstChild;
	}

	public String getLastChild()
	{
		return lastChild;
	}

	public void setLastChild(String lastChild)
	{
		this.lastChild = lastChild;
	}

	private String lastChild;
	
	public boolean equals(Object obj)
	{
		if(obj instanceof Group )
		{
			Group objGroup = (Group)obj;
			
			return firstChild.equals(objGroup.getFirstChild()) && lastChild.equals(objGroup.getLastChild());
		}
		return false;
		
	}
	
	public int hashCode()
	{
		return firstChild.hashCode() + lastChild.hashCode();
		
	}
	
	public boolean isContains(Group group)
	{
		if(this.firstChild.equals(group.getFirstChild()) 
				|| this.lastChild.equals(group.getLastChild())
				|| this.firstChild.equals(group.getLastChild())
				|| this.lastChild.equals(group.getFirstChild())
				|| realationShipSet.contains(group.getFirstChild())
				|| realationShipSet.contains(group.getLastChild()))
		{
			return true; 
		}
		return false;
	}
	
	public void addFriend(Group group)
	{
		realationShipSet.add(this.firstChild);
		realationShipSet.add(this.lastChild);
		realationShipSet.add(group.getFirstChild());
		realationShipSet.add(group.getLastChild());
	}
	
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		
		for(String str : realationShipSet)
		{
			sb.append(str);
		}
		return sb.toString();
	}
	
}

抽象出一个group类,有个属性HashSet,防止出现重复的数据,有个方法isContains(),判断是否是朋友,

 

/**
 * 
 */
package com.bus.cxming.group.ruleBS;

import java.util.List;

import com.bus.cxming.group.Group;

/**
 * @author lenovo
 *
 */
public interface GroupRuleBS
{
	 List<Group> convertArrayToList(String[][] friendArray);
	 
	 void findGroup(List<Group> groupList);
}
 

有一个接口提供将数组转换成Group对象和找朋友的方法,我们看一下他的实现:

/**
 * 
 */
package com.bus.cxming.group.ruleBSImpl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.bus.cxming.group.Group;
import com.bus.cxming.group.ruleBS.GroupRuleBS;

/**
 * @author lenovo
 *
 */
public class GroupRuleBSImpl implements GroupRuleBS
{
	private List<Group> groupResult = new ArrayList<Group>();
	
	public List<Group> getGroupResult()
	{
		return groupResult;
	}

	@Override
	public List<Group> convertArrayToList(String[][] friendArray)
	{
		List<Group> everyGroupList = new ArrayList<Group>();
		Group group = null;
		for(int i =0,len = friendArray.length ;i<len;i++)
		{
			group = new Group();
			group.setFirstChild(friendArray[i][0]);
			group.setLastChild(friendArray[i][1]);
			everyGroupList.add(group);
		}
		return everyGroupList;
	}

	@Override
	public void findGroup(List<Group> groupList)
	{
		Group group = groupList.get(0);
		List<Integer> indexList = new ArrayList<Integer>();
		List<Group> leftGroupList = findFriends(group, groupList, indexList);
		if(!isEmpty(leftGroupList))
		{
			findGroup(leftGroupList);
		}
	}
	
	private List<Group> findFriends(Group group,List<Group> groupList,List<Integer> indexList)
	{
		if(!isEmpty(indexList))
		{
			List<Group> newGroupList = new ArrayList<Group>();
			for(Integer i : indexList)
			{
				newGroupList.add(groupList.get(i));
			}
			groupList.removeAll(newGroupList);
		}
		indexList.clear();
		for(int i = 0 ,len= groupList.size();i<len;i++)
		{
			if(group.isContains(groupList.get(i)))
			{
				group.addFriend(groupList.get(i));
				indexList.add(i);
			}
		}
		if(!isEmpty(indexList))
		{
			findFriends(group,groupList,indexList);
		}
		else
		{
			groupResult.add(group);
			return groupList;
		}
		return groupList;
	}
	
	private boolean isEmpty(Collection<?> col)
	{
		return col == null || col.isEmpty();
	}

}

思路相信大家看一下就知道了,主要思路还是递归,运用集合的一些方法,其中的一些方法是没有必要的,比如isEmpty()
,这个方法在CollectionUnits中提供了。

 

下面看一下测试类:

/**
 * 
 */
package com.bus.cxming.group.test;

import java.util.List;

import com.bus.cxming.group.Group;
import com.bus.cxming.group.ruleBSImpl.GroupRuleBSImpl;

/**
 * @author lenovo
 *
 */
public class GroupTest
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
			String[][] friendArray={{"1","2"},{"2","3"},{"4","5"},{"6","7"},{"5","6"},{"4","3"}}; 
			
			GroupRuleBSImpl groupRuleBSImpl = new GroupRuleBSImpl();
			
			List<Group> groupList = groupRuleBSImpl.convertArrayToList(friendArray);
			
			groupRuleBSImpl.findGroup(groupList);
			
			List<Group> resultGroupList = groupRuleBSImpl.getGroupResult();
			
			for(Group group :resultGroupList )
			{
				System.out.println(group);
			}
	}

}

结果大家可以试验一下,我这边简单的测试应该是没有问题的,欢迎大家来挑刺。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值