如何创建自定义订单以对Java字符串电话号码进行排序?

如何创建自定义订单以对Java字符串电话号码进行排序?,java,string,list,sorting,collections,Java,String,List,Sorting,Collections,我有一个Java字符串电话号码列表&我需要根据他们的运营商分类,比如“013…”和“017…”它们都是相同的运营商号码 List<String> phoneNumberList = new ArrayList<String>(); phoneNumberList.add("01313445566"); phoneNumberList.add("01414556677"); phoneNumberList.add("01515667788"); phoneNumberLis

我有一个Java字符串电话号码列表&我需要根据他们的运营商分类,比如“013…”和“017…”它们都是相同的运营商号码

List<String> phoneNumberList = new ArrayList<String>();
phoneNumberList.add("01313445566");
phoneNumberList.add("01414556677");
phoneNumberList.add("01515667788");
phoneNumberList.add("01616778899");
phoneNumberList.add("01717889900");
phoneNumberList.add("01818990011");
phoneNumberList.add("01919001122");
但我想用自定义顺序打印它们-

01313445566,
01717889900

01414556677,
01919001122

01515667788

01616778899

01818990011


如何创建自定义订单以根据我的要求进行排序?

您可以尝试使用自定义比较器进行排序:

Collections.sort(phoneNumberList, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        boolean s1Match = s1.matches("01[3479].*");
        boolean s2Match = s2.matches("01[3479].*");
        if (s1Match && !s2Match) {
            return -1;
        }
        else if (!s1Match && s2Match) {
            return 1;
        }
        else {
            return s1.compareTo(s2);
        }
    }
});

System.out.println(phoneNumberList);

对于以
013
014
017
019
开头的数字,表达式
String#matches(“01[3479].*)
将返回true。因此,自定义比较器将首先放置这些数字,然后是所有其他数字。在打领带的情况下,将使用自然的字符串顺序(这里应该可以,因为数字都具有相同的宽度)。

在地图中定义您的首选顺序

Map<String,Integer> order = new HashMap<>();
order.put("013", 1);
order.put("017", 2);
order.put("014", 3);
order.put("019", 4);
order.put("015", 5);
order.put("016", 6);
order.put("018", 7);
更新:适用于java 6

    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String e1, String e2) {
            return order.get(e1.substring(0,3)).compareTo(order.get(e2.substring(0,3)));
        }
    });
Collections.sort(列表,新比较器(){
@凌驾
公共整数比较(字符串e1、字符串e2){
返回order.get(e1.子字符串(0,3)).compareTo(order.get(e2.子字符串(0,3));
}
});

注意:如果地图中存在前缀,它将起作用。

一个可能的解决方案是将对象用于电话号码

考虑以下代码:

public class PhoneNumber implements Comparable{

    private int operatorId;
    private String phoneNumber;

    private static final int GRAMEENPHONE = 1;
    private static final int VERIZON = 2;

    public PhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
        char thirdDigit = phoneNumber.charAt(2);
        if(thirdDigit == '7' || thirdDigit == '3') {
            operatorId = GRAMEENPHONE;
        } else if(thirdDigit == '4' || thirdDigit == '9') {
            operatorId = VERIZON;
        } else {
            operatorId = 10; // a default value
        }
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    @Override
    public int compareTo(Object o) {
        PhoneNumber pNumber = (PhoneNumber) o;
        if(this.operatorId == pNumber.operatorId) {
            return this.phoneNumber.compareTo(pNumber.getPhoneNumber());
        }
        return this.operatorId - pNumber.operatorId;
    }
}
此代码中的主要技巧是
运算符id
。这是一个代表不同移动运营商/运营商公司的数字。此值用于
compareTo()
方法。其值用于确定哪家运营商/承运人公司的编号应位于顶部

所以电话号码列表的代码应该是这样的:

List<PhoneNumber> phoneNumberList = new ArrayList<PhoneNumber>();
phoneNumberList.add(new PhoneNumber("01313445566"));
phoneNumberList.add(new PhoneNumber("01414556677"));
phoneNumberList.add(new PhoneNumber("01515667788"));
phoneNumberList.add(new PhoneNumber("01616778899"));
phoneNumberList.add(new PhoneNumber("01717889900"));
phoneNumberList.add(new PhoneNumber("01818990011"));
phoneNumberList.add(new PhoneNumber("01919001122"));
Collections.sort(phoneNumberList);
List phoneNumberList=new ArrayList();
添加(新电话号码(“01313445566”);
添加(新电话号码(“01414556677”);
添加(新电话号码(“01515667788”);
添加(新电话号码(“01616778899”);
添加(新电话号码(“01717889900”);
添加(新的电话号码(“01818990011”);
添加(新电话号码(“01919001122”);
Collections.sort(phoneNumberList);
好的,您可以使用来定义自己的规则

String customRules = "<013<017<014<019<015<016<018";
输出:

01313445566
01717889900
01414556677
01919001122
01515667788
01616778899
01818990011

我不明白定制订单。你能解释一下你在这里期望的顺序吗?忘记自定义顺序,请告诉我如何排序,如“013…”、“017…”、“014…”、“019…”等等。假设你能提供一种方法,将每个前缀映射到其正确的排序顺序(例如,013->1014->3017->2019->4),应该可以编写一个自定义的
比较器来完成这项工作。根据前三个字符设置一个映射顺序值。在comparator中,比较从映射中获取的顺序值。您要根据什么条件进行排序?表达式字符串#匹配(“01[3749].*)不返回以013、017、014和019开头的numers。我需要这样。嗨,埃克拉维亚,谢谢你的贡献。请将lambda表达式转换为java 6代码好吗?请@为Java6更新的BizibuildProfessionalBuilder应该可以工作。
List<PhoneNumber> phoneNumberList = new ArrayList<PhoneNumber>();
phoneNumberList.add(new PhoneNumber("01313445566"));
phoneNumberList.add(new PhoneNumber("01414556677"));
phoneNumberList.add(new PhoneNumber("01515667788"));
phoneNumberList.add(new PhoneNumber("01616778899"));
phoneNumberList.add(new PhoneNumber("01717889900"));
phoneNumberList.add(new PhoneNumber("01818990011"));
phoneNumberList.add(new PhoneNumber("01919001122"));
Collections.sort(phoneNumberList);
String customRules = "<013<017<014<019<015<016<018";
RuleBasedCollator myRuleBasedCollator = new RuleBasedCollator(customRules);
Collections.sort(phoneNumberList,myRuleBasedCollator);
phoneNumberList.forEach(System.out::println);
01313445566
01717889900
01414556677
01919001122
01515667788
01616778899
01818990011