java数组去重、排序

118 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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的下标。