当前位置: 首页 > 知识库问答 >
问题:

如何使用Java对文本文件中的数字进行排序?

巫马玉堂
2023-03-14
16° C
15° C
18° C
13° C
17° C
19° C
21° C
20° C
16° C
import java.io.*;
import java.util.*;

public class temperatur {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = null;
        PrintWriter outputStream = null;
        ArrayList<String> rows = new ArrayList<String>();

        try {
            reader  = new BufferedReader(new FileReader("temp.txt"));
            outputStream = new PrintWriter(new FileWriter("tempout.txt"));

            String file;
            while ((file = reader .readLine()) != null) {
                rows.add(file);
            }
            Collections.sort(rows);
            String[] strArr= rows.toArray(new String[0]);
            for (String cur : strArr)
                outputStream.println(cur);
        } finally {
            if (reader  != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
    
}

共有1个答案

封弘伟
2023-03-14

下面是如何对中已经有的行进行排序的示例。这是假设您希望保留原始行,而不是重建它们。

解析和排序

理想情况下,使用一个类来保存行的内容和数值,例如:

//simplified, add setters, getters etc.
class Line {
  String content;
  double temp;
}
List<Line> rows = ...
String lineContent;
while ((lineContent= reader .readLine()) != null) {
   double temp = Double.parseDouble(lineContent.split("°")[0]);
   rows.add(new Line(lineContent, temp));
}

字符串通过比较字符进行排序,因此“10”将被认为小于“2”。因此,我们需要使用一个“诀窍”:

  • 先按长度排序,所以2小于10
  • 然后按词法排序
Collections.sort(rows, Comparator.comparing(String::length)
                                 .thenComparing(Function.identity())
                                 .reversed());

请注意,如果数字可以为负数或具有不同的格式(即不同长度的分数、不同数量的空格、行中的附加数据等),这将中断。在这些情况下,编译器需要更加复杂,复杂性越高,使用“解析和排序”方法就越容易。

Collections.sort(rows, (String left, String right) -> {
        char c1Left = left.charAt(0);
        char c1Right = right.charAt(0);
        
        int direction = -1; //1 for ascending
        
        //negative numbers are smaller than 0 or positive numbers
        int result = Integer.compare(c1Left == '-' ? -1 : 0, c1Right == '-' ? -1 : 0);
        if( result != 0) {
            return result * direction;
        }
        
        //at this point, both numbers are either both positive or both negative
        //for negative numbers we need to reserve direction since we'll only compare "absolute values"
        if( c1Right == '-' ) {
            direction *= -1;
        }
        
        String subLeft = Character.isDigit(c1Left) ? left : left.substring(1);
        String subRight = Character.isDigit(c1Right) ? right : right.substring(1);
        
        //shorter numbers are smaller than longer numbers (takes care of cases like 2 vs 10 or 3.1 vs 21.0)
        result = Integer.compare(subLeft.length(), subRight.length());
        if( result != 0) {
            return result * direction;
        }
        
        //sign and length are equal, the rest is a simple character comparison
        result = subLeft.compareTo(subRight);
        
        return result * direction;
    });
 类似资料:
  • 问题内容: 我有一个带有单词列表的文本文件,我需要使用Java按字母顺序对其进行排序。单词位于单独的行上。 我将如何处理,将它们读入数组列表,然后进行排序? 问题答案: 这是一个简单的四步过程,其中Stackoverflow问题解决了四个步骤中的三个: 阅读每一行并将其转换为Java String 将每个Java字符串存储在一个数组中(不要认为您需要引用它。) 排序数组 写出数组中的每个Java字

  • 问题内容: 首先,我发布此内容是因为当我在寻找以下问题的解决方案时,我在stackoverflow上找不到该解决方案。因此,我希望在此处增加一些知识库。 我需要处理目录中的某些文件,并且需要对文件进行数字排序。我在wiki.python.org上找到了一些有关排序的示例(尤其是使用模式),并将它们放在一起: 我对Python还是很陌生,想问一下社区是否可以对此进行任何改进:缩短代码(删除),性能,

  • 问题内容: 我需要对.flv文件进行数字排序,并且能够使用以下命令执行此操作: 但是有很多文件(数百个),因此无法正确排序。 但是奇怪的是,如果我在不起作用的情况下破坏了该命令。 我可以只使用ls,但文件夹中还有其他文件类型。 到目前为止我尝试过的是: 问题答案: 我会尝试以下代码。适用于我的测试场景: 所述列表上的每个线FLV文件1中,需要在每行开始对第二个字符的第一(且仅一个)字(开始数)。按

  • 问题内容: 如何按两列对CSV文件进行排序?现在,我可以按一列对其进行排序。我需要按前两列对其进行排序。怎么做?这是我用来按其第一列进行排序的代码: 编辑:两列排序后的输出变为: 我需要这样的输出: 但是,我希望第三列显示当前在第三列中显示的值中X的最小值,然后显示Y的最小值,然后显示Z。 问题答案: 尽管创建类作为 域的 适当表示通常是一个好主意:在这种情况下,我 不同意 注释。 读取CSV并按

  • 问题内容: 这是我的代码,它有效!但我希望能够根据名称,大小,修改日期等对文件列表进行排序 问题答案: 您可以定义许多不同的类来进行不同的比较,例如: 然后,您只需将它们换出: 要么

  • 问题内容: 当我们使用命令时,文件以一种排序的方式显示其内容,如果我不想得到任何种类的输出,而是一个经过排序的文件怎么办? 问题答案: 您可以使用文件重定向来重定向排序后的输出: 或者你也可以使用,排序的选项,以指示相同的输入和输出文件: 注意: 一个常见的错误是试图将输出重定向到相同的输入文件(例如)。这不起作用,因为外壳正在进行重定向(而不是 sort(1) 程序),并且在为 sort(1)