List 的三种排序方式
数据准备
准备一个List,这里有四个变量,id,name,age,birthday;因为私有变量,所以需要添加一个访问的方法
public class UserBean {
private long id;
private String name;
private Integer age;
private String birthday;
public UserBean(long id,String name,Integer age,String birthday){
this.id=id;
this.name=name;
this.age=age;
this.birthday=birthday;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{"+
"name="+this.name+","+
"id="+this.id+","+
"age="+this.age+","+
"birthday="+this.birthday+
"}";
}
}
Comparator
这里使用了其实是重写了Collections的sort中的compare方法,如果o1.attributeValue>o2.attributeValue那么返回1,表示需要调整顺序,如果<的话就是不调整,所以这样下来就是一个升序的排序,反之就是降序了,固定的模式记着就可以了
public class OrderList {
public static List initUserBean() {
List<UserBean> userBeanList = new ArrayList<>();
userBeanList.add(new UserBean(1001, "alpha", 10, "2000/1/23"));
userBeanList.add(new UserBean(1002, "beta", 30, "1990/3/23"));
userBeanList.add(new UserBean(3003, "gamma", 23, "1993/1/12"));
userBeanList.add(new UserBean(4001, "delta", 43, "1973/7/30"));
userBeanList.add(new UserBean(9001, "epsilon", 9, "2001/11/28"));
userBeanList.add(new UserBean(522, "zeta", 19, "1999/4/7"));
for (UserBean userBean : userBeanList) {
System.out.println(userBean.getName());
}
return userBeanList;
}
public static void sortUserByComparator(List<UserBean> users) {
System.out.println("排序前的顺序");
for (UserBean user : users) {
System.out.println(user.toString());
}
System.out.println("排序后");
// NOTE 使用Collections 的工具类;
Collections.sort(users, new Comparator<UserBean>() {
@Override
public int compare(UserBean o1, UserBean o2) {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
} else {
return 0;
}
}
});
for (UserBean user : users) {
System.out.println(user.toString());
}
}
public static void main(String[] args) {
List<UserBean> userBeans = initUserBean();
sortUserByComparator(users);
}
}
stream
java 8以后加入的,使用这个更加方便,推荐
public class OrderList {
public static List initUserBean() {
List<UserBean> userBeanList = new ArrayList<>();
userBeanList.add(new UserBean(1001, "alpha", 10, "2000/1/23"));
userBeanList.add(new UserBean(1002, "beta", 30, "1990/3/23"));
userBeanList.add(new UserBean(3003, "gamma", 23, "1993/1/12"));
userBeanList.add(new UserBean(4001, "delta", 43, "1973/7/30"));
userBeanList.add(new UserBean(9001, "epsilon", 9, "2001/11/28"));
userBeanList.add(new UserBean(522, "zeta", 19, "1999/4/7"));
for (UserBean userBean : userBeanList) {
System.out.println(userBean.getName());
}
return userBeanList;
}
public static void sortUserByStream(List<UserBean> users) {
System.out.println("排序前");
for (UserBean user : users) {
System.out.println(user.toString());
}
System.out.println("正序后");
List<UserBean> newUsersAlpha = users.stream()
.sorted(Comparator.comparing(UserBean -> UserBean.getAge()))
.collect(Collectors.toList());
System.out.println("倒序后");
List<UserBean> newUserBeta = users.stream()
.sorted(Comparator.comparing(UserBean::getAge).reversed())
.collect(Collectors.toList());
for (UserBean user : newUserBeta) {
System.out.println(user.toString());
}
}
public static void main(String[] args) {
List<UserBean> userBeans = initUserBean();
sortUserByStream(userBeans);
}
}
Comparable
这里是用类调用了Comparable的接口来实现的,首先就是在类中重写了Comparable的compareTo( )的方法,
然后在调用的时候直接使用Collections.sort(object)来进行调用
类的实现如下:
public class User implements Comparable<User> {
private long id;
private String name;
private Integer age;
private String birthday;
public User(long id, String name, Integer age, String birthday) {
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"name=" + this.name + "," +
"id=" + this.id + "," +
"age=" + this.age + "," +
"birthday=" + this.birthday +
"}";
}
@Override
public int compareTo(User o) {
if(this.age>o.getAge()){
return 1;
} else if (this.age<o.getAge()) {
return -1;
}else {
return 0;
}
}
}
使用场景
public class OrderList {
public static List intiUser() {
/** 这里使用userBeanList 来替代本来的userList,不想改了*/
ArrayList<User> userBeanList = new ArrayList<>();
userBeanList.add(new User(1001, "alpha", 10, "2000/1/23"));
userBeanList.add(new User(1002, "beta", 30, "1990/3/23"));
userBeanList.add(new User(3003, "gamma", 23, "1993/1/12"));
userBeanList.add(new User(4001, "delta", 43, "1973/7/30"));
userBeanList.add(new User(9001, "epsilon", 9, "2001/11/28"));
userBeanList.add(new User(522, "zeta", 19, "1999/4/7"));
for (User userBean : userBeanList) {
System.out.println(userBean.getName());
}
return userBeanList;
}
public static void sortUserByComparable(ArrayList<User> userList) {
System.out.println("排序前");
for (User user : userList) {
System.out.println(user);
}
System.out.println("排序后");
List<User> sortedUserList = (List<User>) userList.clone();
Collections.sort(sortedUserList);//**这里就是直接调用就可以了,如果倒序的话需要到类中修改**
for (User user : sortedUserList) {
System.out.println(user);
}
}
public static void main(String[] args) {
List<User> users = intiUser();
sortUserByComparable((ArrayList<User>) users);
}
}
List的三种筛选方式
java8以后的stream
其实就是使用stream的filter
List<UserBean> userBeanFilterResult = userBeanList.stream()
.filter(UserBean -> UserBean.getAge() > 18)
.collect(Collectors.toList());
/** 为了防止很多对象有null的情况,那么在userBean.getAge() 会有空指针,
* 所以在前面加一个filter处理逻辑,*/
List<UserBean> finalUserBeanFilterResult=userBeanList.stream()
.filter(userBean -> Objects.nonNull(userBean))
// .filter(Objects::nonNull)
.filter(userBean -> userBean.getAge()>18)
.collect(Collectors.toList());
for(UserBean ele:userBeanFilterResult){
System.out.println(ele);
}
最基础的for循环
for and foreach
List<UserBean> userBeansFilterResult=new ArrayList<>();
for (UserBean element:userBeanList){
if(element.getAge()>18){
userBeansFilterResult.add(element);
}
}
for (UserBean ele:userBeansFilterResult){
System.out.println(ele);
}
/**
* 第二种for循环*/
List<UserBean> userBeansFilterResultBeta=new ArrayList<>();
userBeanList.forEach(element->{
if(element.getAge()>18){
userBeansFilterResultBeta.add(element);
}
});
for (UserBean ele:userBeansFilterResultBeta){
System.out.println(ele);
}
使用迭代器
这里就是for循环更底层的一种方式
List<UserBean> userBeansFilterResult=new ArrayList<>();
Iterator<UserBean>iterator=userBeanList.iterator();
while (iterator.hasNext()){
UserBean element=iterator.next();
if(element.getAge()>18){
userBeansFilterResult.add(element);
}
}
for (UserBean element : userBeansFilterResult) {
System.out.println(element);
}
List的去重
利用HashMap来进行去重
这里不知道为啥不直接用HashSet去重,其实使用HashSet 可能更方便。。。
public static List<UserBean> handleSameElementHashMap(List<UserBean> userBeansList) {
if (userBeansList == null || userBeansList.size() == 0) {
return userBeansList;
}
List<UserBean> list = new ArrayList<>();
Map<String, UserBean> userBeanMap = new HashMap<>();
userBeansList.forEach(userBean -> userBeanMap.put(userBean.getName(), userBean));
userBeanMap.forEach((s, userBean) -> list.add(userBean));
return list;
}
//调用
public static void alphaUniqueUserBean(){
/**第一种方法就是使用哈希来进行,利用hash的唯一性来进行去重
* 这里保存的是后面的,也就是使用覆盖的类型*/
List<UserBean>userBeanList=initUserBeanList();
List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementHashMap(userBeanList);
uniqueUserBeanList.forEach(System.out::println);
}
使用HashSet来进行去重
这里不知道为啥非要加一个optional来进行,虽然是我自己写的,但是真的不知道ide为啥要给个这个提示。
public static List<UserBean> handleSameElementByHashSet(List<UserBean>userBeanList){
if(null==userBeanList||userBeanList.size()==0){
return userBeanList;
}
Set<String> hashSet=new HashSet<>();
userBeanList.forEach(userBean -> hashSet.add(userBean.getName()));
System.out.println(hashSet);
// List<UserBean> filteredUserBeanList=userBeanList.stream()
// .filter(userBean -> hashSet.contains(userBean.getName()))
// .collect(Collectors.toList());
// System.out.println(filteredUserBeanList);
List<Optional<UserBean>> filteredUserBenList=new ArrayList<>();
// System.out.println(testUserBean);
hashSet.forEach(element->filteredUserBenList.add(userBeanList.stream().filter(ele->ele.getName().equals(element)).findFirst()));
System.out.println(filteredUserBenList);
return userBeanList;
}
public static void deltaUniqueUserBean(){
/**这里使用HashSet来进行处理
* */
List<UserBean>userBeanList=initUserBeanList();
UniqueueList.handleSameElementByHashSet(userBeanList);
}
利用TreeSet()来进行去重
public static List<UserBean> handleSameElementByTreeSet(List<UserBean> userBeanList) {
if (userBeanList.size() > 0 && userBeanList != null) {
Set<UserBean> set = new TreeSet<>(new Comparator<UserBean>() {
@Override
public int compare(UserBean o1, UserBean o2) {
return o1.getName().compareTo(o2.getName());
}
});
set.addAll(userBeanList);
return new ArrayList<UserBean>(set);
}
return userBeanList;
}
public static void betaUniqueUserBean(){
/** 第二种是使用treeSet来
* 后面这两个都是使用保存第一个的方式*/
List<UserBean>userBeanList=initUserBeanList();
List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementByTreeSet(userBeanList);
uniqueUserBeanList.forEach(System.out::println);
}
第三种是使用stream来进行处理–有点难懂
public static void gammaUniqueUserBean(){
/**使用stream来进行解决*/
List<UserBean>userBeanList=initUserBeanList();
List<UserBean>uniqueUserBeanList=UniqueueList.handleSameElementByStream(userBeanList);
uniqueUserBeanList.forEach(System.out::println);
}
public static List<UserBean> handleSameElementByStream(List<UserBean> userBeanList) {
if (null == userBeanList || userBeanList.size() == 0) {
return userBeanList;
}
List<UserBean> list = userBeanList.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(UserBean::getName)))
, ArrayList::new));
return list;
}
对象的分组
根据对象的某一个属性对对象进行分组
public static void listGroupedByStream(List<UserBean>userBeanList){
Map<String,List<UserBean>> result= (Map<String, List<UserBean>>) userBeanList.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(UserBean::getGrade));
for(Map.Entry<String ,List<UserBean>> element:result.entrySet()){
System.out.println(element);
}
// System.out.println(result);
}
求均值
Double aveResult;
aveResult=userBeanList.stream().filter(Objects::nonNull)
.mapToDouble(UserBean::getChineseScore).average()
.orElseThrow(IllegalArgumentException::new);
System.out.println(aveResult);
}