Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 如何按字母顺序对文件排序?_Java_Algorithm - Fatal编程技术网

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

我目前正在尝试用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    
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]