Как отсортировать список, содержащий цифры и специальные символы в алфавитном порядке? - PullRequest
0 голосов
/ 03 апреля 2019

Мой вопрос на самом деле двоякий, но сначала я пытаюсь написать программу, которая сортирует список по алфавиту и записывает его в файл, но при попытке отсортировать файл, в тот момент, когда строки со специальными символами или числамивведено, сортировка больше не работает.Если список - это просто строки, начинающиеся с букв, он сортируется и записывается совершенно нормально и по порядку.

Я просто использую Collections.sort в списке строк, который состоит из строк входного файла,и затем я пытаюсь записать их в выходной файл.

Мой входной файл содержит следующие строки:

These are some test lines
short line
abcdefghij
this line is much longer than the short line
123 456
#Ignore this line
Blah blah blah
# ignore this, too

, и мой выходной файл заканчивается сортировкой по:

# ignore this, too
#Ignore this line
123 456
Blah blah blah
These are some test lines
abcdefghij
short line
this line is much longer than the short line

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

BufferedReader inputStream = null;
        PrintWriter outputStream = null;
        String inFile = args[0];
        String outFile = args[1];
        List<String> lines = new LinkedList<>();

        try {
            inputStream =
                    new BufferedReader(new FileReader(inFile));
            outputStream=
                    new PrintWriter(new FileWriter(outFile));
            String line;
            while ((line = inputStream.readLine()) != null) {
                lines.add(line);
                if(args[2].equals("LONGESTFIRST") ) {
                    Collections.sort(lines, new Comparator<String>() {
                        @Override
                        public int compare(String o1, String o2) {
                            return o2.length() - o1.length();
                        }
                    });
                } else if (args[2].equals("SHORTESTFIRST")) {
                    Collections.sort(lines, new Comparator<String>() {
                        @Override
                        public int compare(String o1, String o2) {
                            return o1.length() - o2.length();
                        }
                    });
                } else if (args[2].equals("LEXICOGRAPHIC")) {
                    Collections.sort(lines);
                } else if (args[2].equals("REVERSE")) {
                    Collections.sort(lines, Collections.reverseOrder());
                }
            }
            for (int i = 0; i < lines.size(); i++) {
                outputStream.println(lines.get(i));
            }

Я пробовал что-то вроде включения строки с последней по последнюю в операторе if, например if(!lines.startsWith("#") { ... но, к сожалению, это не работает.

Кстати, простите за стену текста!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вам просто не нужно ставить такие строки в Список

while ((line = inputStream.readLine()) != null) {
  if (line.startsWith("#"))
    continue;
  lines.add(line);
  // ...
}
0 голосов
/ 03 апреля 2019

Первое: вам не нужно сортировать список после каждой вставки в список.

Второй: если вы не хотите, чтобы строки с # символами присутствовали в выходных данных, вы можете просто проверить это с помощью list.get(i).contains("#"). И если он возвращает true, удалите эту строку из списка.

Таким образом, окончательный алгоритм, вероятно, будет выглядеть примерно так:

  1. Чтение строк из файла, добавление каждой строки в список.
  2. Сортируйте список, используя один из ваших компараторов ( только один раз ), так же, как вы это делаете в настоящее время.
  3. Перебрать список. Проверьте, является ли строка допустимой для записи в файл (list.get(i).contains("#") или что-то еще, что вам нравится), и если это так, запишите ее в файл.


UPDATE:
Для сортировки без учета регистра вы, вероятно, захотите использовать компаратор по умолчанию CASE_INSENSITIVE_ORDER, предоставляемый String class:

List<String> myList = ...;
Collections.sort(myList, String.CASE_INSENSITIVE_ORDER);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...