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("=========================================");
    }

} }

 

转载于:https://www.cnblogs.com/mywood/p/7568875.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java 8的Stream API和Collectors工具类来实现集合分组并按照数量排序的操作。具体步骤如下: 1. 使用`Collectors.groupingBy`方法对集合进行分组分组的依据可以是元素本身或者根据某个属性进行分组。例如,以下代码将一个字符串集合按照首字母进行分组: ``` Map<Character, List<String>> groupMap = list.stream() .collect(Collectors.groupingBy(s -> s.charAt(0))); ``` 2. 使用`Collectors.counting`方法对分组后的每个组进行计数,得到每个组的元素数量。例如,以下代码将上一步得到的分组Map按照组内元素数量进行计数: ``` Map<Character, Long> countMap = groupMap.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> (long) e.getValue().size() )); ``` 3. 使用Java 8新的`Comparator`接口,定义一个按照Map值的大小进行排序的比较器。例如,以下代码定义一个按照countMap值的大小进行排序的比较器: ``` Comparator<Character> comparator = Comparator.comparing(countMap::get); ``` 4. 使用`Collectors.toMap`方法将排序后的结果转换为一个新的Map。例如,以下代码将countMap按照值的大小进行排序,并将结果保存在一个新的Map: ``` Map<Character, Long> sortedMap = countMap.entrySet().stream() .sorted(Map.Entry.comparingByValue(comparator.reversed())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new )); ``` 最后,得到的`sortedMap`就是按照分组后每个组的元素数量进行排序的结果。 完整代码示例: ``` List<String> list = Arrays.asList("apple", "banana", "cat", "dog", "elephant", "fig", "goat", "hippo"); Map<Character, List<String>> groupMap = list.stream() .collect(Collectors.groupingBy(s -> s.charAt(0))); Map<Character, Long> countMap = groupMap.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, e -> (long) e.getValue().size() )); Comparator<Character> comparator = Comparator.comparing(countMap::get); Map<Character, Long> sortedMap = countMap.entrySet().stream() .sorted(Map.Entry.comparingByValue(comparator.reversed())) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new )); System.out.println(sortedMap); // 输出: {e=2, a=1, b=1, c=1, d=1, f=1, g=1, h=1} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值