算法学习(一)——List对基本数据和集合内某一属性进行排序

对List进行排序主要是分为两种类型,一种是对基本数据类型的排序:
例如:

List<Integer> num = new ArrayList<Integer>();
            num.add(3);
            num.add(2);
            num.add(4);
            num.add(1);
            System.out.println(num);
            Collections.sort(num);
            System.out.println(num);

输出为: 1 2 3 4
另一种是对对象中某一属性进行排序:
例如,emp对象有 name,age属性
emp.java

package com.test;

public class emp {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public emp(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

}

test.java

public static void main(String[] args) {
        List<emp> list1 = new ArrayList<emp>();
        emp emp1 = new emp("张飞",23);
        emp emp2 = new emp("李四",24);
        emp emp3 = new emp("张b",21);
        list1.add(emp1);
        list1.add(emp2);
        list1.add(emp3);
        Collections.sort(list1,new Comparator<emp>() {

            @Override
            public int compare(emp e1, emp e2) {
                // TODO Auto-generated method stub
                return e1.getAge()-e2.getAge();
            }  
        });
         for(int i=0;i<list1.size();i++){
                System.out.println(list1.get(i).getName()+" "+list1.get(i).getAge());
            }
    }

那么对于emp的name属性如何进行排序呢?
我们可以依照上面的age属性,使用compareTo()对字符串进行比较。

public static void NameSort(List<emp> list) {
        Collections.sort(list,new Comparator<emp>() {

            @Override
            public int compare(emp e1, emp e2) {
                // TODO Auto-generated method stub
                return e1.getName().compareTo(e2.getName());
            }  
        });
         System.out.println("按照一般字符串对name排序:");
         for(int i=0;i<list.size();i++){

                System.out.println(list.get(i).getName()+" "+list.get(i).getAge());
            }
    }

对于汉字来说,有时候需要对汉字首字母进行排序,那么 就不能使用前面的方法了,需要引入java.text.Collator.getInstance()设置自定义排序规则,选择中国地区包java.util.Locale.CHINA并且需要将排序后的对象类型转换为java.text.RuleBasedCollator。代码如下:

public static void sortByRuleBasedCollator(List<emp> list){
        Collections.sort(list, new Comparator<emp>(){

            @Override
            public int compare(emp e1, emp e2) {
                // TODO Auto-generated method stub
                return ((java.text.RuleBasedCollator)java.text.Collator.getInstance(java.util.Locale.CHINA)).compare(e1.getName(), e2.getName());
            }

        });
         System.out.println("按照汉字首字母对name排序:");
         for(int i=0;i<list.size();i++){

                System.out.println(list.get(i).getName()+" "+list.get(i).getAge());
            }
    }

测试类如下:

public static void main(String[] args) {
        List<emp> list1 = new ArrayList<emp>();
        emp emp1 = new emp("张三",23);
        emp emp2 = new emp("李四",24);
        emp emp3 = new emp("王五",21);
        emp emp4 = new emp("李一",24);
        emp emp5 = new emp("王二",21);
        list1.add(emp1);
        list1.add(emp2);
        list1.add(emp3);
        list1.add(emp4);
        list1.add(emp5);
        System.out.println("排序前:");
         for(int i=0;i<list1.size();i++){

                System.out.println(list1.get(i).getName()+" "+list1.get(i).getAge());
            }
        NameSort(list1);    
        sortByRuleBasedCollator(list1); 
    }

结果:
排序前:
张三 23
李四 24
王五 21
李一 24
王二 21
按照age排序:
王五 21
王二 21
张三 23
李四 24
李一 24
按照一般方式对name排序:
张三 23
李一 24
李四 24
王二 21
王五 21
按照汉字首字母对name排序:
李四 24
李一 24
王二 21
王五 21
张三 23

猜你喜欢

转载自blog.csdn.net/hqh1129/article/details/81253981