Java:对数字字符串数组

时间:2015-06-27 06:29:05

标签: java arrays string sorting readline

我的想法/问题:

我正在开展Java挑战(方向吼叫)。我 Part 1/2 '几乎'完成了(在下面的代码中显示)。

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

longnums.txt的前20行:

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

如下面的说明所述,我已将 .txt 100行放入数组中,每个元素的 50 '数字/数字/字符'组成。

完成上述步骤后,我将: 1)根据大小排序'他们'(最小数字首先), 2)将此文件另存为p5a在答案目录中的.txt, 3)找到所有100个数字之和的前10位数字,并将答案打印到控制台。

以上是我对方向的理解(发布在下方)。

我遇到的问题是以上 1& 3

我做错了什么/如何解决/我需要做什么才能完成此任务/如何改进我的代码?

挑战方向:

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

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

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

Pic 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.  
        }
    }
}   

1 个答案:

答案 0 :(得分:0)

咦?其他答案去了哪里?

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

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(在Java 8中引入)
  • 新文件IO(在Java 7中引入)

通过这些东西,它不能很好地适应截屏视频给你的骨架。但是在这种情况下,我会认为截屏骨架已经过时了。

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

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