Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按特定顺序对arraylist排序_Java_Sorting_Arraylist - Fatal编程技术网

Java 按特定顺序对arraylist排序

Java 按特定顺序对arraylist排序,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个arraylist,如下所示: ArrayList<PhoneNumber> arrayListToSort ArrayList ArrayList排序 PhoneNumber具有以下属性 私有字符串编号 私有字符串numberType 号码类型类似于移动电话、家庭电话、办公室电话 我想按每个的numberType排序arrayListToSort 我可以用简单的alphebetic顺序来做这件事 但我的问题是如何按照顺序对列表进行排序 流动的 家 办公室 你的排名不是

我有一个arraylist,如下所示:

ArrayList<PhoneNumber> arrayListToSort 
ArrayList ArrayList排序
PhoneNumber具有以下属性

私有字符串编号

私有字符串numberType

号码类型类似于移动电话、家庭电话、办公室电话

我想按每个的
numberType
排序
arrayListToSort

我可以用简单的alphebetic顺序来做这件事

但我的问题是如何按照顺序对列表进行排序

  • 流动的
  • 办公室

  • 你的排名不是自然规律

    要获得目标结果,必须定义自己的比较器

    顺便说一句,正如@Alexis C.所说的,为您的numberType使用枚举

    使用枚举:

    public enum NumberType {
        MOBILE,HOME,OFFICE;
    }
    
    public enum NumberType { MOBILE, HOME, OFFICE }
    
    public int compareTo(Object o) {
        PhoneNumber p = (PhoneNumber) o;
        return numberType.equals(o.getNumberType())?0:numberType.equals("MOBILE")?-1:1;
    }
    
    如果您的电话号码具有可比性:

    @Override
    public int compareTo(PhoneNumber o) {
        return numberType.compareTo(o.numberType);
    }
    
    它将遵循枚举中描述的顺序:

    MOBILE,HOME,OFFICE
    

    有两种方法可以做到这一点

    使用 在这种方法中,可以使用自定义的
    比较器对
    ArrayList
    进行排序

    这是
    比较器
    代码。请注意,它首先尝试按
    numberType
    排序,然后按
    number
    排序:

    public class PhoneNumberComparator implements Comparator<PhoneNumber> {
        @Override
        public int compareTo (PhoneNumber lhs, PhoneNumber rhs) {
            int result = lhs.numberType.compareTo(rhs.numberType);
            if (result == 0) {
                result = lhs.number.compareTo(rhs.number);
            }
            return result;
        }
    }
    
    现在单靠它本身,这并不能完全起作用,因为
    numberType
    的排序只是按字符串顺序排列的。实施排序最方便的方法是将
    numberType
    。以下是代码:

    public enum NumberType {
        MOBILE,HOME,OFFICE;
    }
    
    public enum NumberType { MOBILE, HOME, OFFICE }
    
    然后必须定义
    PhoneNumber
    ,以便
    numberType
    numberType

    public class PhoneNumber {
        public String number ;
        public NumberType numberType;
    
        // .......
    
    }
    
    (顺便说一句,我鼓励您也将
    number
    numberType
    设置为
    private
    变量,并根据添加getter方法。)

    使
    PhoneNumber
    实现 如果您计划经常进行此排序,则不应编写
    比较器
    ,而应使
    电话号码
    实现
    可比
    界面:

    public class PhoneNumber implements Comparable <PhoneNumber> {
        public String number ;
        public NumberType numberType;
    
        // .......
    
        @Override
        public int compareTo (PhoneNumber rhs) {
            int result = this.numberType.compareTo(rhs.numberType);
            if (result == 0) {
                result = this.number.compareTo(rhs.number);
            }
            return result;
        }
    }
    
    您仍然需要将
    NumberType
    设置为
    enum
    ,如第一种方法中所述。上述
    compareTo()
    实现依赖于
    NumberType
    具有
    可比性
    ;所有
    enum
    实例都会自动进行
    比较


    请注意
    Comparator
    compareTo()
    实现之间的相似性和差异。关于
    Comparator
    Comparable
    的详细讨论如果将
    NumberType
    enum
    ,而不是
    String
    ,则其
    compareTo()
    方法将根据声明枚举实例的顺序返回结果,而不是按字母顺序:

    public enum NumberType {
       MOBILE, HOME, OFFICE;
    }
    
    MOBILE
    现在小于
    HOME
    HOME
    小于
    OFFICE
    。现在,您可以使用自定义比较器对集合进行排序:

    list.sort(comparing(PhoneNumber::getNumberType).thenComparing(PhoneNumber::getNumber));
    
    import java.util.ArrayList;
    导入java.util.Collections;
    导入java.util.Comparator;
    导入java.util.HashMap;
    导入java.util.Map;
    公共班机{
    公共静态无效ArrayList排序(ArrayList ArrayList排序){
    Map phoneTypeToOrder=新HashMap();
    phoneTypeToOrder.put(“移动”,0);
    phoneTypeToOrder.put(“HOME”,1);
    电话类型为order.put(“OFFICE”,2);
    Collections.sort(arrayListToSort,newcomparator(){
    @凌驾
    公共整数比较(电话号码o1,电话号码o2){
    if(o1==null | | o1.numberType==null){
    返回-1;
    }
    if(o2==null | | o2.numberType==null){
    返回1;
    }
    整数o1Order=phoneTypeToOrder.get(o1.numberType);
    整数O2Oorder=phoneTypeToOrder.get(o2.numberType);
    返回o1Order.compareTo(o2Order);
    }
    });
    }
    }
    类电话号码{
    字符串编号;
    字符串数字类型;
    }
    
    我建议使用一种称为Comparator的定制“排序方法”。在这个比较器中,您为每个记录定义一个“值”,该值将在运行时计算。这个值的计算完全取决于您。例如,您可以定义“foo”==1、“bar”==2和“john”==654。然后,Java的排序方法将要求每条记录的“值”,并相应地进行排序(我认为使用快速排序算法,但我不确定这一点)

    下面是一个很好的小教程,让您了解这个主题,并展示如何正确实现Comparator和Comparable接口:

    这一个更深入一点:


    此外:如前所述,对数字类型使用枚举。不是因为比较枚举更容易(imho),而是因为比较枚举比比较字符串快得多。

    嘿,你可以尝试PhonNumberType with enum检查下面的代码

     package test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    enum PhonNumberType {
        MOBILE, HOME, OFFICE
    }
    
    class PhoneNumber implements Comparable<PhoneNumber> {
        private String number;
        private PhonNumberType phonNumberType;
    
        @Override
        public int compareTo(PhoneNumber o) {
            return this.phonNumberType.compareTo(o.phonNumberType);
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    
        public PhonNumberType getNumberType() {
            return phonNumberType;
        }
    
        public void setNumberType(PhonNumberType phonNumberType) {
            this.phonNumberType = phonNumberType;
        }
    
    
        @Override
        public String toString() {
            return "PhoneNumber [number=" + number + ", phonNumberType=" + phonNumberType + "]";
        }
    
    }
    
    public class T {
    
        public static void main(String[] args) {
            List<PhoneNumber> test = new ArrayList<PhoneNumber>();
            PhoneNumber pn = new PhoneNumber();
            pn.setNumber("1");
            pn.setNumberType(PhonNumberType.HOME);
    
            test.add(pn);
    
            pn = new PhoneNumber();
            pn.setNumber("2");
            pn.setNumberType(PhonNumberType.MOBILE);
            test.add(pn);
    
            pn = new PhoneNumber();
            pn.setNumber("3");
            pn.setNumberType(PhonNumberType.OFFICE);
            test.add(pn);
    
            Collections.sort(test);
    
            System.out.println(test);
        }
    
    }
    
    封装测试;
    导入java.util.ArrayList;
    导入java.util.Collections;
    导入java.util.List;
    枚举PhonNumberType{
    移动电话、家庭、办公室
    }
    类PhoneNumber实现了可比较的{
    私有字符串编号;
    私人电话号码类型电话号码类型;
    @凌驾
    公共整数比较(电话号码o){
    返回此.phonNumberType.compareTo(o.phonNumberType);
    }
    公共字符串getNumber(){
    返回号码;
    }
    公共无效集合号(字符串号){
    这个数字=数字;
    }
    公用电话号码类型getNumberType(){
    返回phonNumberType;
    }
    public void setNumberType(PhonNumberType PhonNumberType){
    this.phonNumberType=phonNumberType;
    }
    @凌驾
    公共字符串toString(){
    返回“PhoneNumber[number=“+number+”,phonNumberType=“+phonNumberType+””;
    }
    }
    公共T类{
    公共静态void main(字符串[]args){
    列表测试=新建ArrayList();
    PhoneNumber pn=新的PhoneNumber();
    pn.设定编号(“1”);
    pn.setNumberType(PhonNumberType.HOME);
    试验。添加(pn);
    pn=新电话号码();
    pn.设定编号(“2”);
    pn.setNumberType(PhonNumberType.MOBI
    
    TreeSet<PhoneNumber> sortedList = new TreeSet<>((PhoneNumber p1, PhoneNumber p2) -> p1.compareTo(p2));
    
    public int compareTo(Object o) {
        PhoneNumber p = (PhoneNumber) o;
        return numberType.equals(o.getNumberType())?0:numberType.equals("MOBILE")?-1:1;
    }