Чтение символов и проверка, являются ли они числом - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь получить метод, который проверяет, является ли символ после символа & цифрой или буквой;если число, оно переводится в двоичный код;и если это буква, она устанавливается в 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));
}

1 Ответ

1 голос
/ 26 мая 2011

Есть много проблем с вашим кодом. Для начала вам нужно проанализировать значение, которое вы получите после вызова 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));
}

В качестве примечания, я надеюсь, вы знаете, что это не удастся, если число, за которым последуют слова, например предложения. Но если ваш вклад никогда не будет ничего из этого, это не проблема.

...