Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改包含特殊字符(例如“uquot;”)的字符串的排序顺序_Java_Php_Sorting_Collections - Fatal编程技术网

Java 更改包含特殊字符(例如“uquot;”)的字符串的排序顺序

Java 更改包含特殊字符(例如“uquot;”)的字符串的排序顺序,java,php,sorting,collections,Java,Php,Sorting,Collections,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中,我从这些

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
差异是由下划线“\u1”引起的。我希望实现与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));

        }
        ;

    }

}
import java.util.ArrayList;
导入java.util.Collections;
公务舱架次{
公共静态void main(字符串[]args){
ArrayList ListString=新的ArrayList();
add(“_abc_u@testmail.com”);
add(“_abc45_@testmail.com”);
add(“_abc2_u@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");
对于(int i=0;i
使用了解下划线特殊性的自定义比较器进行排序:

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

我会使用合适的
拼贴器
。实现自己的比较器并不是最好的选择
最琐碎的事。如果您对其中一个默认值感到满意,那将是最好的选择。e、 g

Collections.sort(listStrings, Collator.getInstance(Locale.US));
或类似的

如果现有的都不适合您,那么使用 您的意图更加清晰,然后实施一个比较器imo:

String rules = "< a < b < c < '_'" //etc
Collections.sort(listStrings, new RuleBasedCollator(rules));
String rules=“
谢谢@Duncan;这是一种用于所有特殊角色的方法,如
-
谢谢@Duncan。如果字符串以特殊字符开头,则此操作有效。其他情况下,它不起作用。@Turcia啊,我明白了。如果字符串中也出现特殊字符,则需要保持相同的顺序?是的,没错。我忘了添加一些有问题的示例电子邮件,比如
some_thing@mail.com
.Locale.*不适合我的示例。正如您所说的,我可能需要使用基于规则的振荡器。谢谢@monocell
String rules = "< a < b < c < '_'" //etc
Collections.sort(listStrings, new RuleBasedCollator(rules));