Java:对数字字符串数组进行排序

Java: Sorting an array of number Strings

我的thoughts/Questions:

我正在应对 Java 挑战(说明如下)。我已完成 第 1/2 部分 'nearly'(如下面的代码所示)。

正如您将在我的代码中看到的那样,我正在读取 .txt 文件。

longnums.txt前20行:

37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538
74324986199524741059474233309513058123726617309629
91942213363574161572522430563301811072406154908250
23067588207539346171171980310421047513778063246676
89261670696623633820136378418383684178734361726757
28112879812849979408065481931592621691275889832738
44274228917432520321923589422876796487670272189318
44274228917432520321923589422876796487670272189318
70386486105843025439939619828917593665686757934951
62176457141856560629502157223196586755079324193331
64906352462741904929101432445813822663347944758178
92575867718337217661963751590579239728245598838407
58203565325359399008402633568948830189458628227828
80181199384826282014278194139940567587151170094390
35398664372827112653829987240784473053190104293586
86515506006295864861532075273371959191420517255829
71693888707715466499115593487603532921714970056938
54370070576826684624621495650076471787294438377604
53282654108756828443191190634694037855217779295145

如说明(下方)所述,我已将 .txt100 行 放入一个数组中,50'numbers/digits/characters'组成的每个元素的值。

完成上述步骤后,我要:1)按大小排序'them'(最小的在前),2) 将此文件另存为p5a.txt在answers目录下,3)求所有100个数之和的前10位,打印答案到控制台。

以上是我对路线的理解(贴在下面)

上面的 1 & 3.

我遇到了问题

我在做什么 wrong/how 我可以修复 it/what 我需要做什么才能完成这个 assignment/how 我可以改进我的代码吗?

挑战方向:

使用资源目录下的longnums.txt文件解决此问题。

第 1 部分: 构建一个包含 100 个数字的数组(每个 50 位数字 长) 包含在 longnum.txt 中,并根据大小对它们进行排序(最小的数字在前)。在答案目录中将此文件另存为 p5a.txt

第 2 部分:找出所有 100 个数字总和的前 10 位数字 , 并将答案打印到控制台。

图片 Link 显示输出和目录:

http://screencast.com/t/pp1aRbjM

我的当前代码:

package app;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

public class LargeSums {
    private static FileReader fb;
    private static BufferedReader bf;
    private static PrintWriter pw;
    private static String out = null;
    private static  int sum;

    public static void main(String[] args) throws IOException { 
        fb = new FileReader("resources/longnums.txt");
        bf = new BufferedReader(fb);
        pw = new PrintWriter(new BufferedWriter(new FileWriter("answers/p5a.txt")));

        while ((out = bf.readLine()) != null) {
            String[] sortedStr = out.split(" ");
            Arrays.sort(sortedStr); // Might not need this line

            for (int i = 0; i < sortedStr.length; i++) {
            // TO-DO: sort them according to size (smallest numbers first).

            pw.println(sortedStr[i]); // Save this file as p5a.txt in the answers directory
            System.out.println(sortedStr[i]);// print to console just to see output

            // sum = sum + Integer.parseInt(sortedStr[i]); 
            // something like the above line to total the sum of all the numbers
            }
            // TO-DO: Find the first 10 digits of the sum of all 100 numbers, and print the answer      
            // to the console.  
        }
    }
}   

嗯?其他答案去了哪里?

好的,这不是您所要求的 - 但我敢说它可能会更好。稍后会详细介绍。

package org.example;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.List;

import static java.util.stream.Collectors.toList;

public class Main {
    private static final Path INPUT_FILE_PATH = Paths.get("./resources/longnums.txt");
    private static final Path OUTPUT_FILE_PATH = Paths.get("./answers/p5a.txt");

    public static List<BigInteger> readDataFromFile() throws IOException {
         return Files.readAllLines(INPUT_FILE_PATH).stream().map(BigInteger::new).collect(toList());
    }

    public static String calculateFirst10DigitsOfSum(List<BigInteger> numbers) {
        BigInteger sum = numbers.stream().reduce(BigInteger.ZERO, (a,b) -> a.add(b));
        return sum.toString().substring(0, 10);
    }

    public static void writeLinesSortedToFile(List<BigInteger> numbers) throws IOException {
        List<String> outputLines = numbers.stream().sorted().map(BigInteger::toString).collect(toList());
        Files.write(OUTPUT_FILE_PATH, outputLines, StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
    }

    public static void main(String[] args) throws IOException {
        List<BigInteger> data = readDataFromFile();
        writeLinesSortedToFile(data);
        String first10Digits = calculateFirst10DigitsOfSum(data);
        System.out.println(first10Digits);
    }
}

它可以写得更短,但我想有一些方法可以说出名字来告诉你这里发生了什么。

它严重依赖

  • Streams(在Java8中介绍)
  • 新文件IO(在Java7中介绍)

有了这些东西,它就不太适合截屏视频给你的框架了。但是在这种情况下,我会认为截屏框架已经过时了。

我不确定您是否想使用 Streams,但我绝对建议您使用新的文件 IO。 Files.readAllLines 看起来确实比那些 InputReader 更有吸引力,不是吗? ;)

我认为这不是填充此截屏视频的理想代码,但这是我今天要写的代码 (与截屏视频相比,它看起来有点已过时)解决问题。