数据结构-表.png

零、前言:

1.本文的姊妹篇:看得见的数据结构Android版之表的数组实现(数据结构篇)
2.希望你可以和我在Github一同见证:DS4Android的诞生与成长,欢迎star
3.激动人心的时刻到了,要画图了,铅笔、草稿纸、饮料、花生米准备好,现在开始了

先留图镇楼:

表结构的常规操作

表结构的常规操作.gif

数组的扩容与缩容

数组的扩容与缩容


一、先绘制操作界面:

1.自定义View:ArrayView

准备一个主画笔和主路径并确定一些常量
然后用analyze包绘制封装好的网格和坐标系以便查看

/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:8:01<br/>* 邮箱:1981462002@qq.com<br/>* 说明:数组实现表结构---测试视图*/
public class ArrayView<E> extends View {private Point mCoo = new Point(200, 150);//坐标系private Picture mCooPicture;//坐标系canvas元件private Picture mGridPicture;//网格canvas元件private Path mPath;//主路径private Paint mPaint;//主画笔private static final int OFFSET_X = 10;//X空隙private static final int OFFSET_Y = 60;//Y空隙private static final int OFFSET_OF_TXT_Y = 10;//文字的偏移private static final int BOX_RADIUS = 10;//数组盒子的圆角public ArrayView(Context context) {this(context, null);}public ArrayView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();//初始化}private void init() {//初始化主画笔mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.BLUE);mPaint.setStrokeWidth(5);mPaint.setTextAlign(Paint.Align.CENTER);mPaint.setTextSize(50);//初始化主路径mPath = new Path();//辅助线mCooPicture = HelpDraw.getCoo(getContext(), mCoo,false);//坐标系:无文字mGridPicture = HelpDraw.getGrid(getContext());//网格}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);HelpDraw.draw(canvas, mGridPicture);canvas.save();canvas.translate(mCoo.x, mCoo.y);//画布移到坐标原点//TODO drawcanvas.restore();HelpDraw.draw(canvas, mCooPicture);}
}
坐标系.png


2.把后面要用的画笔准备一下:
private void init() {//初始化主画笔mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(Color.BLUE);mPaint.setStrokeWidth(5);mPaint.setTextAlign(Paint.Align.CENTER);mPaint.setTextSize(50);//初始化主路径mPath = new Path();//初始化文字画笔mTxtPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTxtPaint.setColor(Color.WHITE);mTxtPaint.setTextAlign(Paint.Align.CENTER);mTxtPaint.setTextSize(40);//初始化路径画笔mPathPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPathPaint.setColor(Color.GRAY);mPathPaint.setStyle(Paint.Style.STROKE);mCooPicture = HelpDraw.getCoo(getContext(), mCoo,false);mGridPicture = HelpDraw.getGrid(getContext());//初始化圆球按钮画笔mCtrlPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mCtrlPaint.setColor(Color.RED);mCtrlPaint.setTextAlign(Paint.Align.CENTER);mCtrlPaint.setTextSize(30);
}
3.准备小球的信息

