0

我正在尝试一种方法来检查符号 & 后面的字符是数字还是字母;如果是数字,则将其转换为二进制;如果是字母,则设置为 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++;
                   }
               }
           }
       }

输入:

&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));
}
4

1 回答 1

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));
}

作为旁注,我希望您知道,如果数字后跟一个单词(例如句子),这将失败。但是,如果您的输入永远不会有任何这些,那么这不是问题。

于 2011-05-26T10:59:53.803 回答