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