java中对List进行分组和排序
排序
对List进行排序,有两种办法
第一个是用java提供的工具类Collections提供的sort方法进行排序
废话不多说,上代码
首先定义一个Student
public class Student {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
}
下面是进行排序的代码
public static void main(String[] args) {
List<Student> list= new ArrayList<Student>();
list.add(new Student(5, "aa"));
list.add(new Student(7, "bb"));
list.add(new Student(6, "cc"));
Collections.sort(list,new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
//会把集合里面的对象两两传进方法里面比较,这里比较age,降序就O2-O1,升序就O1-O2
return o2.getAge()-o1.getAge();
}
});
//打印list每一项的age
list.forEach(a -> System.out.println(a.getAge()));
}
}
第二种方法:
List集合提供了sort方法,依然用Student做集合,进行排序
public static void main(String[] args) {
List<Student> list= new ArrayList<Student>();
list.add(new Student(5, "aa"));
list.add(new Student(7, "bb"));
list.add(new Student(6, "cc"));
//差别在这里,这里直接用list的sort方法,不需要吧list作为参数,其他的和Comparable排序是一样的
list.sort(new Comparator<Student>(){
@Override
public int compare(Studento1, Studento2) {
//会把集合里面的对象两两传进方法里面比较,这里比较age,降序就O2-O1,升序就O1-O2
return o2.getAge()-o1.getAge();
}
});
//打印list每一项的age
list.forEach(a -> System.out.println(a.getAge()));
}
}
对list进行分组:
同样的,用Student的集合作为示例,代码如下
public class test2 {
/**
* 创建比较器
*/
public static <T> List<List<T>> dividerList(List<T> list,Comparator<? super T> comparator) {
List<List<T>> lists = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
boolean isContain = false;
for (int j = 0; j < lists.size(); j++) {
if (lists.get(j).size() == 0||comparator.compare(lists.get(j).get(0),list.get(i)) == 0) {
lists.get(j).add(list.get(i));
isContain = true;
break;
}
}
if (!isContain) {
List<T> newList = new ArrayList<>();
newList.add(list.get(i));
lists.add(newList);
}
}
return lists;
}
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
//实在不会起名字,用字母代替吧
list.add(new Student(17,"aa"));
list.add(new Student(15,"bb"));
list.add(new Student(16,"cc"));
list.add(new Student(15,"dd"));
list.add(new Student(16,"ee"));
list.add(new Student(17,"ff"));
List<List<Student>> list2 = dividerList(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 按年龄分组,这里注意一点,返回的值为0,就会认为这两个Studeng是一组的,返回其他值,则认为不是,所以下面的-1可以替换为任意非0数字
return o1.getAge == o2.getAge ? 0:-1;
//也可以按照姓名分组,返回结果如下,因为是比较两个值是否相等,所以先后是没有区别的
//return o1.getName().compareTo(o1.getName())
}
});
for(List<Student> stList: list2){
stList.forEach(a -> System.out.printIn(a.getName+":"+a.getAge));
System.out.printIn("=========================================");
}
}
}
java中对List进行分组和排序的更多相关文章
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- JAVA中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...
- AJPFX关于Java中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...
- Java基础知识强化12:Java中运用数组的四种排序方法
1.使用JavaApi文档中的Arrays类中的sort()进行快速排序 首先我们直接看代码如下: package himi.text; import java.util.Arrays; public ...
- java中Collections.sort()方法实现集合排序
1.Integer/String泛型的List进行排序 List <Integer> integerlist = new ArrayList<Integer>(); //定 ...
- 十七、Java中数组常见的几种排序方法!
转载自:https://www.cnblogs.com/bekeyuan123/p/6891875.html 数组的定义: // 3种定义方式 int[] arr = new int[5]; int[ ...
- JAVA中,数组的操作与排序
自己写了正向反向的冒泡排序,还用了静态和NEW方法实现. import java.util.Arrays; public class HelloJava { public static void ma ...
- java中实现Comparable接口实现自定义排序
class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg ...
- Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
随机推荐
- HDU - 1495 非常可乐 【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路 首先 如果可乐的体积 是奇数 那么是无解的 然后 如果能够得到两杯 都是一般容量的可乐 那 ...
- bind(),live(),delegate(),on()绑定事件方式
1.bind():向匹配元素添加一个或多个事件处理器. 适用所有版本,但是自从jquery1.7版本以后bind()函数推荐用on()来代替. $(selector).bind(event,data, ...
- vector缩减容量
在C++标准库容器vector的容量是不会自动的缩减的,也就是说删除元素操作,其引用.指针.迭代器也会继续有效.那么当在一个较大的vector中删除了大量的元素之后,其实际的size比较小,而其cap ...
- 在EditText插入表情,并发送表情
在EditText插入表情,点击发送按钮,将qq表情显示在TextView中: [mw_shl_code=java,true]public class EditTextActivity extends ...
- 使用谷歌浏览器进行Web开发技巧
1.为了避免缓存影响开发,使用使用那个“Ctrl+Shift+N”进入浏览器的隐身模式
- 前端多媒体(4)—— video标签全面分析
测试地址:https://young-cowboy.github.io/gallery/html5_video/index.html 属性 一些属性是只读的,一些属性是可以修改从而影响视频播放的. a ...
- 网络编程学习笔记-全零网络IP地址0.0.0.0详谈
RFC: - Addresses in this block refer to source hosts on "this" network. Address may be use ...
- UOJ_21_【UR #1】缩进优化_数学
UOJ_21_[UR #1]缩进优化_数学 题面:http://uoj.ac/problem/21 最小化$\sum\limits{i=1}^{n}a[i]/x+a[i]\;mod\;x$ =$\su ...
- javacpp-FFmpeg系列之3: 像素图像数据转换(BGR与BufferdImage互转,RGB与BufferdImage互转,BufferdImage转Base64编码)
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- Lagom学习 五 Hello world工程
用Maven创建一个Hello world的Lagom工程: 1: 在想创建工程的目下下,打开CMD 2: mvn archetype:generate -Dfilter=com.lightbend ...