Android Logger 日志框架实现分分快三计划

作者:编程技术

代码完结

上面的那几个三角看起来完毕特别轻巧,作者脑海中第多少个冒出的化解办法是概念二个String字符串,然后每趟循环在字符串末尾追加叁个“*” ,小编居然还把代码写了出去。

终极效果

分分快三计划 1

末尾效果

        public void Display1()
        {
            Console.WriteLine("乘法表:");
            for (int i = 1; i <= 9; i  ) // 循环输出乘法表行数
            {
                for (int j = 1; j <= i; j  ) // 循环输出乘法表列数
                {
                    Console.Write(i   "*"   j   "="   i * j   "  ");

                }
                Console.WriteLine();

            }
            Console.WriteLine();
        }    

乍少年老成看起来,挺简单的,不过左边手之后,发掘各样难点,怎么保障每行的 “*” 对称居中呢?

打印Map

以此没啥好说的...

     /**
     * 打印MAp
     */
    public static void m(Map map) {
        Set set = map.entrySet();
        if (set.size() < 1) {
            printLog(D, "[]");
            return;
        }

        int i = 0;
        String[] s = new String[set.size()];
        for (Object aSet : set) {
            Map.Entry entry = (Map.Entry) aSet;
            s[i] = entry.getKey()   " = "   entry.getValue()   ",n";
            i  ;
        }
        printLog(V, s);
    }

1.我们供给打印出九行;

JSON格式化部落到实处

当笔者先是次使用Logger JSON格式化的职能时,笔者心理是伤心的,因为它让自己放弃了伴随作者从小到大的JSON格式化网页。本着无比悲痛的心气,生平未见小编第一遍最棒认真的查阅了开源项目标代码。
新生,看完代码后的自己,心境是崩溃的,原来认为JOSN格式化这么高达上的功力肯定是很复杂的代码达成,后来察觉尼玛就风流洒脱行代码就会消除,那是何等鬼啊,说好的复杂代码呢??

    /**
     * 打印JSON
     *
     * @param jsonStr
     */
    public static void j(String jsonStr) {
        if (isDebug) {
            String message;
            try {
                if (jsonStr.startsWith("{")) {
                    JSONObject jsonObject = new JSONObject(jsonStr);
                    message = jsonObject.toString(JSON_INDENT); //这个是核心方法
                } else if (jsonStr.startsWith("[")) {
                    JSONArray jsonArray = new JSONArray(jsonStr);
                    message = jsonArray.toString(JSON_INDENT);
                } else {
                    message = jsonStr;
                }
            } catch (JSONException e) {
                message = jsonStr;
            }

            message = LINE_SEPARATOR   message;
            String[] lines = message.split(LINE_SEPARATOR);
            StringBuilder sb = new StringBuilder();
            printLog(D, lines);//请不要关注这行,这是控制台输出的Log方法
        }
    }

以上便是JSON格式化的艺术,想必你和本人当场少年老成致充满了错愕,大家每一日都在用toString()、toString()...然后竟是不亮堂还恐怕有个toString(int xxxx)的重载方法!!!!

没有错,高大上的JSON格式化作用无需你998行代码,也无需你99行代码,没有错,你没看错,它就只需求您大器晚成行toString(int xxxx),何况附带馈赠你xxxx个缩进空格!!

 

但是等到写上边包车型地铁直角三角形时,小编傻了,这些怎么用String完成啊,不行,想了一会自此笔者割舍了。

代码定位的兑现

那阵子,小编大概个子女的时候自身就理解自家很无知,后来当本人看了Logger的Json格式化代码的落到实处后,小编早已对它不屑风度翩翩顾。后来当本身看了代码定位的效用后,作者以为本身只怕太年轻了...

    /**
     * 代码定位
     *
     * @param type
     */
    private static void printLocation(char type, String... msg) {
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        int i = 0;
        //获取代码所运行的位置
        for (StackTraceElement e : stack) {
            String name = e.getClassName();
            if (!name.equals(L.class.getName())) {
                i  ;
            } else {
                break;
            }
        }
        //进行方法位置偏移
        i  = 3;
        //当我能准确获取到I时,本部分已经完结,以下代码都是废话,请不要关注
        String className = stack[i].getFileName();
        String methodName = stack[i].getMethodName();
        int lineNumber = stack[i].getLineNumber();
        StringBuilder sb = new StringBuilder();
        printHunk(type, HORIZONTAL_DOUBLE_LINE   "   Location:");
        sb.append(HORIZONTAL_DOUBLE_LINE)
                .append("   (").append(className).append(":").append(lineNumber).append(")# ").append(methodName);
        printHunk(type, sb.toString());
        printHunk(type, msg == null || msg.length == 0 ? BOTTOM_BORDER : MIDDLE_BORDER);
    }

