我正在尝试一种方法来检查符号后面是否有字符&是一个数字或一个字母;如果一个数字,它被翻译成二进制;如果是字母,则设置为16,如果使用不同的字,则增加1。麻烦的是,由于某些原因,这对我不起作用。有什么建议?
try {
ReadFile files = new ReadFile(file.getPath());
String[] anyLines = files.OpenFile();
int i;
for (i=0; i<anyLines.length; i++) {
String input = anyLines[i];
String[] lines = input.split("\n");
int wordValue = 16;
Map<String, Integer> wordValueMap = new HashMap<String, Integer>();
for (String line : lines) {
// if line doesn't begin with &, then ignore it
if (!line.startsWith("&")) {
continue;
}
// remove &
line = line.substring(1);
Integer binaryValue = null;
if (line.matches("\\d+")) {
binaryValue = Integer.toBinaryString(131072 +
Integer.parseInt(anyLines[i])).substring(2,18);
}
else if (line.matches("\\w+")) {
binaryValue = wordValueMap.get(line);
if (binaryValue == null) {
binaryValue = wordValue;
wordValueMap.put(line, binaryValue);
wordValue++;
}
}
}
}
INPUT:
&4
...
&hello
...
&ok
输出:
(5 translated into binary) : 0000000000000100
...
(16 translated into binary)
...
(17 translated into binary, or 16+1)
以下是您的方法的输出:
101
1001100
1001100
1001100
1001100
1001100
1001100
1001100
&5
1110110000010000
&hello
1110001100001000
&goodbye
1110101010001000
(NEXT)
&goodbye
1111000010001000
&hello
1110001110001000
&BILL
1110001100000110
&NEXT
1110101010000111
(BILL)
&BILL
1110101010000111
这是我正在阅读和循环的原始文本(anyLines [i]没有任何修改):
&5
var1
&hello
var2
&goodbye
var2
(NEXT)
&goodbye
var3
&hello
var4
&BILL
var5
&NEXT
var6
(BILL)
&BILL
var5
var只是一个具有值的变量。我已经照顾好了。
这是我的尝试:
String input = "This is a test line\n"
+ "&hello\n"
+ "&4\n"
+ "&32";
String[] lines = input.split("\n");
int wordValue = 26;
Map<String, Integer> wordValueMap = new HashMap<String, Integer>();
for (String currentLine : lines)
{
if (!currentLine.startsWith("&"))
{
continue;
}
currentLine = currentLine.substring(1);
Integer value;
if (currentLine.matches("\\d+"))
{
value = Integer.parseInt(currentLine);
}
else if (currentLine.matches("\\w+"))
{
value = wordValueMap.get(currentLine);
if(value == null)
{
int binaryValue = wordValue++;
wordValueMap.replace(currentLine, binaryValue);
/*
* This is just there to ensure that the print statement below doesn't have a
* null value.
*/
value = binaryValue;
}
}
else
{
System.out.println("Invalid input");
break;
}
System.out.println(Integer.toBinaryString(value));
}
答案 0 :(得分:1)
您的代码存在许多问题。 首先,你必须解析在toBinaryString()调用之后得到的值。
binaryValue = Integer.parseInt(Integer.toBinaryString(131072 +
Integer.parseInt(anyLines[i])).substring(2,18));
anyLines [i]作为该代码中parseInt()函数的参数的用法也是不正确的。根据我对你的代码的看法,anyLines [i]是一个包含newLines和其他内容的字符串,显然不能解析为整数。
以下代码似乎有效。我已经更改了HashMap的存储空间,以便存储常规整数,而不是尝试将二进制表示形式存储为整数值。
String input = "This is a test line\n"
+ "&hello\n"
+ "&4\n"
+ "&32";
String[] lines = input.split("\n");
int wordValue = 26;
Map<String, Integer> wordValueMap = new HashMap<String, Integer>();
for (String currentLine : lines)
{
if (!currentLine.startsWith("&"))
{
continue;
}
currentLine = currentLine.substring(1);
Integer value;
if (currentLine.matches("\\d+"))
{
value = Integer.parseInt(currentLine);
}
else if (currentLine.matches("\\w+"))
{
value = wordValueMap.get(currentLine);
if(value == null)
{
int binaryValue = wordValue++;
wordValueMap.put(currentLine, binaryValue);
/*
* This is just there to ensure that the print statement below doesn't have a
* null value.
*/
value = binaryValue;
}
}
else
{
System.out.println("Invalid input");
break;
}
System.out.println(Integer.toBinaryString(value));
}
作为旁注,我希望你知道,如果一个数字后跟一个单词,如句子,这将失败。但如果你的输入永远不会有任何问题,那就不是问题了。