你也可以将这些信息封装成一个bean,这里为了bean太多容易混淆,用几个数组记录信息

    private static final Point[] CTRL_POS = new Point[]{//控制按钮的点位new Point(-100, 100),//添加new Point(-100, 300),//更新new Point(-100, 500),//查看new Point(-100, 700),//删除new Point(700, -70),//定点添加new Point(700 + 300, -70),//定值查询new Point(700 + 300 * 2, -70),//定点删除new Point(700 + 300 * 3, -70),//清除};private static int[] CTRL_COLOR = new int[]{//控制按钮的颜色0xff1EF519,//添加0xff2992F2,//更新0xffB946F4,//添加0xffF50C0C,//删除0xff1EF519,//定点添加0xffB946F4,//定值查询0xffF50C0C,//定点删除0xffF46410,//清除};private static final String[] CTRL_TXT = new String[]{//控制按钮的文字"添加",//添加"更新",//更新"查寻",//添加"删除",//删除"定点+",//定点添加"值查",//定值查询"定点-",//定点删除"清空",//清除按键};private static final int CTRL_RADIUS = 50;//控制按钮的半径

3.绘制小圆球:

人狠话不多----一个循环,一波带走

/*** 控制面板--圆球** @param canvas 画布*/
private void ctrlView(Canvas canvas) {for (int i = 0; i < CTRL_POS.length; i++) {mCtrlPaint.setColor(CTRL_COLOR[i]);canvas.drawCircle(CTRL_POS[i].x, CTRL_POS[i].y, CTRL_RADIUS, mCtrlPaint);canvas.drawText(CTRL_TXT[i], CTRL_POS[i].x, CTRL_POS[i].y + OFFSET_OF_TXT_Y, mTxtPaint);}
}
绘制控制按钮.png

这就...画完了?对...这就画完了


三、小球的点击事件(区域判断)

1.有请吾王麾下十二战神之一:审断之神(JudgeMan.java)
/*** 审断之神能力一:第一形态:区域限定----判断出是否在某点的半径为r圆范围内** @param srcX 目标点X* @param srcY 目标点Y* @param dstX 主动点X* @param dstY 主动点Y* @param r    半径区域* @return 是否在区域内*/
public static boolean judgeCircleArea(float srcX, float srcY, float dstX, float dstY, float r) {return disPos2d(srcX, srcY, dstX, dstY) <= r;
}/*** 审断之神被动能力一:两点间距离函数* @param srcX 目标点X* @param srcY 目标点Y* @param dstX 主动点X* @param dstY 主动点Y* @return 两点间距离函数*/
private static float disPos2d(float srcX, float srcY, float dstX, float dstY) {return (float) Math.sqrt((srcX - dstX) * (srcX - dstX) + (srcY - dstY) * (srcY - dstY));
}
判断dst点是否在src周围r的圆内.png


2.先写一下回调监听接口:OnCtrlClickListener

兵马未动,粮草先行,有接口好办事

/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:10:17<br/>* 邮箱:1981462002@qq.com<br/>* 说明:控操作接口*/
public interface OnCtrlClickListener<T> {/*** 添加时回调* @param view*/void onAdd(T view);/*** 定点添加时回调* @param view*/void onAddByIndex(T view);/*** 移除时回调* @param view*/void onRemove(T view);/*** 定点移除时回调* @param view*/void onRemoveByIndex(T view);/*** 设置时回调* @param view*/void onSet(T view);/*** 查询时回调* @param view*/void onFind(T view);/*** 定值查询时回调* @param view*/void onFindByData(T view);/*** 清空时回调* @param view*/void onClear(T view);
}
3.触摸事件获取主动点:

还是一个for循环一波带走----(mark:一开始我也是一个一个if,然后发现可以优化,才变得优雅的)
也许无法一步想到位,但可以先实现,然后再优化,我就喜欢这种一波带走的感觉
注意点:downX和downY要相对于canvas的坐标系,所以要偏移一下

private OnCtrlClickListener<ArrayView<E>> mOnCtrlClickListener;//监听器
public void setOnCtrlClickListener(OnCtrlClickListener<ArrayView<E>> onCtrlClickListener) {mOnCtrlClickListener = onCtrlClickListener;
}@Override
public boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:float downX = event.getX() - mCoo.x;float downY = event.getY() - mCoo.y;for (int i = 0; i < CTRL_POS.length; i++) {if (JudgeMan.judgeCircleArea( //区域判定CTRL_POS[i].x, CTRL_POS[i].y,downX, downY, CTRL_RADIUS * 1.2f)) {if (mOnCtrlClickListener != null) {switch (i) {case 0://插入尾部mOnCtrlClickListener.onAdd(this);break;case 1://更新mOnCtrlClickListener.onSet(this);contactTest();break;case 2://查找mOnCtrlClickListener.onFind(this);break;case 3://删除尾部selectIndex = mArrayBoxes.size() - 1;mAnimator.start();break;case 4://定点添加尾部mOnCtrlClickListener.onAddByIndex(this);break;case 5://定值查询mOnCtrlClickListener.onFindByData(this);break;case 6://定点移除mAnimator.start();break;case 7://清空mOnCtrlClickListener.onClear(this);break;}CTRL_COLOR[i] = 0xff54E1F8;//点击更换颜色}}}updayeSelectIndex(downX, downY);//更新selectIndexbreak;case MotionEvent.ACTION_UP://还原颜色CTRL_COLOR[0] = 0xff1EF519;CTRL_COLOR[1] = 0xff2992F2;CTRL_COLOR[2] = 0xffB946F4;CTRL_COLOR[3] = 0xffF50C0C;CTRL_COLOR[4] = 0xff1EF519;CTRL_COLOR[5] = 0xffB946F4;CTRL_COLOR[6] = 0xffF50C0C;CTRL_COLOR[7] = 0xffF46410;break;}invalidate();//记得重绘return true;
}
4.Activity使用接口:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ArrayView<String> view = new ArrayView<>(this);view.setOnCtrlClickListener(new OnCtrlClickListener<ArrayView<String>>() {@Overridepublic void onAdd(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onAdd", Toast.LENGTH_SHORT).show();}@Overridepublic void onAddByIndex(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onAddByIndex", Toast.LENGTH_SHORT).show();}@Overridepublic void onRemove(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onRemove", Toast.LENGTH_SHORT).show();}@Overridepublic void onRemoveByIndex(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onRemoveByIndex", Toast.LENGTH_SHORT).show();}@Overridepublic void onSet(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onSet", Toast.LENGTH_SHORT).show();}@Overridepublic void onFind(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onFind", Toast.LENGTH_SHORT).show();}@Overridepublic void onFindByData(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onFindByData", Toast.LENGTH_SHORT).show();}@Overridepublic void onClear(ArrayView<String> view) {Toast.makeText(MainActivity.this, "onFindByData", Toast.LENGTH_SHORT).show();}});setContentView(view);}
}

OK,完美运行,核心在审断之神的judgeCircleArea

查看按钮运行状况.gif


三、正文来了,绘制数据结构:

1.可绘制对象单体:使用数据结构单体的父类

拥有坐标、颜色、速度三种核心属性

/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:8:50<br/>* 邮箱:1981462002@qq.com<br/>* 说明:可显示出来的基本条件*/
public class Viewable {public float x;//单体的x坐标public float y;//单体的y坐标public int color = 0xff43A3FA;//单体的颜色public float vX;//单体的水平速度public float vY;//单体的数值速度public Viewable() {}public Viewable(float x, float y) {this.x = x;this.y = y;}
}
2.数组表结构单体的绘图承载对象:

数组盒子:拥有索引和数据两个额外属性

/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:8:46<br/>* 邮箱:1981462002@qq.com<br/>* 说明:模型层数组的单体*/
public class ArrayBox<T> extends Viewable {public int index;//数组单体索引public T data;//数据结构承载的核心数据@Overridepublic boolean equals(Object obj) {return ((ArrayBox) obj).data == data;}public ArrayBox(T data) {this.data = data;}public ArrayBox(float x, float y) {super(x, y);}
}
3.绘制数组的长度个空白矩形
1)如何根据索引确定点位

就是稍微画个图,看看有什么关系,找到通式就ok了(代码巧多了,写字就是丑...)
然后我们用上篇的数组表结构来进行测试

位置计算.jpg

2)绘制数组的长度个空白矩形

