Java最全java分库关联查询的工具,我的支付宝3面+美团4面+拼多多四面

最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析

最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

private String shopName;

/**

  • 订单列表 (一个门店关联N个订单 一对多)

  • */

private List orderFormList;

}

辅助工具函数:

/***

  • 将通过keyName获得对应的bean对象的get方法名称的字符串

  • @param keyName 属性名

  • @return 返回get方法名称的字符串

*/

private static String makeGetMethodName(String keyName){

//:::将第一个字母转为大写

String newKeyName = transFirstCharUpperCase(keyName);

return “get” + newKeyName;

}

/***

  • 将通过keyName获得对应的bean对象的set方法名称的字符串

  • @param keyName 属性名

  • @return 返回set方法名称的字符串

*/

private static String makeSetMethodName(String keyName){

//:::将第一个字母转为大写

String newKeyName = transFirstCharUpperCase(keyName);

return “set” + newKeyName;

}

/**

  • 将字符串的第一个字母转为大写

  • @param str 需要被转变的字符串

  • @return 返回转变之后的字符串

*/

private static String transFirstCharUpperCase(String str){

return str.replaceFirst(str.substring(0, 1), str.substring(0, 1).toUpperCase());

}

/**

  • 判断当前的数据是否需要被转换

  • 两个列表存在一个为空,则不需要转换

  • @return 不需要转换返回 false,需要返回 true

  • */

private static boolean needTrans(List beanList,List dataList){

if(listIsEmpty(beanList) || listIsEmpty(dataList)){

return false;

}else{

return true;

}

}

/**

  • 列表是否为空

  • */

private static boolean listIsEmpty(List list){

if(list == null || list.isEmpty()){

return true;

}else{

return false;

}

}

/**

  • 将javaBean组成的list去重 转为map, key为bean中指定的一个属性

  • @param beanList list 本身

  • @param keyName 生成的map中的key

  • @return

  • @throws Exception

*/

public static Map<String,Object> beanListToMap(List beanList,String keyName) throws Exception{

//:::创建一个map

Map<String,Object> map = new HashMap<>();

//:::由keyName获得对应的get方法字符串

String getMethodName = makeGetMethodName(keyName);

//:::遍历beanList

for(Object obj : beanList){

//:::如果当前数据是hashMap类型

if(obj.getClass() == HashMap.class){

Map currentMap = (Map)obj;

//:::使用keyName从map中获得对应的key

String result = (String)currentMap.get(keyName);

//:::放入map中(如果key一样,则会被覆盖去重)

map.put(result,currentMap);

}else{

//:::否则默认是pojo对象

//:::获得get方法

Method getMethod = obj.getClass().getMethod(getMethodName);

//:::通过get方法从bean对象中得到数据key

String result = (String)getMethod.invoke(obj);

//:::放入map中(如果key一样,则会被覆盖去重)

map.put(result,obj);

}

}

//:::返回结果

return map;

}

一对一连接接口定义:

/**

  • 一对一连接 : beanKeyName <—> dataKeyName 作为连接条件

  • @param beanList 需要被存放数据的beanList(主体)

  • @param beanKeyName beanList中连接字段key的名字

  • @param beanModelName beanList中用来存放匹配到的数据value的属性

  • @param dataList 需要被关联的data列表

  • @param dataKeyName 需要被关联的data中连接字段key的名字

  • @throws Exception

*/

public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception { }

如果带入上述一对一连接的例子,beanList是订单列表(List),beanKeyName是订单用于关联用户的字段名称(例如外键“OrderForm.customerID”),beanModelName是用于存放用户类的字段名称(“例如OrderForm.customer”),dataList是顾客列表(List),dataKeyName是被关联数据的key(例如主键"Customer.id")。

一对一连接代码实现:

/**

  • 一对一连接 : beanKeyName <—> dataKeyName 作为连接条件

  • @param beanList 需要被存放数据的beanList(主体)

  • @param beanKeyName beanList中连接字段key的名字

  • @param beanModelName beanList中用来存放匹配到的数据value的属性

  • @param dataList 需要被关联的data列表

  • @param dataKeyName 需要被关联的data中连接字段key的名字

  • @throws Exception

*/

public static void oneToOneLinked(List beanList, String beanKeyName, String beanModelName, List dataList, String dataKeyName) throws Exception {

//:::如果不需要转换,直接返回

if(!needTrans(beanList,dataList)){

return;

}

//:::将被关联的数据列表,以需要连接的字段为key,转换成map,加快查询的速度

Map<String,Object> dataMap = beanListToMap(dataList,dataKeyName);

//:::进行数据匹配连接

   matchedDataToBeanList(beanList,beanKeyName,beanModelName,dataMap);

  }

/**

  • 将批量查询出来的数据集合,组装到对应的beanList之中

  • @param beanList 需要被存放数据的beanList(主体)

  • @param beanKeyName beanList中用来匹配数据的属性

  • @param beanModelName beanList中用来存放匹配到的数据的属性

  • @param dataMap data结果集以某一字段作为key对应的map

  • @throws Exception

*/

private static void matchedDataToBeanList(List beanList, String beanKeyName, String beanModelName, Map<String,Object> dataMap) throws Exception {

//:::获得beanList中存放对象的key的get方法名

String beanGetMethodName = makeGetMethodName(beanKeyName);

//:::获得beanList中存放对象的model的set方法名

String beanSetMethodName = makeSetMethodName(beanModelName);

//:::遍历整个beanList

for(Object bean : beanList){

//:::获得bean中key的method对象

Method beanGetMethod = bean.getClass().getMethod(beanGetMethodName);

//:::调用获得当前的key

String currentBeanKey = (String)beanGetMethod.invoke(bean);

//:::从被关联的数据集map中找到匹配的数据

Object matchedData = dataMap.get(currentBeanKey);

//:::如果找到了匹配的对象

if(matchedData != null){

//:::获得bean中对应model的set方法

Class clazz = matchedData.getClass();

//:::如果匹配到的数据是hashMap

if(clazz == HashMap.class){

//:::转为父类map class用来调用set方法

clazz = Map.class;

}

//:::获得主体bean用于存放被关联对象的set方法

Method beanSetMethod = bean.getClass().getMethod(beanSetMethodName,clazz);

//:::执行set方法,将匹配到的数据放入主体数据对应的model属性中

beanSetMethod.invoke(bean,matchedData);

}

}

}

