Java 如何按字母顺序对文件排序?
我目前正在尝试用java编写一个程序,以按字母顺序对文件内容进行排序,该文件包含:Java 如何按字母顺序对文件排序?,java,algorithm,Java,Algorithm,我目前正在尝试用java编写一个程序,以按字母顺序对文件内容进行排序,该文件包含: camera10:192.168.112.43 camera12:192.168.2.112 camera1:127.0.0.1 camera2:133.192.31.42 camera3:145.154.42.58 camera8:192.168.12.205 camera3:192.168.2.122 camera5:192.168.112.54 camera1
camera10:192.168.112.43
camera12:192.168.2.112
camera1:127.0.0.1
camera2:133.192.31.42
camera3:145.154.42.58
camera8:192.168.12.205
camera3:192.168.2.122
camera5:192.168.112.54
camera123:192.168.2.112
camera4:192.168.112.1
camera6:192.168.112.234
camera7:192.168.112.20
camera9:192.168.2.112
我想对它们进行排序并将其写回文件(在本例中为“daftarCamera.txt”)。但不知何故,我的算法对它们进行了错误的排序,结果是:
camera10:192.168.112.43
camera123:192.168.2.112
camera12:192.168.2.112
camera1:127.0.0.1
camera2:133.192.31.42
camera3:145.154.42.58
camera3:192.168.2.122
camera4:192.168.112.1
camera5:192.168.112.54
camera6:192.168.112.234
camera7:192.168.112.20
camera8:192.168.12.205
camera9:192.168.2.112
而我想要的结果是:
camera1:127.0.0.1
camera2:133.192.31.42
camera3:145.154.42.58
camera3:192.168.2.122
camera4:192.168.112.1
camera5:192.168.112.54
camera6:192.168.112.234
camera7:192.168.112.20
camera8:192.168.12.205
camera9:192.168.2.112
camera10:192.168.112.43
camera12:192.168.2.112
camera123:192.168.2.112
以下是我使用的代码:
public void sortCamera() {
BufferedReader reader = null;
BufferedWriter writer = null;
ArrayList <String> lines = new ArrayList<String>();
try {
reader = new BufferedReader(new FileReader (log));
String currentLine = reader.readLine();
while (currentLine != null){
lines.add(currentLine);
currentLine = reader.readLine();
}
Collections.sort(lines);
writer = new BufferedWriter(new FileWriter(log));
for (String line : lines) {
writer.write(line);
writer.newLine();
}
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
if(writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void sortCamera(){
BufferedReader reader=null;
BufferedWriter=null;
ArrayList行=新的ArrayList();
试一试{
reader=newbufferedreader(newfilereader(log));
字符串currentLine=reader.readLine();
while(currentLine!=null){
行。添加(当前行);
currentLine=reader.readLine();
}
集合。排序(行);
writer=newbufferedwriter(newfilewriter(log));
用于(字符串行:行){
作者:写(行);
writer.newLine();
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
if(读卡器!=null){
reader.close();
}
if(writer!=null){
writer.close();
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
排序算法采用普通的排序顺序,即按字母顺序对字符串进行排序,就像数字是字母一样。因此,较短的字符串首先出现
您需要指定一个特殊的比较函数,用于拆分字符串并提取后缀的数值。您当前正在执行词法排序,要执行数值排序,您需要一个比较器,该比较器根据
之间的值对行进行数字排序
和:
在每行中。您可以按:
进行拆分,然后使用正则表达式获取数字,解析它们,然后进行比较。像
Collections.sort(lines, (String a, String b) -> {
String[] leftTokens = a.split(":"), rightTokens = b.split(":");
Pattern p = Pattern.compile("camera(\\d+)");
int left = Integer.parseInt(p.matcher(leftTokens[0]).replaceAll("$1"));
int right = Integer.parseInt(p.matcher(rightTokens[0]).replaceAll("$1"));
return Integer.compare(left, right);
});
制作一个完全可复制的示例
List<String> lines = new ArrayList<>(Arrays.asList( //
"camera10:192.168.112.43", //
"camera12:192.168.2.112", //
"camera1:127.0.0.1", //
"camera2:133.192.31.42", //
"camera3:145.154.42.58", //
"camera8:192.168.12.205", //
"camera3:192.168.2.122", //
"camera5:192.168.112.54", //
"camera123:192.168.2.112", //
"camera4:192.168.112.1", //
"camera6:192.168.112.234", //
"camera7:192.168.112.20", //
"camera9:192.168.2.112"));
Collections.sort(lines, (String a, String b) -> {
String[] leftTokens = a.split(":"), rightTokens = b.split(":");
Pattern p = Pattern.compile("camera(\\d+)");
int left = Integer.parseInt(p.matcher(leftTokens[0]).replaceAll("$1"));
int right = Integer.parseInt(p.matcher(rightTokens[0]).replaceAll("$1"));
return Integer.compare(left, right);
});
System.out.println(lines);
谢谢我将尝试执行您的算法,并将通知您该算法是否有效!:D
[camera1:127.0.0.1, camera2:133.192.31.42, camera3:145.154.42.58, camera3:192.168.2.122, camera4:192.168.112.1, camera5:192.168.112.54, camera6:192.168.112.234, camera7:192.168.112.20, camera8:192.168.12.205, camera9:192.168.2.112, camera10:192.168.112.43, camera12:192.168.2.112, camera123:192.168.2.112]