如何创建自定义订单以对Java字符串电话号码进行排序?
我有一个Java字符串电话号码列表&我需要根据他们的运营商分类,比如“013…”和“017…”它们都是相同的运营商号码如何创建自定义订单以对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
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