我正在努力解决Panacea - truth or lie挑战。
基本上我必须检查文本文件中的两组数字的总和(可以包含多行)是否相等。第一组是十六进制数和第二组;这两组的分离是由数字9完成的(我有问题使用split和参数|
作为分隔表达式,你知道为什么吗?)
输入示例:
64 6e 78 9 100101100 11110
5e 7d 59 9 1101100 10010101 1100111
如果代码正常运行,但是在while循环中我收到NumberFormatExceptions
。
这是我的最终代码:
import java.util.*;
import java.io.*;
public class test {
public static void main (String[] args) throws IOException {
BufferedReader buff = new BufferedReader(new FileReader ("C:\\Users\\Steel\\Desktop\\JAVA\\somme\\som.txt"));
int somma_bin;
int somma_hex;
int i;
String ciao = "9";
List<String> binehex = new ArrayList<>();
String prova;
while ((prova = buff.readLine()) != null) {
somma_bin = 0;
somma_hex = 0;
binehex = Arrays.asList(prova.split(" "));
i = 0;
while (!(binehex.get(i)).equals(ciao)) {
somma_hex += Integer.parseInt(binehex.get(i), 16);
i++;
}
i++;
while (i < (binehex.size()-1)) {
somma_bin += Integer.parseInt(binehex.get(i), 2);
i++;
}
if (somma_bin == somma_hex) {
System.out.println("true");
} else {
System.out.println("false");
}
System.out.println(prova);
}
}
}
答案 0 :(得分:1)
除了有很多代码之外,我看不出明显的问题。
尝试更多结构:
String line; // given a line
String[] parts = line.split(" 9 ");
int sumHex = Arrays.stream(parts[0].split(" ")).mapToInt(s -> Integer.parseInt(s, 16)).sum();
int sumBin = Arrays.stream(parts[1].split(" ")).mapToInt(s -> Integer.parseInt(s, 2)).sum();
System.out.println(sumHex == sumBin);
我不确定"|"
分割的相关性是什么,因为那不在您发布的代码中,但是如果要分割管道,则必须对其进行分隔,因为管道char具有特殊含义在正则表达式:
string.split("\\|");
答案 1 :(得分:0)
首先,你可以用| -Character分割一行,就像那样:
String[] strArr = prova.split("|");
然后strArr中有两个数组元素,strArr [0]包含表示十六进制数字的字符串,strArr [1]表示二进制数字。
然后你可以再次拆分每个数组:
String[] hexArr = strArr[0].split(" ");
String[] binArr = strArr[0].split(" ");
之后,您可以像在两个不同的while循环中那样对值进行求和。 如果是hexArr,你应该检查最后一个元素是null还是“”,因为最后一个数字和| -Character之间有一个空格。
答案 2 :(得分:0)
这是您的代码的解决方案 -
import java.util.*;
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader buff = new BufferedReader(new FileReader("C:\\Users\\Steel\\Desktop\\JAVA\\somme\\som.txt"));
int somma_bin;
int somma_hex;
int i;
String ciao = "9";
String prova;
while ((prova = buff.readLine()) != null) {
somma_bin = 0;
somma_hex = 0;
//System.out.println(prova.split("\\|")[0]);
//System.out.println(prova.split("\\|")[1]);
String bin[] = null;
String hex[] = null;
if(prova.contains("|")){
bin = prova.split("\\|")[1].split(" ");
hex = prova.split("\\|")[0].split(" ");
} else{
continue;
}
for(String str : bin){
if(str!=null && !str.isEmpty()){
somma_bin += Integer.valueOf(str.trim(), 2);
// System.out.println("bin - "+Integer.valueOf(str.trim(), 2)+"("+str+")");
}
}
for(String str : hex){
if(str!=null && !str.isEmpty()){
somma_hex += Integer.valueOf(str.trim(), 16);
// System.out.println("hex - "+Integer.valueOf(str.trim(), 16)+"("+str+")");
}
}
if (somma_bin == somma_hex) {
System.out.println("true");
}
else {
System.out.println("false");
}
}
}
}
答案 3 :(得分:0)
public static void main(String[] a) throws Exception {
List<String> list = new ArrayList<>();
list.add("64 6e 78 | 100101100 11110");
list.add("5e 7d 59 | 1101100 10010101 1100111");
list.add("93 75 | 1000111 1011010 1100010");
for (String line : list) {
String splits[] = line.split("\\|");
int hexTotal = Arrays.stream(splits[0].split(" ")).mapToInt(v -> {
if (v.length() == 0)
return 0;
else
return Integer.parseInt(v, 16);
}).sum();
int binTotal = Arrays.stream(splits[1].split(" ")).mapToInt(v -> {
if (v.length() == 0)
return 0;
else
return Integer.parseInt(v, 2);
}).sum();
System.out.println(hexTotal <= binTotal);
}
}
可以从文件中填充ArrayList list
。