楼主: david_smith
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 编程小技巧 Clean Code in Java

 
🔗
UOLO234 2021-10-14 20:49:39 | 只看该作者
全局:
tianxiaguixin 发表于 2021-10-14 01:37
感觉不是太常用啊,比如说leet上面,哪些题会用到regExp啊

LC 大部分除了用 regex一般都有其余的解法,但 819 除外,这道题不用正则反而麻烦
回复

使用道具 举报

🔗
jsj 2021-10-14 22:06:35 | 只看该作者
全局:
我个人还是偏爱通用的写法,尽量少用某种语言的独有语法。
这样不管面试官熟不熟悉这个语言都很容易能看懂。
回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-14 22:31:06 | 只看该作者
全局:
jsj 发表于 2021-10-14 09:06
我个人还是偏爱通用的写法,尽量少用某种语言的独有语法。
这样不管面试官熟不熟悉这个语言都很容易能看懂 ...

是吗? 我的看法正好相反,除了那个Regex那个例子,其他的可读性都比通用写法更容易看懂。

一个从来没写过Java的人,看到下面这句也知道你要求数组的和把。
int sum = Arrays.stream(array).sum();

看到下面这句,不是一目了然要逆向排序吗?
Array.sort(arr, Comparator.reverseOrder())
回复

使用道具 举报

🔗
jsj 2021-10-14 23:04:41 | 只看该作者
全局:
david_smith 发表于 2021-10-14 10:31
是吗? 我的看法正好相反,除了那个Regex那个例子,其他的可读性都比通用写法更容易看懂。

一个从来没 ...

我有一次面试想排序一个2d array,比如{{1,3},{2,5},{1,2},{6,1}}  需要排成 {{1,2}, {1,3}, {2,5}, {6,1}}。也就是先比较第一个数,再比较第二个。
当时想用类似comparing, thenComparing 这个方法构建Comparator。 结果因为对使用方法不够熟练翻车了。

要不试试?
https://leetcode.com/playground/BmPpUqBk
回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-14 23:30:25 | 只看该作者
全局:
jsj 发表于 2021-10-14 10:04
我有一次面试想排序一个2d array,比如{{1,3},{2,5},{1,2},{6,1}}  需要排成 {{1,2}, {1,3}, {2,5}, {6,1 ...

也不一定每种情况下都用Java 自定义的Comparator
我一般这么写:
  1. Arrays.sort(arr, (a, b) -> a[0] == b[0] ?  Integer.compare(a[1], b[1]) : Integer.compare(a[0], b[0]));
复制代码

评分

参与人数 2大米 +2 收起 理由
14417335 + 1
jsj + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-15 00:07:10 | 只看该作者
全局:
tianxiaguixin 发表于 2021-10-13 23:37
感觉不是太常用啊,比如说leet上面,哪些题会用到regExp啊

LeetCode 819 你可以用Regex去分开一个String
  1. String[] words = paragraph.split("[^a-zA-Z]+");
复制代码

补充内容 (2021-10-15 20:34 +8:00):
paragraph = "Hello, this is David."

words = {"Hello", "this", "is", "David"}
回复

使用道具 举报

🔗
vvqqdd 2021-10-15 08:31:48 | 只看该作者
全局:
牛逼 plus
很多strema的操作我都不知道
回复

使用道具 举报

🔗
daydream1 2021-10-15 08:39:14 | 只看该作者
全局:
很常见的functional programming concepts。想学这些直接学functional programming就好了
回复

使用道具 举报

全局:
Java 8 stream 在日常工作中用的极度频繁,大概是想要趋近于Python,Scala那种语言精简性。

能写stream在面试时是加分项,没人在乎速度慢那么几ms。

写习惯了会觉得特别方便,尤其是对于list和map 的操作。不需要再搞for loop。
回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-15 11:39:13 | 只看该作者
全局:
第5个例子,LeetCode 刷题中,非常常见的,在一个String中统计每个字母出现的频率。或者一个String List中每个单词出现的频率,转换成一个Map。 用Stream 一行解决。
  1. import java.util.function.Function;
  2. import static java.util.stream.Collectors.counting;
  3. import static java.util.stream.Collectors.groupingBy;

  4.         List<String> wordsList = Arrays.asList("aa", "aa", "b", "cc", "cc", "cc");
  5.         Map<String, Long> word2frequency =
  6.                 wordsList.stream().collect(groupingBy(Function.identity(), counting()));

  7.         String str = "aabbbcc";
  8.         Map<Integer, Long> letter2frequency = str.chars().mapToObj(a->a).collect(groupingBy(Function.identity(), counting()));
复制代码

补充内容 (2021-10-15 20:33 +8:00):
word2frequency = { "aa" = 2, "b" = 1, "cc" = 3}

letter2frequency = {97 = 2, 98 = 3, 99 = 2}

补充内容 (2021-10-15 20:48 +8:00):
我倾向于把Function.identity()换成  a -> a,  前者要打接近20个字,后者只要4个,反正就是怎么简单怎么来。

补充内容 (2021-10-15 20:55 +8:00):
注意: 如果你在LeetCode 上刷题, 要主动加上, LeetCode 没有主动引入,同理,面试的时候,也要在HakerRank 加上

import static java.util.stream.Collectors.*;

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表