Жестко закодированная строка работает, введенная строка не работает - PullRequest
1 голос
/ 31 мая 2011

В двух словах, вот что я пытаюсь сделать:

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

Когда я жестко кодирую строку, которую хочу ввести, и читаю:

String input = "@5\n@word1\n@word2\n@word1\n@6";
String[] lines = input.split("\n"); // divide up the array

Или:

@5
@word1
@word2
@word1
@6

Затем выводится то, что я хочу вывести:

101
10000
10001
10000
110

Но когда я вводю anyLines [i] (массив, содержащий информацию о файле, которая может измениться, если выбран другой файл):

String input = anyLines[i];
String[] lines = input.split("\n");

Для тех же данных неожиданно выдается неверный вывод:

101
10000
10000 <-- PROBLEM - should be 10001
10000
110  

Теперь проблема в том, что wordValue не увеличивается. В жестко запрограммированной строке wordValue правильно увеличивается.

Вот мой общий метод:

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

    int i;

    //  test if the program actually read the file
    for (i=0; i<anyLines.length; i++) {
        String input = anyLines[i];
        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
            System.out.println(Integer.toBinaryString(binaryValue));
        }
    }
}

Можете ли вы указать мне правильное направление, пожалуйста?

1 Ответ

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

На первый взгляд код выглядит нормально.Лучше всего, вероятно, распечатать строки по мере их обработки, чтобы увидеть, имеют ли они ... странный ... формат:

for (String line : lines)
    System.out.println ("[" + line + "]");

На самом деле, я бы сделал все возможное,и помещайте оператор печати после каждой строки, которая что-то меняет (которая печатает порядковый номер и измененную вещь), чтобы убедиться, что нет непреднамеренных эффектов:

Что-то вроде:

else if (line.matches("\\w+")) {
    binaryValue = wordValueMap.get(line);
    System.out.println ("A: binval set to " + binaryValue);

    // if the map doesn't contain the word value,
    // then assign and store it
    if (binaryValue == null) {
        binaryValue = wordValue;
        System.out.println ("B: binval set to " + binaryValue);
        wordValueMap.put(line, binaryValue);
        System.out.println ("C: put " + binaryValue +
            ", now " + wordValueMap.get(line));
        wordValue++;
        System.out.println ("C: wordval set to " + wordValue);
    }
}

Этот printf метод отладки часто может оказаться неоценимым, хотя вы также можете использовать инструмент отладки: -)

...