注:上边实际不是纯粹的Logger源码,那是自个儿依照Logger的笔触自身写的代码定位功用,事实上Logger源代码这有个别写得很美丽好,可是你也懂的,优良也就象征代码不佳看懂...

好呢,我承认,笔者那儿就是因为看那后生可畏都部队分看得抑郁,认为十分不爽,然后愤怒,依照它的思路重新来写的。。。

好啊,以往来所说代码定位的准则。
正如图所示:

要素拦截

自个儿想,上面包车型地铁图你肯定很明白,对的,那正是我们平时用的debug 然后watch某些成分时候的界面。
在地方的图纸中,我们看见了一群数组,个中圈深紫的有个别是或不是感到有些异样,因为包名并不是系统的包名,那多少个都以大家温馨的类,本身的方法的因素。

今后,作者想领悟的您早已懂了,代码定位的原理是通过Thread.currentThread().getStackTrace()方法拿到到持有的运作成分,并基于获得到的数组,进行自然的撼动来规范捕获Looger( )被调用的着实地点。

遵照JVM的运行规律,每当JVM施行三个办法时,它都会把该措施加压力到二个措施栈里面,依照栈的后入先出准则,大家可以见到,Logger( )被调用的岗位一定是措施栈里面最早被压入的函数的职务。也等于红圈里面的末尾叁个因素。相当于自家为啥要 i = 3的缘由;

沾满本人自身写的类L(Logger)的调用流程:

L流程

我们终于取拿到了代码所在行的方便地点了,要在调节台上贯彻代码定位也就轻易多了。

基于取获得的StackTraceElement成分,大家能因此api接口获取到运营类的类名及其该办法所被调用之处,然后遵照下边包车型客车格式进行打包,便能促成调控台代码的固化。
代码定位格式:
(类名:代码行)
假如遵循地方的法则进行重新组合类名和行,再通过系统提供的Log进行输出,便能透过调控台直接跳转到所在的代码行。

效果图

最后,大家把代码改得严格一点,去除具体的数值判定,改为依照数组的尺寸剖断,代码如下:

写在头里

那篇小说也是自家原先写在CSDN上的小说...


能够那样说,Log日志是除了debug外我们调节和测验程序的方方面面了,不过在其实的支付中,系统原生的Log功用并不强大,它只好打字与印刷简单的字符串,如若超出JSON,MAP意气风发类的奇特字符串它的打字与印刷效果将最为不好。

机缘巧合下,笔者有幸见在github上收看了二个效果很强盛的LOG日志库Logger,它成效强盛,当您使用它打字与印刷LOG日志时,它不但能把日常的字符串打字与印刷出来,以至能牢固你打字与印刷的职分。而且它能直接将JSON字符串格式化并打字与印刷出来,省下了作者们手动格式化JSON字符串的岁月。

下边是它的打字与印刷效果图

效果图

分分快三计划 2

分分快三计划 3

最珍视的还是放在最前面

自身是宏伟的DEMO

分分快三计划 4

此间,为了使大家的等腰三角形极点唯有贰个 “*” ,让矩阵扩充了一列,形成了奇数列,然后把地方的两段代码组合起来,改良一上面际条件,结果运行成功。

回顾Logger日志达成

好了,看完Logger的功效介绍和效果与利益图,想必你也很心动,也想要搞那样贰个Logger库。
今后假设你想有所这么七个日记系统,那么有八个大致的章程来供您选拔:
一、Clone 点击我,然后关门此窗口...
二、继续往下看。


特别谢谢你留下来继续看自身的废话,今后让大家一齐研究Logger的主要职能吗!

using System;

namespace multiplicationTableApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var multiplication = new Multiplication();
            multiplication.Display1();
            multiplication.Display2();

            Console.ReadLine();
        }
    }

    class Multiplication
    {
        public void Display1()
        {
            Console.WriteLine();
            Console.WriteLine("未对齐九九乘法表:");
            for (int i = 1; i <= 9; i  ) // 循环输出乘法表行数
            {
                for (int j = 1; j <= i; j  ) // 循环输出乘法表列数
                {
                    Console.Write(i   "*"   j   "="   i * j   "  ");

                }
                Console.WriteLine();

            }
            Console.WriteLine("n");
        }

        public void Display2()
        {
            Console.WriteLine("已对齐九九乘法表:");
            for (int i = 1; i <= 9; i  ) // 循环输出乘法表左边数值
            {
                    for (int j = 1; j <= i; j  ) // 循环输出乘法表右边数值
                    {
                    if ((i == 3 || i == 4) && j == 2) // 将乘法表排序整齐
                    {
                        Console.Write(i   "*"   j   "="   i * j   "   ");
                    }
                    else {
                        Console.Write(i   "*"   j   "="   i * j   "  ");
                    }

                    }
                    Console.WriteLine();

            }
        }
    }
}
  • 为了打字与印刷第三个直角三角形,作者定义了多少个6*6的数组,然后推断对角线形成的分界条件,代码如下:

