开发者

Hard-coded string works, inputted string doesn't

In a nutshell, here's what I'm trying to do:

I want to read a file and detect if the character after the symbol is a number or a word. If it is a number, I want to delete the symbol in front of it, translate the number into binary and replace it in the file. If it is a word, I want to set the characters to number 16 at first, but then, if another word is used, I want to add the 1 to the original number and continue looping till it reaches the end of the input.

When I hard code the string that I want to input and read:

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

Or:

@5
@word1
@word2
@word1
@6

Then it outp开发者_运维问答uts what I want it to output:

101
10000
10001
10000
110

But when I input anyLines[i] (an array that contains the file info that can change if another file is chosen):

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

For the same data, suddenly it gives an incorrect output:

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

Now the problem with this is that the wordValue doesn't increment. In the hard-coded string, wordValue incremented correctly.

Here's my overall method:

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

Can you point me in the right direction please?


The code looks okay at first glance. Your best bet is to probably print out the lines as you process them to see if they're of a ... strange ... format:

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

In fact, I'd go all out, and put a print statement after every line that changes something (which prints a sequence number and the changed thing), so as to be sure there are no unintended effects:

Something like:

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

This printf method of debugging can often be invaluable though you could also chose to use a debugging tool :-)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