Max4
Max4

Reputation: 1

charAt not working for strings from a file

Im using the charAt function to find the first and second letters in a string that was read from a file but after getting the first character from the charAt(0) line, charAt(1), throws an exection that the string is too short when I know it is not. Here is the code.

while(inputFile.hasNext()){
    //read file first line
    String line = inputFile.nextLine();
    //if the first 2 letters of the line the scanner is reading are the same
    //as the search letters print the line and add one to the linesPrinted count
    String lineOne = String.valueOf(line.charAt(0));
    String lineTwo = String.valueOf(line.charAt(1));
    String searchOne = String.valueOf(search.charAt(0));
    String searchTwo = String.valueOf(search.charAt(1));

    if (lineOne.compareToIgnoreCase(searchOne) == 0 && lineTwo.compareToIgnoreCase(searchTwo) == 0){
        System.out.println(line);
        linesPrinted++;
    }
}

I've tried checking the make sure the string isn't being changed after the charAt(0) use by printing and I know it isn't and I've run the program with no probems after just removing the line so I am sure it is this that's causing the problem

Upvotes: 0

Views: 15

Answers (1)

Joop Eggen
Joop Eggen

Reputation: 109547

The only functional change needed would to change hasNext to hasNextLine. As one might encounter a line shorter than 2, say an empty line at the end of file, check the length.

while (inputFile.hasNextLine()) {
    // read file next line
    String line = inputFile.nextLine();
    if (line.length() < 2) {
        continue;
    }
    // if the first 2 letters of the line the scanner is reading are the same
    // as the search letters print the line and add one to the linesPrinted count
    String lineOne = line.substring(0, 1);
    String lineTwo = lin.substring(1, 2);
    String searchOne = search.substring(0, 1);
    String searchTwo = search.substring(1, 2);

    if (lineOne.equalsIgnoreCase(searchOne) && lineTwo.equalsIgnoreCase(searchTwo)) {
        System.out.println(line);
        linesPrinted++;
    }
}

There is a problem with special chars and other languages, scripts. A Unicode code point (symbol, character) can be more than one java char.

while (inputFile.hasNextLine()) {
    // read file next line
    String line = inputFile.nextLine();
    if (line.length() < 2) {
        continue;
    }
    // if the first 2 letters of the line the scanner is reading are the same
    // as the search letters print the line and add one to the linesPrinted count
    int]} lineStart = line.codePoints().limit(2).toArray();
    int]} searchStart = search.codePoints().limit(2).toArray();
    String lineKey = new String(lineStart, 0, lineStart.length);
    String searchKey = new String(searchStart, 0, searchStart.length);
    if (lineKey.equalsIgnoreCase(searchKey)) {
        System.out.println(line);
        linesPrinted++;
    }
}

Upvotes: 0

Related Questions