按特定顺序对arraylist进行排序

时间:2015-05-06 08:41:05

标签: java sorting arraylist

我有一个类似下面的arraylist:

ArrayList<PhoneNumber> arrayListToSort 

PhoneNumber具有以下属性

private String number;

private String numberType;

数字类型类似于 MOBILE,HOME,OFFICE

我想按每个arrayListToSort排序numberType

我可以用简单的alphebetical命令做到这一点。

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

  1. MOBILE
  2. HOME
  3. OFFICE

8 个答案:

答案 0 :(得分:1)

嘿,您可以尝试 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);
    }

}
  

输出为:[PhoneNumber [number = 2,phonNumberType = MOBILE],   PhoneNumber [number = 1,phonNumberType = HOME],PhoneNumber [number = 3,   phonNumberType = OFFICE]]

答案 1 :(得分:0)

您的排名不是自然顺序。

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

顺便说一下,正如@Alexis C.所说,使用Enum作为numberType

答案 2 :(得分:0)

使用枚举:

public enum NumberType {
    MOBILE,HOME,OFFICE;
}

如果您的PhoneNumber具有可比性:

@Override
public int compareTo(PhoneNumber o) {
    return numberType.compareTo(o.numberType);
}

它将遵循枚举中描述的顺序:

MOBILE,HOME,OFFICE

答案 3 :(得分:0)

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

使用Comparator

在此方法中,您使用自定义ArrayListComparator进行排序。

这是Comparator代码。请注意它首先尝试对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;
    }
}

然后你可以打电话:

Comparator c = new PhoneNumberComparator();
arrayListToSort.sort (c)

现在,它本身不会完全起作用,因为numberType的排序只是字符串顺序。强制排序的最方便方法是将numberType设为enumeration。这是代码:

public enum NumberType { MOBILE, HOME, OFFICE }

然后必须定义PhoneNumber,以便numberTypeNumberType

public class PhoneNumber {
    public String number ;
    public NumberType numberType;

    // .......

}

(顺便说一下,我鼓励您将numbernumberType变为private变量,并根据JavaBeans standard添加getter方法。)

使PhoneNumber实施Comparable

如果您打算经常这样做,那么您应该Comparator实现PhoneNumber界面,而不是编写Comparable

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;
    }
}

然后你可以打电话:

arrayList.sort()

如第一种方法所述,您仍需要NumberType enum compareTo()。上述NumberType实施依赖于Comparable enum;所有Comparable个实例都会自动Comparator

请注意compareTo()Comparator实施之间的相似点和不同点。对Comparablequery ("webView") can be found here进行了很好的讨论。

答案 4 :(得分:0)

如果您使用NumberType enum而非String,则其compareTo()方法将根据声明枚举实例的顺序返回结果,不是按字母顺序排列:

public enum NumberType {
   MOBILE, HOME, OFFICE;
}

MOBILE现在小于HOMEHOME小于OFFICE。现在,您可以使用自定义比较器对集合进行排序:

list.sort(comparing(PhoneNumber::getNumberType).thenComparing(PhoneNumber::getNumber));

答案 5 :(得分:0)

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;


public class Main {
    public static void arrayListToSort(ArrayList<PhoneNumber> arrayListToSort) {
        Map<String, Integer> phoneTypeToOrder = new HashMap<>();
        phoneTypeToOrder.put("MOBILE", 0); 
        phoneTypeToOrder.put("HOME", 1);
        phoneTypeToOrder.put("OFFICE", 2);

        Collections.sort(arrayListToSort, new Comparator<PhoneNumber>() {

            @Override
            public int compare(PhoneNumber o1, PhoneNumber o2) {
                if (o1 == null || o1.numberType == null) {
                    return -1;
                }
                if (o2 == null || o2.numberType == null) {
                    return 1;
                }
                Integer o1Order = phoneTypeToOrder.get(o1.numberType);
                Integer o2Order = phoneTypeToOrder.get(o2.numberType);
                return o1Order.compareTo(o2Order);
            }

        });
    }
}

class PhoneNumber {
    String number;

    String numberType;
}

答案 6 :(得分:0)

我建议使用自定义&#34;排序方法&#34;叫做比较器。在此比较器中,您可以定义一个&#34;值&#34;对于每个将在运行时计算的记录。此值的计算完全取决于您。例如,您可以定义&#34; foo&#34; == 1,&#34; bar&#34; == 2和&#34;约翰&#34; == 654.然后Java的排序方法会询问每条记录的值&#34;值&#34;并相应地排序(我认为使用Quicksort算法,但我不确定这一点。)

这是一个很好的小教程,可以帮助您了解本主题并演示如何正确实现Comparator和Comparable-Interfaces: http://www.tutorialspoint.com/java/java_using_comparator.htm

这个更深入一点:http://www.journaldev.com/780/java-comparable-and-comparator-example-to-sort-objects

此外:如前所述,请为您的数字类型使用枚举。并不是因为它比较容易(imho),而是因为它比点击字符串更快更快。

答案 7 :(得分:0)

您可以使用TreeSet集合来对条目进行排序。

TreeSet<PhoneNumber> sortedList = new TreeSet<>((PhoneNumber p1, PhoneNumber p2) -> p1.compareTo(p2));

由于您必须为条目定义订单,因此您的PhoneNumber类必须实现Comparable接口,您需要覆盖compareTo()方法以表示您将在numberType上进行比较

public int compareTo(Object o) {
    PhoneNumber p = (PhoneNumber) o;
    return numberType.equals(o.getNumberType())?0:numberType.equals("MOBILE")?-1:1;
}

但是,如果您希望将来添加更多数字类型,最好使用enum