如何将不同的行拆分为字符串

时间:2016-02-28 16:33:15

标签: java string split

我正在努力解决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);
        }
    }  
}

4 个答案:

答案 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