我在Java中有以下代码:

List<String> unSorted = new ArrayList<String>();
List<String> beforeHash = new ArrayList<String>();
String[] unSortedAux, beforeHashAux;
String line = null;

BufferedReader reader = new BufferedReader(new FileReader("C:\\CPD\\temp0.txt"));
    while ((line = reader.readLine()) != null){
        unSorted.add(line);
        beforeHash.add(line.split("#")[0]);

    }
    reader.close();

    Collections.sort(beforeHash);
    beforeHashAux = beforeHash.toArray(new String[beforeHash.size()]);
    unSortedAux = unSorted.toArray(new String[unSorted.size()]);

    System.out.println(Arrays.toString(beforeHashAux));
    System.out.println(Arrays.toString(unSortedAux));


它读取一个名为temp0.txt的文件,其中包含:

Carlos Magno#261
Mateus Carl#12
Analise Soares#151
Giancarlo Tobias#150


我的目标是对字符串中的名称进行排序,在“#”之后不包含字符串。我正在使用beforeHash.add(line.split(“#”)[0]);去做这个。问题在于它可以正确读取文件,但是排序顺序错误。相应的输出是:

[Analise Soares, Giancarlo Tobias, Mateus Carl, Carlos Magno]
[Carlos Magno#261, Mateus Carl#12, Analise Soares#151, Giancarlo Tobias#150]


第一个结果是“排序”结果,请注意,“ Carlos Magno”紧随“ Mateus Carl”之后。我在代码中找不到问题。

最佳答案

问题是“ Carlos Magno”以Unicode byte-order mark开头。

如果将示例文本([Analise ... Carlos Magno])复制并粘贴到Unicode Explorer中,您会发现在Carlos Magno的“ C”之前,您已经有了U + FEFF。

基本上,您在读取文件时需要将其删除。最简单的方法是使用:

line = line.replace("\ufeff", "");


...或先检查:

if (line.startsWith("\ufeff")) {
    line = line.substring(1);
}


请注意,在打开文件时,您确实应该指定要使用的编码-使用包裹在FileInputStream中的InputStreamReader

09-08 02:25