我的想法/问题:
我正在开展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.
}
}
}
答案 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,但我肯定会建议您使用新文件IO。 Files.readAllLines
确实看起来比那些InputReader更具吸引力,不是吗? ;)
我不认为这是填写此截屏视频的理想代码,但这是我今天编写的代码(与截屏视频相比,有点过时)解决问题。