根据上面的分析图,确定了第x列,第y行的矩形坐标,应该就不难画了
注意:绘制数组的长度个空白矩形,数组的长度!! 数组的长度个!!,不是集合大小

本来应该把数组完全封装在数组表结构中的,这里为了演示扩容和缩容,数组长度还是必要的

//创建一个上篇定义的数组表类,泛型当然是要画的数组盒子了
private IChart<ArrayBox<E>> mArrayBoxes = new ArrayChart<>();/*** 绘制数组的长度个空白矩形** @param canvas*/
private void helpView(Canvas canvas) {for (int i = 0; i < mArrayBoxes.capacity(); i++) {int y = i / 8;//行坐标int x = i % 8;//列坐标mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(0xff821AFA);canvas.drawRoundRect((Cons.BOX_WIDTH + OFFSET_X) * x, (Cons.BOX_HEIGHT + OFFSET_Y) * y,(Cons.BOX_WIDTH + OFFSET_X) * x + Cons.BOX_WIDTH, (Cons.BOX_HEIGHT + OFFSET_Y) * y + Cons.BOX_HEIGHT,BOX_RADIUS, BOX_RADIUS, mPaint);mTxtPaint.setColor(0xff821AFA);canvas.drawText(i + "",(Cons.BOX_WIDTH + OFFSET_X) * x + Cons.BOX_WIDTH / 2,(Cons.BOX_HEIGHT + OFFSET_Y) * y + 3 * OFFSET_OF_TXT_Y, mTxtPaint);}}

数组初始长度为10,没错

数组体现.png


4.绘制表结构

根据mArrayBoxes的大小,绘制出mArrayBoxes里面的所有元素。
绘制单体在前言篇已经给出,这里只是加上了偏移量,应该不难理解。

/*** 绘制表结构* @param canvas*/
private void dataView(Canvas canvas) {mPaint.setColor(Color.BLUE);mPaint.setStyle(Paint.Style.FILL);mPath.reset();for (int i = 0; i < mArrayBoxes.size(); i++) {ArrayBox box = mArrayBoxes.get(i);mPaint.setColor(box.color);canvas.drawRoundRect(box.x, box.y, box.x + Cons.BOX_WIDTH, box.y + Cons.BOX_HEIGHT,BOX_RADIUS, BOX_RADIUS, mPaint);mPath.moveTo(box.x, box.y);mPath.rCubicTo(Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2, Cons.BOX_WIDTH, 0);canvas.drawPath(mPath, mPathPaint);canvas.drawText(box.data + "",box.x + Cons.BOX_WIDTH / 2,box.y + Cons.BOX_HEIGHT / 2 + 3 * OFFSET_OF_TXT_Y, mTxtPaint);}
}
5.更新绘制单体的点位

每次增删操作后更新一下点位

/*** 更新绘制单体的点位*/
private void updatePosOfData() {for (int i = 0; i < mArrayBoxes.size(); i++) {int y = i / 8;//行坐标int x = i % 8;//列坐标ArrayBox box = mArrayBoxes.get(i);box.x = (Cons.BOX_WIDTH + OFFSET_X) * x;box.y = (Cons.BOX_HEIGHT + OFFSET_Y) * y;box.vY = 100;box.vX = 100;}
}
6.点击时动态更新选中值:
/*** 点击时动态更新选中值* @param downX 按下点X* @param downY 按下点Y*/
private void updateSelectIndex(float downX, float downY) {float x = downX / (Cons.BOX_WIDTH + OFFSET_X) - 0.5f;float y = downY / (Cons.BOX_HEIGHT + OFFSET_Y) - 0.5f;if (x > -0.5 && y > -0.5) {int indexOfData = Math.round(y) * 8 + Math.round(x);//逆向求取点中的数据索引if (indexOfData < mArrayBoxes.size()) {mArrayBoxes.get(indexOfData).color = ColUtils.randomRGB();selectIndex = indexOfData;}}
}

四、操作按钮绘制:

注意:以下操作是在Activity中的点击回调中进行,调用了view层的方法,实现操作与视图分离

1.增加操作:
/*** 视图的数据操作接口方法--添加** @param data 数据*/
public void addData(E data) {ArrayBox<E> arrayBox = new ArrayBox<>(0, 0);arrayBox.data = data;mArrayBoxes.add(arrayBox);updatePosOfData();//更新一下点位
}
添加操作.gif

 * 视图的数据操作接口方法--根据索引添加** @param index* @param data*/
public void addDataById(int index, E data) {if (mArrayBoxes.size() > 0 && index < mArrayBoxes.size() && index >= 0) {ArrayBox<E> arrayBox = new ArrayBox<>(0, 0);arrayBox.data = data;mArrayBoxes.add(index, arrayBox);updatePosOfData();}
}
定点添加.gif


2.查询和更新操作
/*** 视图的数据操作接口方法--根据id查询操作* @param index* @return*/
public E findData(int index) {if (mArrayBoxes.size() > 0 && index < mArrayBoxes.size() && index >= 0) {return mArrayBoxes.get(index).data;}return null;
}/*** 更新数据* @param index 索引* @param data 数据*/
public void setData(int index, E data) {if (mArrayBoxes.size() > 0 && index < mArrayBoxes.size() && index >= 0) {mArrayBoxes.get(index).data = data;}
}
set和定索引查询.gif

/*** 视图的数据操作接口方法--根据数据查询操作* @param data* @return*/
public int[] findData(E data) {ArrayBox<E> arrayBox = new ArrayBox<>(0, 0);arrayBox.data = data;return mArrayBoxes.getIndex(arrayBox);
}
定值查询获取索引.gif


3.删除操作:
1)删除的核心方法:
/*** 视图的数据操作接口方法--移除末尾*/
public void removeData() {if (mArrayBoxes.size() > 0) {mArrayBoxes.remove();updatePosOfData();}
}
/*** 视图的数据操作接口方法--定索引删除操作** @param index 索引*/
public void removeData(int index) {if (mArrayBoxes.size() > 0 && index < mArrayBoxes.size() && index >= 0) {//更新后面的索引for (int i = index; i < mArrayBoxes.size(); i++) {mArrayBoxes.get(i).index -= 1;}mArrayBoxes.remove(index);selectIndex = -1;updatePosOfData();}
}
2)删除有个移除动画,ValueAnimate来帮忙
//初始化时间流ValueAnimator
mAnimator = ValueAnimator.ofFloat(0, 1);
mAnimator.setRepeatCount(-1);
mAnimator.setDuration(2000);
mAnimator.setRepeatMode(ValueAnimator.REVERSE);
mAnimator.setInterpolator(new LinearInterpolator());
mAnimator.addUpdateListener(animation -> {updateBall();//更新小球位置invalidate();
});
3)更新选中单体信息:updateBall
/*** 更新小球*/
private void updateBall() {if (mArrayBoxes.size() <= 0 && selectIndex < 0) {return;}ArrayBox ball = mArrayBoxes.get(selectIndex);ball.x += ball.vX;ball.y += ball.vY;if (ball.y > 600) {//大于600就执行移除if (mOnCtrlClickListener != null) {mOnCtrlClickListener.onRemoveByIndex(this);//移除监听放在这里了!!mAnimator.pause();//暂停ValueAnimator}}
}
//点击的监听中修改:case 3://删除尾部---这里将移除的选中对象设为最后一个selectIndex = mArrayBoxes.size() - 1;mAnimator.start();//开启Animator
删除和定点删除.gif

4.联合测试:
private void contactTest() {IChart<ArrayBox<E>> contactArr = new ArrayChart<>();contactArr.add(new ArrayBox<E>((E) "toly1"));contactArr.add(new ArrayBox<E>((E) "toly2"));contactArr.add(new ArrayBox<E>((E) "toly3"));contactData(selectIndex, contactArr);
}public void contactData(int index, IChart<ArrayBox<E>> chart) {mArrayBoxes.contact(index, chart);updatePosOfData();
}
表的联合.png

基本上就是这样,思路什么的都理清了,细节方面可参看源码


本系列后续更新链接合集:(动态更新)

看得见的数据结构Android版之开篇前言
看得见的数据结构Android版之表的数组实现(数据结构篇)
看得见的数据结构Android版之表的数组实现(视图篇)
看得见的数据结构Android版之单链表篇(待完成)
看得见的数据结构Android版之双链表篇(待完成)
看得见的数据结构Android版之栈(待完成)
看得见的数据结构Android版之队列(待完成)
看得见的数据结构Android版之二叉树篇(待完成)
看得见的数据结构Android版之二分搜索树篇(待完成)
看得见的数据结构Android版之AVL树篇(待完成)
看得见的数据结构Android版之红黑树篇(待完成)
更多数据结构---以后再说吧


后记:捷文规范

1.本文成长记录及勘误表
项目源码 日期 备注
V0.1--github 2018-11-23 看得见的数据结构Android版之表的数组实现(视图篇)
2.更多关于我
笔名 QQ 微信 爱好
张风捷特烈 1981462002 zdl1994328 语言
我的github 我的简书 我的掘金 个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持


icon_wx_200.png

看得见的数据结构Android版之表的数组实现(视图篇)相关推荐

  1. 看得见的数据结构Android版之数组表(视图篇)

    零.前言: 1.本文的姊妹篇:看得见的数据结构Android版之表的数组实现(数据结构篇) 2.希望你可以和我在Github一同见证:DS4Android的诞生与成长,欢迎star 3.激动人心的时刻 ...

  2. 看得见的数据结构Android版之数组表(数据结构篇)

    零.前言: 一讲到装东西的容器,你可能习惯于使用ArrayList和数组,你有想过ArrayList和数组的区别吗? Java的类起名字都不是随便乱起的,一般前面是辅助,后面是实质:ArrayList ...

  3. android 获取数组大小,看得见的数据结构Android版之数组表(数据结构篇)

    零.前言: 一讲到装东西的容器,你可能习惯于使用ArrayList和数组,你有想过ArrayList和数组的区别吗? Java的类起名字都不是随便乱起的,一般前面是辅助,后面是实质:ArrayList ...

  4. Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析

    文章目录 大纲图 数组的经典面试题目 数据结构三要素 数据逻辑结构(线性结构&非线性结构) 数据存储结构(顺序存储.链式存储.索引存储和散列存储) 顺序存储 链式存储 索引存储 散列存储 数据 ...

  5. Android版数据结构与算法汇总十二章

    Android版数据结构与算法(一):基础简介 https://www.cnblogs.com/leipDao/p/9140726.html Android版数据结构与算法(二):基于数组的实现Arr ...

  6. 还是俄罗斯方块之android版

    前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...

  7. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  8. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  9. android QQ动态tab,变化忒大了!Android版手机QQ 5.0体验

    变化忒大了!Android版手机QQ 5.0体验 出处:快科技 2014-07-28 12:02:56     作者:随心 编辑:随心[爆料] 收藏文章 内容导航: 第[01]页:[Android版手 ...

最新文章

  1. Chemistry.AI | 基于卷积神经网络(CNN)预测分子特性
  2. 框架:Spring Aop、拦截器、过滤器的区别
  3. python 形参 拷贝_Day124:python中的变量、引用、拷贝
  4. Python6种创建字典的方式
  5. ‍面试官问:Mybatis和Mybatis-Plus执行插入语句后可以返回主键ID吗? ‍我:看我回答...
  6. Linux 中的文件锁
  7. Html5表单元素-搜索框和上传文件框
  8. idc机房运维巡检_智和信通赋能国产信创 建设IT智能监控运维体系 - 蔚颖willing...
  9. linux判断值相等_Shell字符串比较相等、不相等方法小结【转】
  10. git 中遇到的错误及解决方法
  11. 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
  12. 为什么我建议你这样实现MySQL分页
  13. VB.net chart 控件使用
  14. C#nameof用法
  15. 天地图 政府内网 代理
  16. 电脑屏幕亮度调节器-护目镜
  17. java win7 管理员权限_Win7系统如何一键取得管理员权限
  18. 基于vsftpd搭建ftp服务器
  19. biostar来电自动开机_bios设置来电自动开机
  20. 两款开关电源的纹波对比

热门文章

  1. Java零基础学习全套视频笔记
  2. 阿里云推荐码 9折优惠 vx89to
  3. webug4.0支付漏洞
  4. Exposed Acne Treatment Review
  5. Django学习笔记(五)
  6. 揭秘英雄联盟的数据服务器
  7. 对 matplotlib.cm.RdYlBu() 的理解
  8. java创建response对象_创建一个HttpResponse对象
  9. Pytorch:torch.ge()、torch.gt()、torch.le()、torch.lt()
  10. 汉寿计算机职业中专,汉寿第一职业中专