【问题标题】:Converting Binary to Decimal using a text file使用文本文件将二进制转换为十进制
【发布时间】:2021-10-04 22:26:17
【问题描述】:

我正在创建一个由两个 java 文件组成的程序。第一个涉及创建一个类,该类接受来自用户的二进制文件并返回其十进制值。第二个涉及创建一个类,该类从文本文件中读取二进制字符串列表并将其十进制值写入控制台。这个类应该调用第一个java类的方法来完成它的任务,并且应该能够指示这个文件中的一个字符串是否不是二进制的。

我已经完成了第一个 java 类,但我在第二个方面遇到了困难,特别是我如何让程序从文本文件中读取每个单独的字符串,然后打印出它们的值或声明它们是不是二进制文件。我还需要一些关于如何从头等舱调用方法的帮助。有人可以帮助我朝着正确的方向前进吗?

这是两个代码:

第 1 类:

import java.util.*;
public class BinaryDecoder {

    public static void main(String[] args) {
        
        Scanner input = new Scanner(System.in);
        
        System.out.print("Enter a binary: ");
        String binary = input.nextLine();
        
        System.out.println("---------------");
        
        boolean isBinary = binaryDetector(binary);
        
        if(isBinary) {
            int count = 0;
            for(int i=0; i<binary.length(); i++) {
                if(binary.charAt(i) != ' ') {
                    count++;
                }
            }
            int binarySize = Integer.valueOf(count);
            System.out.println("Binary size: " + binarySize);
            
            int decimalValue = binaryToDecimal(binary);
            
            System.out.println("Value = " + decimalValue);
        }
        else {
            System.out.println("Not a binary");
        }
        
    }
    
    public static boolean binaryDetector(String x) {
        int copyOfInput = Integer.valueOf(x);
        
        while(copyOfInput != 0) {
            if(copyOfInput % 10 > 1) {
                return false;
            }
            copyOfInput = copyOfInput/10;
        }
        return true;
        }
    
    public static int binaryToDecimal(String n) {
        String num = n;
        int dec_value = 0;
        
        int base = 1;
        
        int len = num.length();
        for(int i = len - 1; i>= 0; i--) {
            if(num.charAt(i) == '1') {
                dec_value += base;
            }
            base = base * 2;
        }
        return dec_value;
    }

}

2 级

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class BinaryToDecimalTester {
    public static void main(String[] args) throws Exception{
        Scanner inFile = new Scanner(new File("Strings.txt"));
        while(inFile.hasNext()) {
            String inString = inFile.next();
}
}
}

假设文本文件中有这些数字作为参考:

1011010011101
1011101110101
1201234000100
1234456000110
1011010100011

如果您需要更多说明或信息,请告诉我。非常感谢大家!

【问题讨论】:

  • 我更新的答案可能有助于解决您的问题。

标签: java binary text-files


【解决方案1】:

为了在 BinaryToDecimalTester 中使用 BinaryDecoder 中的方法,您必须导入它们。最好的方法是在每个类中声明包并使用它导入它,例如 解码器类:

package binarynumbers;

import java.util.*;
public class BinaryDecoder {

public static void main(String[] args) { ...

然后在 BinaryToDecimalTester 中导入特定(或所有)方法:

package stackoverflow;


import java.io.File;
import java.util.Scanner;

import static stackoverflow.BinaryDecoder.binaryToDecimal;

public class BinaryToDecimalTester { ...

以这种方式导入它可以让您按预期正常使用它:

System.out.println(binaryToDecimal(inString));

包和导入的概念比这更复杂,对于编写程序至关重要。

至于从文本文件中读取每一行作为字符串并处理它,你的类就足够了,FileInputReader 是从文件中读取的另一个选项之一。我的例子是这样的:

package binarynumbers;


import java.io.BufferedReader;
import java.io.FileReader;

import static binarynumbers.BinaryDecoder.binaryToDecimal;
import static binarynumbers.BinaryDecoder.binaryDetector;

public class BinaryToDecimalTester {
    public static void main(String[] args) throws Exception{
    BufferedReader br = new BufferedReader(new FileReader("Strings.txt"));
    String line = "";

    while ((line = br.readLine()) != null)
    {
        System.out.println(binaryDetector(line));
        System.out.println(binaryToDecimal(line));
    }
}
}

在实现检测二进制数的方法方面,我可以建议article

【讨论】:

  • 从 BinaryDecoder.java 导入方法有效,但使用 BufferedReader 没有帮助。我不断收到错误消息。我确实将 System.out.println(binaryToDecimal(inString)) 添加到我的原始代码中,它打印出每个数字的十进制值;但是,我需要弄清楚该怎么做才能确保那些不是二进制的被标记为这样(“非二进制”)。
  • 我已经添加了实现这种方法的链接
【解决方案2】:

你必须选择哪个类应该是你的主类。

如果您保留 2 作为您的主要文件,然后您可以读取 2 中的两个文件而不是 1 中的主要文件,并通过在 2 中导入它们来使用您在 1 中创建的静态方法。

导入 BinaryDecoder.binaryToDecimal;

【讨论】:

    【解决方案3】:

    我建议您在尝试转换值时检查二进制数字。如果数字不是二进制,则抛出异常并打印消息。

    不需要先检查再转换值。

    这是一种简单的转换方法。

    public static int binaryToDecimal(String n) {
       int val = 0;
       for(char c : n.toCharArray()) {
           if (c != '1' && c != '0') {
               throw new IllegalArgumentException("Number not binary");
           }
           val = val*2;
           val += c-'0';
       }
       return val;
    }
    

    现在您需要做的就是读入值并调用方法。您还可以返回一个可选项来代替异常。

    public static OptionalInt binaryToDecimal(String n) {
       int val = 0;
       for(char c : n.toCharArray()) {
           if (c != '1' && c != '0') {
               return OptionalInt.empty();
           }
           val = val*2;
           val += c-'0';
       }
       return OptionalInt.of(val);
    }
    

    现在只需在打印结果之前检查返回的Optional 是否为空。要从文件中读取值,我建议使用扫描仪实例。这是一个使用问题中提到的数据以及所需导入的示例。

    import java.io.File;
    import java.io.IOException;
    import java.util.OptionalInt;
    import java.util.Scanner;
    
    try (Scanner input = new Scanner(new File("f:/numbers.txt"))) {
        while (input.hasNextLine()) {
            String str = input.nextLine();
            OptionalInt op = binaryToDecimal(str);
            System.out.printf("%s -> %s%n", str, op.isPresent() ?
                    op.getAsInt() : "Non binary string");
        }
    } catch (IOException ie) {
        ie.printStackTrace();
    }
    

    打印

    1011010011101 -> 5789
    1011101110101 -> 6005
    1201234000100 -> Non binary string
    1234456000110 -> Non binary string
    1011010100011 -> 5795
    

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2012-06-26
      • 1970-01-01
      • 2023-04-03
      • 2014-12-05
      • 2013-08-20
      相关资源
      最近更新 更多