Проверка, является ли символ целым числом или буквой - PullRequest
1 голос
/ 25 мая 2011

Я изменяю файл, используя Java. Вот что я хочу сделать:

  • если во время чтения обнаруживается символ & вместе с целым числом, я хочу удалить символ & и перевести целое число в двоичный файл.
  • если во время чтения обнаруживается символ & вместе с (случайным) словом, я хочу удалить символ & и заменить слово на целое число 16, и если вместе с символом используется другая строка символов символ &, я хочу установить число 1 выше, чем целое число 16.

Вот пример того, что я имею в виду. Если введен файл, содержащий эти строки:

&myword
&4
&anotherword
&9
&yetanotherword
&10
&myword

Выходные данные должны быть:

&0000000000010000 (which is 16 in decimal)
&0000000000000100 (or the number '4' in decimal)
&0000000000010001 (which is 17 in decimal, since 16 is already used, so 16+1=17)
&0000000000000101 (or the number '9' in decimal)
&0000000000010001 (which is 18 in decimal, or 17+1=18)
&0000000000000110 (or the number '10' in decimal)
&0000000000010000 (which is 16 because value of myword = 16)

Вот что я пробовал до сих пор, но пока не удалось:

for (i=0; i<anyLines.length; i++) {
            char[] charray = anyLines[i].toCharArray();
            for (int j=0; j<charray.length; j++)
                      if (Character.isDigit(charray[j])) {
                          anyLines[i] = anyLines[i].replace("&","");
                          anyLines[i] = Integer.toBinaryString(Integer.parseInt(anyLines[i]);
                          }
                       else {
                          continue;
                            }
                        if (Character.isLetter(charray[j])) {
                          anyLines[i] = anyLines[i].replace("&","");
                          for (int k=16; j<charray.length; k++) {
                            anyLines[i] = Integer.toBinaryString(Integer.parseInt(k);
                            }

                        }

                     }
                    }

Я надеюсь, что я достаточно ясно сформулировал. Любые предложения о том, как выполнить эту задачу?

Ответы [ 5 ]

2 голосов
/ 23 декабря 2013
Character.isLetter() //tests to see if it is a letter
Character.isDigit() //tests the character to
1 голос
/ 25 мая 2011

Похоже, что вы могли бы сопоставить с регулярным выражением.Я не знаю Java, но у вас должен быть хотя бы один движок регулярных выражений.Тогда регулярное выражение будет:

регулярное выражение1: & (\ d +) и регулярное выражение2: & (\ w +)

или

регулярное выражение 3: & (\ d + | \ w +)

В первом случае, если регулярное выражение соответствует, вы знаете, что столкнулись с числом, и это число входит в первую группу захвата (например, match.group (1)).Если regex2 соответствует, вы знаете, у вас есть слово.Затем вы можете найти это слово в словаре и посмотреть, что это за связанный номер, или, если его нет, добавить его в словарь и связать со следующим свободным номером (16 + размер словаря + 1).

regex3, с другой стороны, будет совпадать как с числами, так и со словами, так что вам решать, что находится в группе захвата (это просто другой подход).

Если ни один из регулярных выражений не совпадает, значит, у вас неверныйпоследовательность, или вам нужно какое-то другое действие.Обратите внимание, что \ w в регулярном выражении соответствует только символам слова (т. Е. Буквам, _ и, возможно, нескольким другим символам), поэтому & çSomeWord или & * SomeWord не будут совпадать вообще, тогда как захваченная группа в & Hello.World будет просто "Здравствуйте ".

Библиотеки Regex обычно предоставляют длину для сопоставленного текста, так что вы можете переместиться на столько вперед, чтобы пропустить уже сопоставленный текст.

0 голосов
/ 26 мая 2011

Как насчет этого?

String input = "&myword\n&4\n&anotherword\n&9\n&yetanotherword\n&10\n&myword";
String[] lines = input.split("\n");

int wordValue = 16;

// to keep track words that are already used
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.parseInt(line);
    }
    else if (line.matches("\\w+")) {
        binaryValue = wordValueMap.get(line);

        // if the map doesn't contain the word value, then assign and store it
        if (binaryValue == null) {
            binaryValue = wordValue;
            wordValueMap.put(line, binaryValue);
            wordValue++;
        }
    }

    // I'm using Commons Lang's StringUtils.leftPad(..) to create the zero padded string
    String out = "&" + StringUtils.leftPad(Integer.toBinaryString(binaryValue), 16, "0");
    System.out.println(out);

Вот распечатка: -

&0000000000010000
&0000000000000100
&0000000000010001
&0000000000001001
&0000000000010010
&0000000000001010
&0000000000010000

Просто к вашему сведению, двоичное значение для 10 - "1010", а не "110", как указано в вашем исходном сообщении.

0 голосов
/ 25 мая 2011
  • Вы должны каким-то образом токенизировать свой ввод.Кажется, вы разбиваете его на строки, а затем анализируете каждую строку в отдельности.Если это то, что вы хотите, хорошо.Если нет, вы можете просто выполнить поиск & (indexOf('%')) и затем каким-то образом определить, что является следующим токеном (число или «слово», как бы вы ни хотели определить слово).Вы хотите сделать с вводом, который не соответствует вашему шаблону?Ни описание задачи, ни пример в действительности не охватывают это.
  • Вам нужен словарь уже прочитанных строк.Используйте Map<String, Integer>.
0 голосов
/ 25 мая 2011

Я бы опубликовал это как комментарий, но пока не имею возможности.С какой проблемой вы сталкиваетесь?Ошибка?Неверные результаты?16 неправильно увеличивается?Кроме того, в примерах используется символ «%», но в своем описании вы говорите, что он должен начинаться с «&».

Edit2: думал, что это строка за строкой, но повторное чтение указывает, что вы можете пытатьсянайти сказать «Я пошел в & магазин» и хочу, чтобы он сказал «Я пошел в & 000010000».Таким образом, вы захотите разделить пробелами, а затем перебрать и передать строки в свой метод replace, который похож на приведенный ниже.

Edit1: Если я понимаю, что вы пытаетесь сделать, такой код должен работать.

Map<String, Integer> usedWords = new HashMap<String, Integer>();
    List<String> output = new ArrayList<String>();
    int wordIncrementer = 16;
    String[] arr = test.split("\n");
    for(String s : arr)
    {
        if(s.startsWith("&"))
        {
            String line = s.substring(1).trim(); //Removes &
            try
            {
                Integer lineInt = Integer.parseInt(line);
                output.add("&" + Integer.toBinaryString(lineInt));
            }
            catch(Exception e)
            {
                System.out.println("Line was not an integer.  Parsing as a String.");
                String outputString = "&";
                if(usedWords.containsKey(line))
                {
                    outputString += Integer.toBinaryString(usedWords.get(line));
                }
                else
                {
                    outputString += Integer.toBinaryString(wordIncrementer);
                    usedWords.put(line, wordIncrementer++); 
                }
                output.add(outputString);
            }
        }
        else
        {
            continue; //Nothing indicating that we should parse the line.
        }
    }
...