Первый элемент отбрасывается при сортировке текстового файла с использованием массивов в Java - PullRequest
1 голос
/ 26 ноября 2011

У меня есть этот код для сортировки текстового файла с использованием массивов в Java, но он всегда отбрасывает первую строку текста при сортировке.

Вот мой код:

import java.io.*;

public class Main {

    public static int count(String filename) throws IOException {
        InputStream is = new BufferedInputStream(new FileInputStream(filename));
        try {
            byte[] c = new byte[1024];
            int count = 0;
            int readChars = 0;
            while ((readChars = is.read(c)) != -1) {
                for (int i = 0; i < readChars; ++i) {
                    if (c[i] == '\n') {
                        ++count;
                    }
                }
            }
            return count;
        } finally {
            is.close();
        }
    }

    public static String[] getContents(File aFile) throws IOException {

        String[] words = new String[count(aFile.getName()) + 1];

        BufferedReader input = new BufferedReader(new FileReader(aFile));

        String line = null; //not declared within while loop
        int i = 0;
        while ((line = input.readLine()) != null) {
            words[i] = line;
            i++;
        }

        java.util.Arrays.sort(words);
        for (int k = 0; k < words.length; k++) {
            System.out.println(words[k]);
        }
        return words;
    }

    public static void main(String[] args) throws IOException {

        File testFile = new File("try.txt");
        getContents(testFile);

    }
}

Вот текстовый файл try.txt:

Daisy
Jane
Amanda
Barbara
Alexandra
Ezabile

вывод:

Alexandra
Amanda
Barbara
Ezabile
Jane
Daisy

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

Ответы [ 4 ]

2 голосов
/ 26 ноября 2011

Я скомпилировал ваш код (на Mac), и он работает для меня.Попробуйте открыть файл в гекседиторе и посмотрите, есть ли какой-то специальный символ в начале вашего файла.Это может быть причиной неправильной сортировки для первой строки.

1 голос
/ 26 ноября 2011

Попробуйте что-нибудь попроще, например:

public static String[] getContents(File aFile) throws IOException {

    List<String> words = new ArrayList<String>();
    BufferedReader input = new BufferedReader(new FileReader(aFile));

    String line;
    while ((line = input.readLine()) != null)
        words.add(line);

    Collections.sort(words);
    return words.toArray(new String[words.size()]);

}

public static void main(String[] args) throws IOException {

    File testFile = new File("try.txt");
    String[] contents = getContents(testFile);
    for (int k = 0; k < contents.length; k++) {
        System.out.println(contents[k]);
    }

}

Обратите внимание, что вам не нужно перебирать файл, чтобы определить, сколько у него строк, вместо этого я добавляю строки в ArrayList,и в конце преобразует его в массив.

1 голос
/ 26 ноября 2011

Возможно, у вас есть BOM (Byte Order Marker) в начале файла.По определению они будут интерпретироваться как неразрывный пробел нулевой ширины.

Так что если у вас есть

    String textA = new String(new byte[] { (byte)0xef, (byte)0xbb, (byte) 0xbf, 65}, "UTF-8");
    String textB = new String(new byte[] { 66}, "UTF-8");
    System.err.println(textA + " < " + textB + " = " + (textA.compareTo(textB) < 0));

Символ должен отображаться в вашей длине строк, поэтому попробуйте распечататьдлина каждой строки.

            System.out.println(words[k] + " " + words[k].length());

И используйте список или какую-либо другую структуру, чтобы вам не приходилось читать файл дважды.

0 голосов
/ 26 ноября 2011

Используйте List и метод add () для чтения содержимого вашего файла. Затем используйте Collections.sort () для сортировки списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...