PHP脚本按降序输出电子邮件地址列表,如下所示:
_abc_@testmail.com
_abc45_@testmail.com
_abc2_@testmail.com
ypaux2aux@yahoo.com
yaremchuk56@testmail.com
vasillevn@hotmail.com
ugur@hotmail.com
twes@gmail.com
tukaux@yahoo.com
ttsetaux1@yahoo.com
tra@testmail.com
在Java中,我从这些电子邮件中创建一个ArrayList,然后按降序排序。结果不同:
ypaux2aux@yahoo.com
yaremchuk56@testmail.com
vasillevn@hotmail.com
ugur@hotmail.com
twes@gmail.com
tukaux@yahoo.com
ttsetaux1@yahoo.com
tra@testmail.com
_abc45_@testmail.com
_abc2_@testmail.com
_abc_@testmail.com
差异是由下划线引起的" _"。我想实现与PHP脚本相同的排序顺序。我怎样才能做到这一点?我无法访问PHP代码。
我使用的Java测试代码是:
import java.util.ArrayList;
import java.util.Collections;
public class sorty {
public static void main(String[] args) {
ArrayList<String> listStrings = new ArrayList<>();
listStrings.add("_abc_@testmail.com");
listStrings.add("_abc45_@testmail.com");
listStrings.add("_abc2_@testmail.com");
listStrings.add("ypaux2aux@yahoo.com");
listStrings.add("yaremchuk56@testmail.com");
listStrings.add("vasillevn@hotmail.com");
listStrings.add("ugur@hotmail.com");
listStrings.add("twes@gmail.com");
listStrings.add("tukaux@yahoo.com");
listStrings.add("ttsetaux1@yahoo.com");
listStrings.add("tra@testmail.com");
for (int i = 0; i < listStrings.size(); i++) {
System.out.println(listStrings.get(i));
}
Collections.sort(listStrings);
Collections.reverse(listStrings);
for (int i = 0; i < listStrings.size(); i++) {
System.out.println(listStrings.get(i));
}
;
}
}
答案 0 :(得分:4)
我会使用适当的Collator
。实现自己的比较器不是
最琐碎的事情。如果您对其中一个默认值感到满意,那将是最好的。 e.g。
Collections.sort(listStrings, Collator.getInstance(Locale.US));
或类似。
如果现有的都不适合你,那么使用rule based collator就可以了 你的意图更清晰,然后实施比较器imo:
String rules = "< a < b < c < '_'" //etc
Collections.sort(listStrings, new RuleBasedCollator(rules));
答案 1 :(得分:1)
使用了解下划线特殊的自定义比较器进行排序:
Collections.sort(listStrings, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.startsWith("_") && o2.startsWith("_")) {
return compare(o1.substring(1), o2.substring(1));
}
if (o1.startsWith("_")) {
return 1;
}
if (o2.startsWith("_")) {
return -1;
}
return o1.compareTo(o2);
}
});
这也将处理存在多个下划线的情况。例如。 __foo
后将考虑_foo
。
要处理任意数量的特殊字符,请在数组中定义它们(按照您的首选顺序)并使用更高级的比较器:
Collections.sort(listStrings, new Comparator<String>() {
// declare in order of desired sort
private final String[] specialChars = { "_", ">" };
@Override
public int compare(String o1, String o2) {
/*
* CASES
*
* 1. Both start with same special char
*
* 2. Both start with a special char
*
* 3. One starts with a special char
*
* 4. None starts with a special char
*/
int o1SpecialIndex = -1;
int o2SpecialIndex = -1;
for (int i = 0; i < specialChars.length; i++) {
if (o1.startsWith(specialChars[i])) {
o1SpecialIndex = i;
}
if (o2.startsWith(specialChars[i])) {
o2SpecialIndex = i;
}
}
// case 1:
if (o1SpecialIndex != -1 && o1SpecialIndex == o2SpecialIndex) {
return compare(o1.substring(1), o2.substring(1));
}
// case 2:
if (o1SpecialIndex != -1 && o2SpecialIndex != -1) {
return o2SpecialIndex - o1SpecialIndex;
}
// case 3:
if (o1SpecialIndex != -1) {
return 1;
}
if (o2SpecialIndex != -1) {
return -1;
}
// case 4:
return o1.compareTo(o2);
}
});