
趣味编程
文章平均质量分 79
由此及彼
代码可以更优雅。
展开
-
项目实战:优雅的实现专车意见反馈
今天我们拆解一下专车的意见反馈,涉及到TextWatcher监听、特殊字符过滤Pattern等知识点和hideInputMethod收键盘、setEnabled按钮使能、shape圆角矩形、maxLength最大长度、hint默认提示、String.format优化效率等细节,如图是我们开发时的标注图,聚焦到每一像素,对UI敏感,练就一双火眼金睛···意见反馈标注图.png原创 2017-06-07 16:24:13 · 781 阅读 · 0 评论 -
项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)
NullPointerException空指针异常可以说是我们开发中最常遇到的Bug,因此我们处处判空,胆战心惊。处处判空确实可以解决空指针异常的Crash。但处处判空未免过于草木皆兵,而且写出来的代码十分不优雅,多余判断效率低下,这不是我们的Style!这里,我们由点到面,借鉴一下Android API中Splitter类的split方法和TextView类的setText方法,我们原创 2017-02-06 15:36:50 · 1167 阅读 · 0 评论 -
算法之美:取球游戏
前言:在编程问题中,取球游戏的一般解题模板伪代码: f(局面x){//——>胜(true)负(false) 边界条件处理。。。。。 For(我所有可能的走法){ 试着走一步——>局面y 胜负t = f(y);转载 2017-01-03 13:59:45 · 1472 阅读 · 0 评论 -
一个Demo快速上手AsyncTask
正所谓说不如做,今天我们通过一个Demo快速上手AsyncTask。为了解决新线程不能更新UI组件的问题,Android提供了许多解决方案,这里我们使用更轻量级的AsyncTask,适用于简单的异步处理,不需借助线程和Handler即可实现。AsyncTask是一个抽象类,继承时需指定如下三个泛型参数:Params 启动任务执行的输入参数的类型,比如HTTP请求的U原创 2016-11-23 19:58:45 · 513 阅读 · 0 评论 -
算法优解(11)-二叉树的序列化和反序列化
来自左神书中的一道题,在左神核心代码的基础上,添加了二叉树的构建和前序遍历操作,将这道题完善成了一个小Demo,和各位共勉。题目:二叉树的序列化和反序列化。名词解释:* 二叉树的序列化:二叉树被记录成文件* 二叉树的反序列化:通过文件重建二叉树思路:我们通过先序遍历实现序列化,假设序列化的结果字符串为str,初识为"",先序遍历二叉树,如果遇到null节点就在s原创 2016-11-22 19:49:29 · 451 阅读 · 0 评论 -
必知必会的Android自定义View
当Android系统提供的UI组件不足以满足项目需要时,我们可以通过继承View来派生自定义控件。今天我们就一起来了解必知必会的Android自定义View,View只是一个矩形的空白区域,没有任何内容。Android应用的其他UI组件都继承View,然后在View组件提供的空白区域上绘制外观。接下来我们代码实战自定义View,实现一个跟随手指移动的小球:1.定义类并继承View:原创 2016-11-22 18:02:42 · 329 阅读 · 0 评论 -
算法优解(10)-合并两个有序的单链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。题目:合并两个有序的单链表。思路:逐一比较两个链表的节点将其合并到其中一个链表。核心算法: public static Node merge(Node head1,Node head2){ if(head1 == null ||原创 2016-11-21 19:30:12 · 357 阅读 · 0 评论 -
算法优解(8)-删除无序单链表中重复出现的节点
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建操作,将这道题完善成了一个小Demo,和各位共勉。 问题:删除无序单链表中重复出现的节点思路:使用HashSet进行重复判断。核心算法: public static void removeNode(Node head){ if(head == null){ return; } HashSet s原创 2016-11-15 19:42:26 · 505 阅读 · 0 评论 -
算法优解(7)-相加链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出操作,将这道题完善成了一个小Demo,和各位共勉。 题目:两个单链表生成相加链表:假设链表中的每一节点的值都在0-9之间,于是我们可以使用整个链表作为一个整数。 例如:链表9->3->7(代表整数937)和链表6->3(代表整数63)相加后得到链表1->0->0->0(代表整数1000)。思路:利用栈结原创 2016-11-14 20:57:38 · 296 阅读 · 0 评论 -
项目实战:说一说运算符优先级和代码可读性
拿我们项目中的一行代码说事,说一说运算符优先级和代码可读性问题。请大家看一下这一行代码表达的意思和可能出现的问题,请忽略它的业务意义哈。 dto.getStatus() ==1? false :true|| imageDto == null写这行代码的人的初衷是:(dto.getStatus() ==1? false :true)||(imageDto == null)原创 2016-11-17 20:36:02 · 487 阅读 · 0 评论 -
JavaSE-String API compareTo源代码分析
曾记否我们在JavaSE-String API 其他功能接触的compareTo,今天我们深入源代码一探究竟。请看这样一段代码:public class CompareToTest { /** * 权兴权意-2016.11.17 * JavaSE-String API compareTo源代码分析 */ public static void main(String[] a原创 2016-11-17 14:47:30 · 422 阅读 · 0 评论 -
JavaSE系列:必知必会的异常(概述)
你能保证自己写的程序永远不出错?就算程序不出错,你能保证用户总是按你的意愿输入?就算用户聪明且配合,你能保证程序的操作系统永远稳定?你能保证程序的硬件不会突然坏掉?你能保证网络永远畅通?···正因为太多的无法保证情况,因此我们需要异常机制。通过异常机制我们可以使异常处理代码和正常业务代码分离,让程序代码更佳优雅,提高程序的健壮性,今天我们简单了解一下异常。(异常概述)原创 2017-01-16 21:04:54 · 322 阅读 · 0 评论 -
千呼万唤始出来的CoordinatorLayout
亲可记得我之前转载的INTRODUCTION TO COORDINATOR LAYOUT ON ANDROID,今天将它翻译一遍,以飨读者。在这一年的I/O开发者大会上,Google引入了一个新的Android设计支持库来帮助开发者们在他们的APP中翻译 2017-03-04 15:27:13 · 433 阅读 · 0 评论 -
一个登录Demo初识MVP
从我们的项目到招聘网站的JD,处处可见Android MVP 模式的身影。项目越来越庞大,开发越来越多,MVP的优势越来越明显。今天我们通过一个简单的登录Demo,初步学会MVP的使用。首先,什么是MVP?MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了V原创 2017-03-08 16:20:45 · 458 阅读 · 0 评论 -
项目实战:微交互之按钮选择器
相信大家在很多APP中都见过这种微交互,点击按钮时,发现点击前和点击时按钮(甚至是按钮里的文字)的样式不一样,给用户一个友好的小提示,你确实点击了这个按钮,今天我们做一下这个效果。首先,你以为的就是你以为的吗,表面上看它是一个按钮(Button),其实它是一个文本(TextView)。我们先在布局中定义它。 <TextView android:id="@+id/s原创 2017-05-22 20:00:39 · 988 阅读 · 0 评论 -
项目实战:封装友盟,数据化监控应用
《从理论到实践,埋点专车费用明细模块》在简书首页、人人都是产品经理等各大媒体取得了不错的反响。正所谓授人以鱼不如授人以渔。今天我们从代码层面进行埋点实现,引入友盟并进行封装,然后视具体规划埋点,数据化监控我们的应用,数据分析,Go。首先,参考官方文档申请key,添加权限,进行一系列准备操作。耐心花10~30 min 都看一遍哈。友盟统计分析Android文档http://dev原创 2017-06-01 16:58:09 · 818 阅读 · 0 评论 -
项目实战:自定义View实现右上角更多,让页面更简洁
从APP页面的视觉设计上考虑,一个页面呈现的元素不能太多,最好一个页面只做一件事,干净整洁,这时,我们可以考虑将一些功能收入右上角更多中,今天我们通过一个自定义View快速实现右上角更多功能,让页面更简洁,产品更优雅。如图,以我们专车的费用明细为例,改版后页面更简洁了有木有,至于有些功能收的是否合理,我们另做讨论。我们先把地基打扎实,写一下我们的核心,自定义原创 2017-05-27 16:41:18 · 958 阅读 · 0 评论 -
项目实战:微交互之转场动画(anim、style、theme)
一般情况,APP中页面转场是整体统一的,但有时为了表达页面之间的从属、并列等关系,我们可能会采用不同的转场动画。比如,我们专车页面之间的转场采用如下规则,以便更好的表达页面之间的关系,给用户更好的体验。下面以专车行程模块为例,录制一个简单的gif动画,大家可以看一下效果。ps:简书不能上传视频,只能传gif展示动效,但我用的这款gif录制软件比较渣,很多地方都失真了,大原创 2017-05-26 19:07:37 · 1162 阅读 · 0 评论 -
项目实战:关于format(String)你不知道的那些事
在项目中有一种很常见的case就是字符串拼接,以我们专车下单页的企业规则校验场景为例,如图,我们来分析这一句提示文案:立即叫车服务不符合企业用车规则,无法用车它是由两部分组成,动态的当前服务类型(立即叫车)+静态的固定文案(服务不符合企业用车规则,无法用车)。因为我们现在有很多服务类型(立即叫车、预约用车、日租、半日租、接机、送机、定制···),我们需要根据用户选择的服务类原创 2017-03-16 11:36:27 · 549 阅读 · 0 评论 -
项目实战:超实用小工具isFastClick解决重复点击按钮问题
相信大家在项目开发中都遇到过这种case,点击按钮时,由于手机一时卡顿或者手速过快,造成按钮重复多次点击,跳转生成多个Activity(然后一个个关)或者其他重复操作。现在,就让我们通过几行代码一劳永逸的解决它。小工具的核心思想就是借助System.currentTimeMillis()计算多次点击按钮的时间差,如果这个时间差很小,我们就认为这是无效的重复点击。封装一个Utils工原创 2017-04-01 13:46:31 · 1709 阅读 · 0 评论 -
项目实战:浅谈属性动画(2)-动画监听事件,消失的按钮,酷炫Path2.0
有了属性动画(1)的基础后,我们进阶玩法,为动画设置监听事件。先看一下消失的Button,在布局文件中添加Button,为其指定响应方法clickListener:[html] view plain copy Button android:layout_width="wrap_content" androi原创 2017-03-15 13:52:00 · 545 阅读 · 0 评论 -
项目实战:浅谈属性动画(1)-探索新玩法
属性动画是Google在3.0之后才提出的新动画框架,相比传统动画Animation只是系统不断调用onDraw方法重绘界面以实现动画效果。属性动画顾名思义是调用get、set方法真实改变属性。传统Animation有很大的局限性:1.只是重绘了动画,事件响应位置却没有改变,因此它不适用于具有交互动画的效果,只能做显示效果;2.不断调用onDraw方法重绘很浪费资源;原创 2017-03-15 10:43:41 · 690 阅读 · 0 评论 -
项目实战:几十行代码实现更加强大的Log,全方位输出类-方法-行数-信息
在项目开发中,我们经常使用Log帮助我们调试代码。但是,Log可以更加强大。在这里我对Log进行封装,借助StackTraceElement类,几十行代码实现更加强大的Log,全方位输出类-方法-行数-内容。我们先看一下Android的Log: /** * Send a {@link #DEBUG} log message. * @param tag Used t原创 2017-03-22 19:19:26 · 849 阅读 · 0 评论 -
项目实战:滚动刷新场景(从ArrayList到LinkedList)
如果有这样一个需求,有这样一个列表显示数据,现假设一共显示25项,初始状态为空。首先从0-24添加数据,满了之后,覆盖最早数据,即继续从0-24追加数据。习惯性思维ArrayList开始搞。java.util 类 ArrayListjava.lang.Object java.util.AbstractCollection java.util.Abstra原创 2016-09-20 17:16:35 · 4017 阅读 · 6 评论 -
Android TextUtils那些事(isEmpty()的误解)
我们经常使用TextUtils.isEmpty()来判断字符串是否为空,有很多人认为空格也能返回true,然而空格不等于空!此外,isEmpty还能判断字符串长度是否为0。请看源码: /** * Returns true if the string is null or 0-length. * @param str the string to be examine原创 2016-11-14 11:27:07 · 2321 阅读 · 0 评论 -
算法优解(9)-单链表的选择排序
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。题目:给定一个无序单链表的头结点head,实现单链表的选择排序。要求额外空间复杂度O(1)。思路:从未排序链表中找到最小节点small的前一节点smallPre,从而在未排序链表中删除最小节点small,并将最小节点small添加到已排序链表中,由此逐渐原创 2016-11-16 19:43:17 · 889 阅读 · 0 评论 -
JavaSE-3min回顾Object的finalize和clone方法
JavaSE基础学习,今天我们花3min回顾一下Object的finalize和clone方法。 先回顾finalize,看最好的教材,官方API文档:finalizeprotected void finalize() throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写fina原创 2016-11-11 11:55:51 · 278 阅读 · 0 评论 -
回顾JavaSE(6)-String(5)String API 判断功能
今天我们依旧探索String API,重点看一下String类的判断功能,主要是测试如下几个方法。重点说一下isEmpty(),请区分内容为空和对象为空。lbooleanequals(Objectobj)lbooleanequalsIgnoreCase(Stringstr)lbooleancontains(Stringstr)lboolean原创 2016-09-23 13:40:51 · 287 阅读 · 0 评论 -
回顾JavaSE(5)-String(4)7行代码分析一道关于String拼接的经典面试题
看了最近几个String系列的小伙伴可能会很纳闷,这么简单的东西有必要写一篇博客吗?是不是有点浪费感情?然而并不会,平心而论,看完代码秒出结果,并且是正确的结果,必须要有深厚的JavaSE功底,这样的人,不多。今天我们通过7行代码分析一道关于String拼接的经典面试题。请先看代码: String s11 = "Hello"; String s12 = "World"; S原创 2016-09-22 19:39:50 · 354 阅读 · 0 评论 -
回顾JavaSE(4)-String(3)四行代码分析String字面值对象和构造方法对象的内存分配
今天我们通过四行代码分析String字面值对象和构造方法创建对象的不同,附上内存分配图,深入理解。首先,必须明确:==:若是引用类型,比较的是地址值是否相同。equals:若是引用类型,默认比较的是地址值是否相同,但Sting类重写了equals方法,比较内容是否相同。然后,我们写一下代码: String s9 = new String("Hello"); String原创 2016-09-21 20:16:54 · 324 阅读 · 0 评论 -
算法优解(2)-猫狗队列
来自左神书中的一道题,不过左神的Java代码有几个问题,自己亲自Coding实现了一遍,麻烦小伙伴们帮忙转转,让左神下一版时能纠正这个错误,另,转载请注明出处哈。题目:已知有宠物、狗、猫类如下,实现一种猫狗队列的结构,要求实现add、pollAll、pollDog、pollCat、isEmpty、isDogEmpty、isCatEmpty等方法。class Pet { private原创 2016-09-27 14:22:36 · 1093 阅读 · 1 评论 -
项目实战:RequestUrl的处理(思考 + Sting API > KMP等复杂算法、正则表达式)
今天从项目中抽取了一个点进行分析,大概情形就是在项目中我们请求了大量参数,想非常直观的从这些参数中挑出一些特定信息并将它显示出来,这就涉及到了字符串的处理。例如给定这样一个requestUrl:private static String requestUrl = "http://xxxtest.11111111.com:9988" + "/resource/x/xxx/xxxsup原创 2016-09-26 11:39:00 · 539 阅读 · 0 评论 -
被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」
故事的背景如下图,李笑来 老师于10月19日在 知乎Live 开设 一小时建立终生受用的阅读操作系统 的讲座,他老人家看到大家伙报名踊跃,便在微博上发起了一个 猜数量赢取iPhone7 的活动。因为该活动注明了「不限猜的次数」,我便用 JavaScript 写一个自动转发的脚本,用机器代替手工转发,结果转发不到200次就被 李笑来 老师拉黑了,实在扫兴。与其独自郁闷,不如把技术细节转载 2016-10-11 20:52:26 · 657 阅读 · 0 评论 -
算法之乐:一个算法解决3道经典二叉树面试题(深度、长度、直径)
有了昨天《Java实现二叉树的构建以及3种遍历方法》的二叉树数据结构基础,今天我们通过一个算法解决3道关于二叉树的经典面试题(深度、长度、直径),触类旁通,举一反三,尽享算法之乐。测试二叉树:例题:给定一个二叉树,计算它的最大深度。深度是指根节点到子节点路径中的节点个数。如图,1->8/9的深度为4(1-2-4-8/9),这也是这棵二叉树的最大深度。我们定义一个Result原创 2016-10-09 14:59:26 · 973 阅读 · 0 评论 -
5种方法巧妙交换变量值
今天我们看一道十分经典的面试题,交换2个整数变量的值。在算法竞赛中,最简单粗暴的方法:System.out.println("a:" + b + ",b:" + a);在开发中,最常用的方法: int c; c = a; a = b; b = c;在面试中,这里提供3种解法:法一-位运算: a = a^b; b = a^b;//a^b ^ b原创 2016-09-18 19:42:39 · 493 阅读 · 0 评论 -
洗牌算法
给定N张扑克牌和一个随机函数,设计一个洗牌算法。voidshuffle(intcards[],intn){ if(cards==NULL) return; srand(time(0)); for(inti=0;i { //保证每次第i位转载 2016-03-20 22:47:21 · 370 阅读 · 0 评论 -
想一想如何从M个数中随机等可能的取出N个数
从0到m-1这m个数中随机取出n个(n 第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把list里面对应的元素丢到另一个数组或者list里面 这个方法本来是不错的 但要注意的是 为了保证每个元素取到的概率相等 需要每取出一个元素 就把它从list里面删除 原因就不解释了 简单的概率问题 但众所周转载 2016-03-02 21:53:57 · 942 阅读 · 0 评论 -
算法优解(3)-栈栈排序
来自左神书中的一道题,不过左神的Java代码有一点小问题,排序排反了,大于号改成小于号就ok,自己亲自Coding实现了一遍,麻烦小伙伴们帮忙转转,让左神下一版时能纠正这个错误,另,转载请注明出处哈。题目:一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。 分析:题目不难,直接上代码,里面有用例原创 2016-09-28 14:06:37 · 365 阅读 · 0 评论 -
一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)
给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。例子:[AABBCCDEEFFGG], 答案: D秒写简单算法,注意边界条件,遍历即可: private static char findSingleCharacter1(char[] input, int n) { int i; for (i = 0; i < n - 2; i =原创 2016-09-29 10:56:11 · 621 阅读 · 0 评论 -
LeetCode上一道经典的面试题-O(1)实现LRU Cache
你遇到过这个题吗?实现一个LRU Cache。要求查询和插入都在O(1) 时间内完成。遇到过?很正常。没遇到?早晚会遇到。(鬼脸)这是LeetCode上一道十分经典的题目,也是非常火的面试题。原题:Design and implement a data structure for Least Recently Used (LRU) cache. It sho原创 2016-09-30 11:04:23 · 10380 阅读 · 0 评论