Замена символа на номер - PullRequest
0 голосов
/ 31 мая 2011

Я хочу прочитать файл и определить, является ли символ после символа цифрой или словом.Если это число, я хочу удалить перед ним символ, перевести число в двоичное и заменить его в файле.Если это слово, сначала я хочу установить для символов число 16, но затем, если используется другое слово, я хочу добавить 1 к исходному числу.Вот что я хочу:

Если имя файла читается (... представляет строку, которую не нужно переводить):

%10
...
%firststring 
...
%secondstring
...
%firststring
...
%11
...

and so on...

Я хочу, чтобы это выглядело так:

0000000000001010 (10 in binary)
...  
0000000000010000 (16 in binary)
...
0000000000010001 (another word was used, so 16+1 = 17 in binary)
...
0000000000010000 (16 in binary)
...
0000000000001011 (11 in binary)

И вот что я попробовал: anyLines - это просто строковый массив, в котором содержится содержимое файла (если бы я сказал System.out.println (anyLines [i]), я бы использовал содержимое файла.распечатано).


ОБНОВЛЕНО!

    try {
       ReadFile files = new ReadFile(file.getPath());
       String[] anyLines = files.OpenFile();

        int i;


    int wordValue = 16;

// to keep track words that are already used
Map<String, Integer> wordValueMap = new HashMap<String, Integer>();

for (String line : anyLines) {
// 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
   System.out.println(Integer.toBinaryString(binaryValue));

}

Теперь мне нужно только заменить символы (% 10,% firststring и т. д.) надвоичное значение.

После выполнения этого кода в качестве вывода я получаю:

1010 
10000 
10001
10000
1011
%10
...
%firststring 
...
%secondstring
...
%firststring
...
%11
...

Теперь мне просто нужно заменить% 10 на 1010, строку% firststring на 10000 и т. д.чтобы файл выглядел так:

0000000000001010 (10 in binary)
...  
0000000000010000 (16 in binary)
...
0000000000010001 (another word was used, so 16+1 = 17 in binary)
...
0000000000010000 (16 in binary)
...
0000000000001011 (11 in binary)

Есть ли у вас какие-либо предложения о том, как заставить эту работу работать?

1 Ответ

2 голосов
/ 31 мая 2011

Этот может не делать то, что вы думаете:

 int binaryValue = wordValue++;

Поскольку вы используете оператор постинкремента, двоичному значению присваивается старое значение worldValue, и затем worldValue увеличивается.Я бы сделал это в двух отдельных строках, причем сначала выполняется приращение:

 wordValue++;
 int binaryValue = wordValue; // binaryValue now gets the new value for wordValue

РЕДАКТИРОВАТЬ 1
ОК, если вам все еще нужна наша помощь, я предлагаю вам сделатьследующее:

  • Покажите нам пример файла данных, чтобы мы могли увидеть, как он на самом деле выглядит.
  • Объясните разницу между массивом anyLines и массивом lines и как они связаны с файлом данных.У них обоих есть строки, и линии, очевидно, являются результатом разделения anyLines на «\ n», но опять же это anyLines.Вы утверждаете, что файл является текстовым файлом, но как получить исходный массив строк из этого текстового файла?Есть ли другой разделитель, который вы используете, чтобы получить этот массив?Вы пытались отладить код, распечатывая содержимое строк и строк anyLines?
  • Если вам нужно, чтобы wordValue сохранялся при каждой итерации цикла через anyLines (опять же, зная, что это поможет), вынеобходимо объявить и инициализировать его перед циклом.
  • Если вы не можете создать и опубликовать SSCCE, по крайней мере, сделайте форматирование кода согласованным и читабельным, что-то вроде приведенного ниже кода.
  • Посмотрите ссылку на , как задавать умные вопросы , чтобы получить дополнительные советы о том, какую информацию вы можете нам дать, и которая поможет вам помочь.

Пример кода:

  try {
     ReadFile files = new ReadFile(file.getPath());
     String[] anyLines = files.OpenFile();

     String[] anyLines = {};

     int i;

     // test if the program actually read the file
     for (i = 0; i < anyLines.length; i++) {

        String[] lines = anyLines[i].split("\n");
        int wordValue = 76;

        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);
                 // TODO: fix below
                 // !! currentLine.replace(currentLine, binaryValue);

                 value = binaryValue;
              }
           } else {
              System.out.println("Invalid input");
              break;
           }

           System.out.println(Integer.toBinaryString(value));
        }
     }
  } finally {
     // Do we need a catch block? If so, catch what?
     // What's supposed to go in here?
  }

Удачи!

...