一:集合排序

最近在写代码的时候,突然要对集合进行排序,但是一时之间却想不起来了。于是又回去翻看了基础然后整理了一下
   1.可以使用Collections工具类中的sort方法,但是这个方法如果我们ArrayList集合中存的是自己    创建的对象的话,我们要实现一个Comparable接口,然后覆写其中的compareTo方法
先来看看最简单的集合中存Integer

public class ArrayListTest {
   public static void main(String[] args) {
       List<Integer> list = new ArrayList<Integer>();
       list.add(6);
       list.add(8);
       list.add(4);
       list.add(3);
       list.add(10);
       list.add(5);
       System.out.println("----排序之前----");
       System.out.println(list);
       Collections.sort(list);
       System.out.println("----排序之后----");
       System.out.println(list);
   }
}

结果如下

Java对List的map进行排序 list中map排序_数据结构

然后再来看看集合中存对象的
先来看看Worker对象

class Worker implements Comparable<Worker> {

        private String name;
        private int age;
        private int salary;

        public Worker(String name, int age, int salary) {
            this.name = name;
            this.age = age;
            this.salary = salary;
        }

        @Override
        public String toString() {
            return "Worker{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", salary=" + salary +
                    '}';
        }

     //getter方法
     //setter方法
 
 /**
 1. 先按照年龄,年龄一样,在按照薪资排序
 **/    
        @Override
        public int compareTo(Worker o) {
            if(o.getAge() > this.age){
                return 1;
            }else if(o.getAge() < this.age){
                return -1;
            }else{
                if (o.getSalary() > this.salary){
                    return 1;
                }else if(o.getSalary() < this.salary){
                    return -1;
                }else {
                    return 0;
                }
            }
        }
    }

 再来看测试代码

public class ArrayListTest {
    public static void main(String[] args) {
        List<Worker> list = new ArrayList<>();
        list.add(new Worker("张三",23,5000));
        list.add(new Worker("张四",24,6000));
        list.add(new Worker("张五",25,3000));
        list.add(new Worker("张八",25,6000));
        list.add(new Worker("张六",21,4000));
        list.add(new Worker("张七",21,8000));
        System.out.println("----排序之前----");
        list.forEach(System.out::println);
        Collections.sort(list);
        System.out.println("----排序之后----");
        list.forEach(System.out::println);
    }
}

结果如下

Java对List的map进行排序 list中map排序_list_02

或者使用匿名内部类方式:不需要在实体中实现comparable

下面两种方式均可!!!

Java对List的map进行排序 list中map排序_Java对List的map进行排序_03

 

2. 还可以利用stream().sorted()来进行排序,和Collections工具类中的sort方法一样,如果我们ArrayList集合中存的是自己创建的对象的话,我们要实现一个Comparable接口,然后覆写其中的compareTo方法

list = list.stream().sorted().collect(Collectors.toList());

二:Map排序(按key排序,按value排序)

主要分两种,按键排序、按值排序。 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用。

2.1、按键排序

按Key排序主要用于TreeMap,可以实现按照Key值的大小,在对象插入时直接插入到合适的位置,保持Map的顺序性。

来看TreeMap的构造函数:TreeMap(Comparator<? super K> comparator):构造一个新的、空的树映射,该映射根据给定比较器进行排序。

这里的比较器是key的比较器。所以定义比较器时用于比较的两个参数是Key的数据类型的对象。

实例代码如下:

public class MapSortTest {

public static void main(String[] args) {
  Map<String,String> stu=new TreeMap<>(new MyComparator());//传进来一个key的比较器对象来构造treemap
  stu.put("apple", "55");
  stu.put("boy", "32");
  stu.put("cat", "22");
  stu.put("dog", "12");
  stu.put("egg", "11");
  //map的遍历:把key抽取出来用set存放,然后用迭代器遍历keyset,同时用map.get(KEY)获取key所对应的value。

  Set<String> keySet=stu.keySet();
  Iterator it=keySet.iterator();
  while (it.hasNext()) {
    String next = (String)it.next();
    System.out.println(next+","+stu.get(next)); 
      } 
  }
}

//定义key的比较器,比较算法根据第一个参数o1,小于、等于或者大于o2分别返回负整数、0或者正整数,来决定二者存放的先后位置:返回负数则o1在前,正数则o2在前。
class MyComparator implements Comparator<String>{
  public int compare(String o1, String o2) {
    return o1.compareTo(o2); 
  }
}

2.2、按值排序

与按值排序只使用TreeMap不同,按值排序由于其方法所用到的类型的统一性,所以能用于Map的所有子类

主要用到的知识点有:

1:map.entrySet()将map里的每一个键值对取出来封装成一个Entry对象并存放到一个Set里面。

2:泛型Map.Entry<type1,type2> 因为Key-value对组成Entry对象,此处指明Entry对象中这两个成员的数据类型。

3:Collections.sort(List list, Comparator<? super T> c) 集合类的排序方法,通过自定义的比较器进行排序。这里的list存放的对象是entry对象。定义比较器对entry对象中的value属性进行比较。

实例代码如下:

public class MapSortTest {
  public static void main(String[] args) {
    Map<String,String> stu=new TreeMap<>();//用TreeMap储存

    // Map<String,String> stu=new HashMap<>();//用HashMap储存

    stu.put("apple", "55");
    stu.put("boy", "32");
    stu.put("cat", "22");
    stu.put("dog", "12");
    stu.put("egg", "11");

    //1:把map转换成entryset,再转换成保存Entry对象的list。
    List<Map.Entry<String,String>> entrys=new ArrayList<>(stu.entrySet());
    //2:调用Collections.sort(list,comparator)方法把Entry-list排序
    Collections.sort(entrys, new MyComparator());
    //3:遍历排好序的Entry-list,可得到按顺序输出的结果
    for(Map.Entry<String,String> entry:entrys){
      System.out.println(entry.getKey()+","+entry.getValue());
        }
      }
  }

  //自定义Entry对象的比较器。每个Entry对象可通过getKey()、getValue()获得Key或Value用于比较。换言之:我们也可以通过Entry对象实现按Key排序。
  class MyComparator implements Comparator<Map.Entry>{
    public int compare(Map.Entry o1, Map.Entry o2) {
      return ((String)o1.getValue()).compareTo((String)o2.getValue());
      } 
    }