代码达成

劈成两半后产生的直角三角形

效果图

public static void main(String[] args) {
        char[][] s =new char[6][6];
        for (int i = 0; i < 6; i  ) {
            for (int j = 0; j < 6; j  ) {
                if (i   j < 5)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        printArray(s);
}

设计表达

    public static void main(String[] args) {
        char[][] s =new char[6][6];
        for (int i = 0; i < 6; i  ) {
            for (int j = 0; j < 6; j  ) {
                if (i < j)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        printArray(s);
    }

完全代码

code开始。

看效用图大家会意识,只须求在3*2与4*2的结果后多打字与印刷贰个空格,乘法表都将对齐;

作者们的目标是打字与印刷出一个用 “*” 符号填满的等腰三角形,就好像下边这样

由图可以知道:

  • 下一场是第一个直角三角形,相符的措施,只是矩阵对角线的界线条件转移一下:

 

分分快三计划 5

假诺具备网瘾(举例:作者^_^卡塔尔国就会发觉在第三行和第四行与下部的行并未有对齐;

诸有此类看起来就总结多了,只要大家先打字与印刷出五个对称的直角三角形,然后再拼凑完整就足以了。

        public void Display2()
        {
            Console.WriteLine("乘法表:");
            for (int i = 1; i <= 9; i  ) // 循环输出乘法表左边数值
            {
                    for (int j = 1; j <= i; j  ) // 循环输出乘法表右边数值
                    {
                    if ((i == 3 || i == 4) && j == 2) // 将乘法表排序整齐
                    {
                        Console.Write(i   "*"   j   "="   i * j   "   ");
                    }
                    else {
                        Console.Write(i   "*"   j   "="   i * j   "  ");
                    }

                    }
                    Console.WriteLine();

            }
        }    
  • 聊起底是联合上边包车型大巴三个三角形,但那边要小心一点,归并体上看后,大家的矩阵大小断定要改成早先的二倍,但是须求行和列都变大吗?
    并没有必要,大家只须要列造成二倍就足以了,行不用变,因为行变大二倍之后您是怎么都不或然打字与印刷出一个等腰三角形的。
    接下去放上代码:

2.每行中最大列数等于行数;

用单薄填满的三角形

 

分分快三计划 6

劈成两半后形成的直角三角形

新兴本身选拔了用数组,那样只需寻找矩阵的对角线,然后在对角线上下方依据事态填充 “*” 就足以了。

    public static void main(String[] args) {
        char[][] s =new char[6][13];
        for (int i = 0; i < 6; i  ) {
            for (int j = 0; j < 6; j  ) {
                if (i   j < 6)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        for (int i = 0; i < 6; i  ) {
            for (int j = 6; j < 13; j  ) {
                if (i   6< j)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        printArray(s);
    }

    public static void printArray(char[][] s) {
        for (int i = 0; i < s.length; i  ) {
            for (int j = 0; j < s[i].length; j  ) {
                System.out.print(s[i][j]);
            }
            if (i != 5) {
                System.out.println();
            }
        }
    }
public static void main(String[] args) {
        char[][] s =new char[6][13];
        for (int i = 0; i < s.length; i  ) {
            for (int j = 0; j < s[i].length / 2; j  ) {
                if (i   j < s[i].length / 2)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        for (int i = 0; i < s.length; i  ) {
            for (int j = s[i].length / 2; j < s[i].length; j  ) {
                if (i   s[i].length / 2 <  j)
                    s[i][j] = ' ';
                else
                    s[i][j] = '*';
            }
        }
        printArray(s);
}
public static void printArray(char[][] s) {
        for (int i = 0; i < s.length; i  ) {
            for (int j = 0; j < s[i].length; j  ) {
                System.out.print(s[i][j]);
            }
            if (i != s.length - 1) {
                System.out.println();
            }
        }
}

谢谢(^_^)

要解决这几个题目,首先来让大家把难点解释一下,以三角形的高为轴,把三角形劈成两半,就好像上面这样

分分快三计划 7

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 JAVA Android android 框架