读取字符并检查它们是否为数字

时间:2011-05-26 02:32:21

标签: java file integer character letter

我正在尝试一种方法来检查符号后面是否有字符&是一个数字或一个字母;如果一个数字,它被翻译成二进制;如果是字母,则设置为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));
}

1 个答案:

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

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