一对多连接接口定义:

如果带入上述一对多连接的例子,oneDataList是门店列表(List),oneKeyName是门店用于关联订单的字段名称(例如主键“Shop.id”),oneModelName是用于存放订单列表的字段名称(例如"Shop.orderFomrList"),manyDataList是多方列表(List),manyKeyName是被关联数据的key(例如外键"OrderFrom.shopID")。

一对多连接代码实现:

/**

  • 一对多连接 : oneKeyName <—> manyKeyName 作为连接条件

  • @param oneDataList ‘一方’ 数据列表

  • @param oneKeyName ‘一方’ 连接字段key的名字

  • @param oneModelName ‘一方’ 用于存放 '多方’数据的列表属性名

  • @param manyDataList ‘多方’ 数据列表

  • @param manyKeyName ‘多方’ 连接字段key的名字

  • 注意: ‘一方’ 存放 '多方’数据的属性oneModelName类型必须为List

  • @throws Exception

*/

public static void oneToManyLinked(List oneDataList,String oneKeyName,String oneModelName,List manyDataList,String manyKeyName) throws Exception {

if(!needTrans(oneDataList,manyDataList)){

return;

}

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

0题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

[外链图片转存中…(img-pBgKJXIT-1715310070863)]

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

[外链图片转存中…(img-3TdNXzvy-1715310070864)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现正四面体的透视投影动态隐线算法,需要以下步骤: 1. 定义正四面体的顶点坐标和连接关系。 2. 根据相机位置和视角计算出每个顶点在屏幕上的坐标。 3. 对于每个,判断其是否朝向相机,如果是则不需要绘制,否则需要进行透视投影。 4. 对于每个,判断其是否需要显示边界,如果需要则进行动态隐线算法。 下是一个简单的 Java 代码实现: ```java import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; public class Tetrahedron extends JPanel implements ActionListener { private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int SIZE = 100; private static final int[] X = {0, 0, SIZE/2, -SIZE/2}; private static final int[] Y = {0, SIZE, -SIZE/2, -SIZE/2}; private static final int[][] Z = {{0, SIZE/2, SIZE/2, SIZE/2}, {0, 0, SIZE/2, -SIZE/2}, {0, 0, -SIZE/2, SIZE/2}, {0, -SIZE, 0, 0}}; private static final int[][] CONNECT = {{0, 2}, {0, 3}, {0, 1}, {1, 2}, {1, 3}, {2, 3}}; private double angle = 0; private Timer timer = new Timer(30, this); public Tetrahedron() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); timer.start(); } @Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.clearRect(0, 0, WIDTH, HEIGHT); // calculate vertex coordinates double sin = Math.sin(angle); double cos = Math.cos(angle); int[][] coords = new int[4][2]; for (int i = 0; i < 4; i++) { int x = X[i]; int y = (int)(Y[i]*cos - Z[i][0]*sin); int z = (int)(Y[i]*sin + Z[i][0]*cos); coords[i][0] = x; coords[i][1] = (int)(y*cos - z*sin); } // draw edges g2d.setColor(Color.BLACK); for (int[] conn : CONNECT) { int x1 = coords[conn[0]][0] + WIDTH/2; int y1 = coords[conn[0]][1] + HEIGHT/2; int x2 = coords[conn[1]][0] + WIDTH/2; int y2 = coords[conn[1]][1] + HEIGHT/2; if (isVisible(x1, y1, x2, y2)) { g2d.drawLine(x1, y1, x2, y2); } } angle += 0.05; } private boolean isVisible(int x1, int y1, int x2, int y2) { boolean visible = true; for (int[] conn : CONNECT) { int x3 = X[conn[0]]; int y3 = Y[conn[0]]; int z3 = Z[conn[0]][0]; int x4 = X[conn[1]]; int y4 = Y[conn[1]]; int z4 = Z[conn[1]][0]; if (isIntersecting(x1, y1, x2, y2, x3, y3, z3, x4, y4, z4)) { visible = false; break; } } return visible; } private boolean isIntersecting(int x1, int y1, int x2, int y2, int x3, int y3, int z3, int x4, int y4, int z4) { double t = ((x3-x1)*(y4-y3) - (y3-y1)*(x4-x3))/((x2-x1)*(y4-y3) - (y2-y1)*(x4-x3)); double s = ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1))/((x2-x1)*(y4-y3) - (y2-y1)*(x4-x3)); if (t >= 0 && t <= 1 && s >= 0 && s <= 1) { int z1 = (int)((1-t)*z3 + t*z4); int z2 = (int)((1-s)*z3 + s*z4); if (z1 < z2) { return true; } } return false; } public static void main(String[] args) { JFrame frame = new JFrame("Tetrahedron"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new Tetrahedron()); frame.pack(); frame.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { repaint(); } } ``` 在这个代码中,我们首先定义了正四面体的顶点坐标和连接关系,然后在 `paintComponent` 方法中计算出每个顶点在屏幕上的坐标。接着,我们绘制正四面体的边界,对于每条边,我们判断其是否需要进行透视投影和动态隐线算法。最后,在 `actionPerformed` 方法中更新角度并重绘图形。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值