我正在创建一个由两个java文件组成的程序。第一种方法涉及创建一个类,该类接受来自用户的二进制数据并返回其十进制值。第二个涉及创建一个类,该类从文本文件中读取二进制字符串列表,并将其十进制值写入控制台。这个类应该调用第一个java类的方法来完成它的任务,并且应该能够指出这个文件中的字符串是否有一个不是二进制的。
我已经完成了第一个java类,但是我在第二个类上遇到了困难,特别是我如何让程序从文本文件中读取每个单独的String,然后打印出它们的值或声明它们不是二进制文件。我还需要一些关于如何从第一个类调用方法的帮助。有人能给我指个方向吗?
下面是两个代码:
类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;
}
}
二班
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
如果您需要更多的说明或信息,请告诉我。非常感谢大家!
为了在BinaryToDecimalTester中使用来自BinaryDecoder的方法,您必须导入它们。例如,最好的方法是在每个类中声明package并使用它导入译码器类:
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));
}
}
}
在实现检测二进制数的方法方面,我可以推荐本文
您必须选择哪个类应该作为您的main。
如果你保留2作为main,然后代替main in 1,你可以读取2中的两个文件,并使用你在1中创建的静态方法,通过在2中导入它们。
进口BinaryDecoder.binaryToDecimal;
我建议您在尝试转换值时检查二进制数字。如果数字不是二进制,则抛出异常并打印消息。
不需要先检查再转换值
这里有一个简单的转换方法。
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