【笔试面试真题】代码实现SQL语句(Hashmap)

题目描述: 名为user的表结构有user_id(varchar),user_name(varchar)两个属性,理解以下SQL语句并用代码实现其原理:
SELECT COUNT(user_name)
AS count
FROM(
SELECT user_name
FROM user a
GROUP BY user_name
HAVING COUNT(DISTINCT user_id)>=2
)b;

用例输入: 一个数字表示插入的数据总数n,接下来n行输入为user_id与user_name,中间用空格隔开,如:
3
001 大娃
002 二娃
003 三娃

期望输出: 0

题意解析: 解题关键点在于对SQL语句的理解,几个难点:
COUNT(user_name)——返回user_name列的数目;
GROUP BY——相同的user_name值为一组;
HAVING——与GROUP BY一起使用,作为分组后的条件查询语句;
DISTINCT user_id——对user_id去重处理;

原题给的用例太过于简单,我们可以把数据稍微添加一点:
在这里插入图片描述
然后先执行SELECT user_name FROM user a GROUP BY user_name HAVING COUNT(DISTINCT user_id)>=2
在这里插入图片描述
那么很显然最后的结果就是
在这里插入图片描述
整个SQL语句的意思就是查找重名用户的个数,这里我是使用JAVA语言实现的,主要使用了Hashmap,以user_name为key,人数为value,这样让逻辑简化了,带来的弊端就是如果输入了相同的user_id值无法实现SQL语句里的DISTINCT功能,不过这次题干里保证了输入合法,就偷了一个懒。这样存储的方便之处就是直接用value存储同名人数,只需遍历一次map就可以直接得到结果。

代码实现:

import java.util.*;

public class Test1 {
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	int index = sc.nextInt();
    	HashMap<String, Integer> map = new HashMap<String, Integer>();
    	while(index-- > 0) {
    		String no = sc.next();
    		String name = sc.next();
    		if(!map.containsKey(name)) {
    			map.put(name, 1);
    		}else {
    			map.put(name, map.get(name)+1);
    		}
    	}
    	int sum = 0;
    	Iterator iterator = map.keySet().iterator();
    	while(iterator.hasNext()) {
    		String key = (String) iterator.next();
    		int value = map.get(key);
    		if(value >= 2) {
    			sum++;
    		}
    	}
    	System.out.println(sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值