目录标题
- 一、题目1
- 二、题目2
- 三、总结
一、题目1
.有一个类 Pair,含有两个成员 a 和 b,如果两个 Pair 对象的 a 和 b 都相等,则认为
这两个对象相等。
@Data
public class Pair {
Integer a;
Integer b;
}
有两个 List, List l1, List l2, 写一个函数,求这两个 List 的交集,即返回这两个
List 当中相同的元素,放在一个集合中返回。注意,请尽量写准确清晰,按照可执行的 Java
代码写
我的答案
publicset<Pair>fn(List<Pair>l1,List<Pair>l2){set<Pair>resultSet=newHashSet<>();l1.stream().map(item=>{for(Pairinner:l2){//Integer转换比较可能有误if(inner.getA().equals(item.getA())&&iner.getB().equals(item.getB()){resultSet.add(inner);}}})returnresultSet;}AI修正后代码
importjava.util.*;importjava.util.stream.Collectors;publicSet<Pair>fn(List<Pair>l1,List<Pair>l2){Set<Pair>resultSet=newHashSet<>();for(Pairp1:l1){for(Pairp2:l2){if(p1.getA().equals(p2.getA())&&p1.getB().equals(p2.getB())){resultSet.add(p1);// 可以添加p1或p2,因为它们相等break;// 找到后跳出内层循环}}}returnresultSet;}标准答案(把我的原来的方法效率是O(n²),使用HashSet可以优化到O(n)。)
使用Stream API的简洁写法:
publicSet<Pair>fn(List<Pair>l1,List<Pair>l2){Set<Pair>set1=newHashSet<>(l1);returnl2.stream().filter(set1::contains).collect(Collectors.toSet());}注意:
要使HashSet.contains()正常工作,必须在Pair类中正确重写equals()和hashCode()方法:
@DatapublicclassPair{Integera;Integerb;@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Pairpair=(Pair)o;returnObjects.equals(a,pair.a)&&Objects.equals(b,pair.b);}@OverridepublicinthashCode(){returnObjects.hash(a,b);}}二、题目2
有如下数据库表,是学生的各科成绩表格
学号 姓名 科目 分数
1 张三 语文 80
1 张三 数学 90
1 张三 英语 70
2 李四 语文 60
2 李四 数学 80
2 李四 英语 90
3 王五 语文 70
3 王五 数学 60 … … … … 问题:
1、 撰写建表 SQL 语句,建立学生成绩表
2、 撰写查询 SQL 语句,输出所有科目平均分大于 80 分的学生
3、 撰写查询 SQL 语句,输出语文成绩比数学成绩好的学生
我的答案
//要加判断或者覆盖create table table{column idvarchar2(16)not NULL primary key,Columnnamevarchar2(16)defaultnull,Columnsubjectvarchar2(16)defaultnull,Columnscorenumber(1000,2)defaultnull,}Selectname from(selectsum(score)/3total,t1.name from table t1 where subject=‘语文’ or subject=‘数学’or subject=‘英语’ groupBy t1.name)t2 where t2.total>80;Selectname from((select t1.score,t1.name from table where subject=‘语文’)t1 left join(select t1.score,t1.name from table where subject=‘数学’)t2)t3 where t1.score>t2.score;错误分析
- 建表语句答案
CREATE TABLE student_score(idVARCHAR2(16)NOT NULL, name VARCHAR2(16), subject VARCHAR2(16), score NUMBER(5,2), PRIMARY KEY(id, subject));2.输出所有科目平均分大于80分的学生
(竟然忘了还有 having avg )
SELECT name FROM student_score GROUP BY name HAVING AVG(score)>80;3.输出语文成绩比数学成绩好的学生
SELECT c.name FROM student_score c JOIN student_score m ON c.name=m.name WHERE c.subject='语文'AND m.subject='数学'AND c.score>m.score;SELECT c.name FROM student_score c LEFT JOIN student_score m ON c.name=m.name AND m.subject='数学'WHERE c.subject='语文'AND(c.score>m.score OR m.score IS NULL);三、总结
功能 思路都是正确的,但是太复杂,在word里面写代码不容易啊(没有提示)
菜就得多练