• 极客不落🐒
    2019-01-29
    代码图片建议用 carbon 美化下,可读性会更好:)

    https://carbon.now.sh/

    作者回复: 刚注意到代码图片里的一些规范问题,手误。 看了下carbon,很不错的工具。 谢谢推荐!

     1
     5
  • pyhhou
    2019-01-22
    第28,29,39,40,44行相对应带上大括号会更好
    第39,40,44行属于一行表示多重行为,不便于观察和理解,换行会更好
    第28,31,36,42,47行的代码与前面的代码没有很好的分块,构成不了视觉上面清晰的代码块,在前面加上空行会更好
    第35行命名不够清晰,修改为Map<Character, Character> charMapping = new HashMap<>();
    第29行,就像前面 @背着吉他的大漠狼 同学说的,if 里面的 match 函数其实表示的意义不太明确,读者需要去看 match 函数的大致实现,如果在此之前定义一个boolean isMatched = match(word, pattern); 再将 isMatched 放到 if 里面会好很多;而且把函数直接放在 if 语句里面其实也违反了我们之前提到的单行单一行为的原则,因为运行函数返回结果和表达式条件判断在概念上本就是两个完全不同的行为

    能看到的就这些了,不足之处还请老师和大神们补充
    展开

    作者回复: 找的都很棒!

    
     2
  • 王智
    2019-01-21
    ```
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    class Solution {
        /**
         * Return a list of the words in words that match the given pattern.
         *
         * A word matches the pattern if there exists a permutation of
         * letters p so that after replacing every letter x in the pattern
         * with p(x), we get the desired word.
         *
         * Example:
         * Input: words = ["abc","deq","mee","aqq","dkd","ccc"],
         * pattern = "abb"
         * Output: ["mee","aqq"]
         *
         * Explanation: "mee" matches the pattern because there is
         * a permutation {a -> m, b -> e, ...}.
         *
         * "ccc" does not match the pattern because
         * {a -> c, b -> c, ...} is not a permutation, since a
         * and b map to the same letter.
         */
        public List<String> findAndReplacePattern(String[] words, String pattern) {
            List<String> ans = new ArrayList();
            for (String word : words) {
                if (match(word, pattern)) {
                    ans.add(word);
                }
            }
            return ans;
        }

        public boolean match(String word, String pattern) {
            Map<Character, Character> M = new HashMap();
            for (int i = 0; i < word.length(); ++i) {
                char w = word.charAt(i);
                char p = pattern.charAt(i);
                if (!M.containsKey(w)) {
                    M.put(w, p);
                }
                if (M.get(w) != p) {
                    return false;
                }
            }
            boolean[] seen = new boolean[26];
            for (char p : M.values()) {
                if (seen[p - 'a']) {
                    return false;
                }
                seen[p - 'a'] = true;
            }
            return true;
        }
    }
    ```
    改成我喜欢的格式,虽然不一定准确,但是自己看上去舒服很多
    展开

    作者回复: 舒服很多就是收获了。

    
     2
  • allean
    2019-01-21
    细节无小事,高手不是掌握了降龙十八掌,而是简单的事也能做到极致,学习了。

    作者回复: 质量的事是大事(追求),质量的事是小事(执行)。

    
     2
  • 小文
    2019-02-15
    还想问个问题就是c++得成员变量初始化可以再声明的时候初始化也可以在构造函数初始化,那哪种比较好呢

    作者回复: 和Java的惯例相比,道理是一样的。C语言,我更倾向于声明时就初始化一点。Java有固定的缺省的值,C语言的缺省值是随机的,一旦初始化遗漏,很多麻烦。

    
     1
  • Lindroid
    2019-01-31
    length方法直接写在for循环语句中会不会不是很好呢?因为这样每次循环都会调用它去获取word字符的长度,所以我觉得可以在for循环直接声明一个变量,值就是word的字符长度:
            int wordLength = word.length();
            for (int i = 0; i < wordLength; i++) {
               ……
            }

    作者回复: 赞这个发现!

    
     1
  • 背着吉他的大漠狼
    2019-01-21
    1,if语句尽量不要涉及复杂的表达式,可以用局部变量申明出来
    2,例子中有些许的不同语义的卸载了同一行,写没很好使用花括号
    3,方法体内可以将申明部分与逻辑部分使用空行加强阅读理解

    作者回复: “if语句尽量不要涉及复杂的表达式”,这个经验很赞!

    
     1
  • Demon.Lee
    2019-01-21
    老师,声明时就初始化,好像我定义那些实体Bean时候,并没有这么做,这个也要看情况吧?

    作者回复: 要看情况,简单的声明优先声明时就初始化。但是也有很多声明,特别是涉及效率的时候,要延迟初始化。我们后面还会专门将延迟初始化。所以,那一段我有加一个这个原则的适用条件。

    
     1
  • Sisyphus235
    2019-05-22
    声明包含命名规范和类型,命名规范之前的文章探讨过,我觉得这里更重要的是类型。文中提到很多格式上的注意,我补充一些类型上的探讨,使用类型上有很大学问,个人觉得 function 能解决的不用 class,不变的变量要使用 immutable 的类型,避免中间赋值的改变,整型能表达的不用浮点型,金钱等精确度要求高的变量转换成整型。

    另外就是不同代码模块传参的时候,相同声明可能会造成误解,或者一些语言会出现不同 namespace 不可知的变量值改变。

    作者回复: 都是很好的经验! 谢谢分享!

    
    
  • 拉格朗日的忧桑
    2019-02-22
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    class Solution {

        private static final char CHAR_VALUE = 'a';
        
        
        /**
         * Return a list of the words in words that match the given pattern.
         *
         * A word matches the pattern if there exists a permutation of
         * letters p so that after replacing every letter x in the pattern
         * with p(x), we get the desired word.
         *
         * Example:
         * Input: words = ["abc","deq","mee","aqq","dkd","ccc"],
         * pattern = "abb"
         * Output: ["mee","aqq"]
         *
         * Explanation: "mee" matches the pattern because there is
         * a permutation {a -> m, b -> e, ...}.
         *
         * "ccc" does not match the pattern because
         * {a -> c, b -> c, ...} is not a permutation, since a
         * and b map to the same letter.
         */
        public List<String> findAndReplacePattern(String[] words, String pattern) {
            List<String> result = new ArrayList();
            
            for (String word: words)
            {
             if (match(word, pattern))
                {
                
                 result.add(word);
                }
                    
            }
                
            return result;
        }

        public boolean match(String word, String pattern) {
            Map<Character, Character> map = new HashMap();
            
            for (int i = 0; i < word.length(); ++i) {
            
                char wordChar = word.charAt(i);
                char patternChar = pattern.charAt(i);
                
                if (!map.containsKey(w))
                {
                 map.put(wordChar, patternChar);
                }
                if (map.get(wordChar) != patternChar)
                {
                 return false;
                }
                
            }
            
            boolean[] seen = new boolean[26];
            
            for (char charPattern: map.values()) {
                
                if (seen[charPattern - CHAR_VALUE])
                {
                    return false;
                }
                
                seen[charPattern - CHAR_VALUE] = true;
            }
            
            return true;
        }
    }
    展开
    
    
  • 小文
    2019-02-15
    不明白为什么像这种int size, length;一行声明多个的形式要被设计出来,不让用不就得了,唉……

    作者回复: 语言的设计一般要追求的灵活性,使用者就要规避灵活性带来的负面影响。

    
    
  • 王小豪
    2019-01-21
    很有用~就是感觉有点短呐😂

    作者回复: 多出来的时间练练题吧😄

    
    
我们在线,来聊聊吧