查看: 4256| 回复: 21
跳转到指定楼层
上一主题 下一主题
收起左侧

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

 
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 david_smith 于 2021-10-13 10:07 编辑

最近刷题的时候发现,一些小技巧可以节省编程时间,减少出错的概率,在面试中很有用。

不多说,直接上代码

1, 求数组最大值,最小值,和

  1. int[] array = {3,2,1,5,4};
  2. int sum = 0, min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;

  3. for (int i = 0; i < array.length; i++) {
  4.      sum += array[i];
  5.      min = Math.min(min, array[i]);
  6.      max = Math.max(max, array[i]);
  7. }
复制代码
上面的代码可以被替换为
  1. int sum = Arrays.stream(array).sum();
  2. int min = Arrays.stream(array).min().getAsInt();
  3. int max = Arrays.stream(array).max().getAsInt();
复制代码
2, 判断一个String是不是都是数字
  1. String str = "01223";
  2. boolean isAllDigit = true;
  3. for (int i = 0; i < str.length(); i++) {
  4.      if (str.charAt(i)  < '0' || str.charAt(i) > '9') {
  5.          isAllDigit = false;
  6.          break;
  7.      }
  8. }
复制代码
上面的代码可以被替换为, https://docs.oracle.com/javase/7 ... /regex/Pattern.html
  1. boolean isAllDigit = str.matches("\d*");
复制代码
暂时想到这两个,抛砖引玉,希望大家也分享一下类似的小技巧,真的在面试中很节约时间。


评分

参与人数 10大米 +16 收起 理由
mr_flyingsky + 1 赞一个
JoshuaSu + 1 给你点个赞!
井上拓 + 1 给你点个赞!
donoghl + 1 给你点个赞!
tangcb + 1 给你点个赞!

查看全部评分


上一篇:编程语言 API 对比
下一篇:有人实战中遇到过bitmask吗
 楼主| 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.*;

回复

使用道具 举报

推荐
 楼主| david_smith 2021-10-14 02:31:25 | 只看该作者
全局:
本帖最后由 david_smith 于 2021-10-13 13:37 编辑

3,数组排序
如果要对一个数组从小到大排序,很简单
  1. Arrays.sort(array);
复制代码
但是要从大到小排序呢? 你需要自己实现一个Comparator
  1. Arrays.sort(array, (a, b) -> b - a);
复制代码
面试中一紧张,记不清该是 b - a 还是a - b 了怎么办? 下面的写法会拯救你。
  1. Arrays.sort(array, Comparator.reverseOrder());
复制代码
同理还有建立最大堆
  1. PriorityQueue<Integer> maxHeap = PriorityQueue<>(Comparator.reverseOrder());
复制代码
4, 比较两个Double,
两个Double 并不能直接比较,因为10 / 2 可能是 4.999999999999, 有两种解决方法,推荐第二种。
  1. boolean isSame1 = Math.abs(a, b) < 0.00001;
  2. boolean isSame2 = Double.compare(a, b) == 0;
复制代码

评分

参与人数 2大米 +5 收起 理由
豌豆尖尖 + 1 赞一个
14417335 + 4

查看全部评分

回复

使用道具 举报

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

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

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

使用道具 举报

🔗
泊蚂蚁酱 2021-10-14 01:33:10 | 只看该作者
全局:
感谢分享,不过在leetcode刷题的时候,提交的结果里,用stream总是感觉比直接遍历慢点。。
回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-14 01:52:00 | 只看该作者
全局:
本帖最后由 david_smith 于 2021-10-13 12:55 编辑
泊蚂蚁酱 发表于 2021-10-13 12:33
感谢分享,不过在leetcode刷题的时候,提交的结果里,用stream总是感觉比直接遍历慢点。。

我主要是针对面试来说的,当你向面试官分析时间复杂度的时候,用Stream来取MIN MAX SUM,时间复杂度依然是O(N),  所以面试官不会介意stream额外的时间开销。

但是第二个例子,用Regex Match 应该的确是要慢点, 我猜如果没有预编译Pattern的话 String.matches() 是 O(mn), 相见 https://www.baeldung.com/java-regex-performance

但是面试的时候,你可以先使用.matches() ,明确告诉面试官,你知道这样做会更慢一点,这么写只是为了节约时间,如果面试官要求你优化这一点,你再使用之前那一种写法。
当然了,对于我举的第二个例子中,Regex 是非常短,长度只是2, 其实 O(2n)= O (n), 当你的Regex很短的话,这一点时间开销是可以接受的。
回复

使用道具 举报

全局:
max 和min调用的是反过来了吗?
回复

使用道具 举报

🔗
 楼主| david_smith 2021-10-14 03:24:42 | 只看该作者
全局:
Vickyroot 发表于 2021-10-13 14:21
max 和min调用的是反过来了吗?

我没有看懂你的问题
回复

使用道具 举报

🔗
freeaccount 2021-10-14 03:56:52 | 只看该作者
全局:
相对Arrays.asStream可能更偏好IntStream.of(或者其它类型的版本)
回复

使用道具 举报

🔗
tianxiaguixin 2021-10-14 12:37:45 | 只看该作者
全局:
感觉不是太常用啊,比如说leet上面,哪些题会用到regExp啊
回复

使用道具 举报

全局:
面试还是py香😋

评分

参与人数 2大米 +2 收起 理由
david_smith + 1 很有用的信息!
14417335 + 1

查看全部评分

回复

使用道具 举报

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

本版积分规则

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