我在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
我的目标是在字符串中对名称进行排序,而不是&#34;#&#34;之后的字符串。我正在使用beforeHash.add(line.split(&#34;#&#34;)[0]);去做这个。问题是它正确读取文件,但它按错误的顺序排序。相应的产出是:
[Analise Soares, Giancarlo Tobias, Mateus Carl, Carlos Magno]
[Carlos Magno#261, Mateus Carl#12, Analise Soares#151, Giancarlo Tobias#150]
第一个结果是&#34;排序&#34;一,请注意&#34; Carlos Magno&#34;来自&#34; Mateus Carl&#34;。我在代码中找不到问题。
答案 0 :(得分:8)
问题是“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
。