开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
java数组是去重和排序的方式和js很类似,都可以通过set集合唯一性、for循环数据处理实现数组去重,sort函数实现数组排序。
1、set去重
Set支持两种常用实现方式:HashSet和TreeSet。HashSet是哈希表的实现,TreeSet是基于树结构实现。
// 写法一:
Set set = new HashSet(originList);
List list = new ArrayList(set);
// 写法二:
TreeSet set = new TreeSet(originList);
List list = new ArrayList();
list.addAll(set);
2、for循环
java的for循环写法和js很相似:
// 写法一:
for (初始化;布尔表达式;更新) {
// 代码语句
}
// 写法二:
for (声明语句;表达式) {
// 代码语句
}
// 写法一:
List list = new ArrayList();
for (int i = 0;i < originList.length;i++) {
if (!list.contains(originList[i])) {
list.add(originList[i]);
}
}
// 写法二:
List list = new ArrayList();
for (String str;originList) {
if (!list.contains(str)) {
list.add(str);
}
}
3、使用java8 stream API中的distinct函数去重
List list = new ArrayList();
list = originList.stream().distinct().collect(Collectors.toList());
需要注意的是:
- distinct是根据对象的equals方法去处理的,如果对象类没有覆盖超类Object的equals方法,就会使用Object的。Object的equals方法只有在两个对象完全相同时才会返回true。
- @Data注解可以默认重写Equals()和HashCode()
- @EqualsAndHashCode可以对Equals()和HashCode()进行操纵。@EqualsAndHashCode(callSuper=false,of={"userName"}),callSuper代表不往Equals()和HashCode()方法中加入父类属性,of指定比较的字段,exclude表示排除指定字段。
如果需要根据对象中某个属性不同去去重,还可以用filter方法:
originList.stream().filter(distinctByKey(Person::getUserName)).collect(Collectors.toList());
4、数组排序
最简单的排序方法
int[] arr = {1,5,6,3,8,4,2};
Arrays.sort(arr); // 默认升序排序
Arrays.sort(arr, (o1, o2) -> o2 - o1); // Lambda表达式写法,降序排序
部分排序法:
int[] arr = {1,5,6,3,8,4,2};
Arrays.sort(arr,1,4);
输出的结果为:1,3,5,6,8,4,2
其中sort的第二三个参数表示开始到结束排序的下标,只排序数组中1~4的下标。