2010-07-18 4 views
1

Я изучаю текстовую обработку в Java для класса, а пример в классе должен был считывать данные из файла, выполнять текстовую обработку, записывать данные (список) в файл. Я понимаю пример, в котором он читает в каждой строке строку String и добавляет эту строку в список и использует .split (""), а затем Collections.sort для сортировки данных, возвращающих одну из строк. Однако, если есть запятые и дополнительные пробелы, я не знаю, как их форматировать. Я читал в regex, но не был уверен, что это было необходимо, так как мы не закрыли это и собирались для метода trim(). Но если я положу метод trim() в методе сравнения моего класса, который реализует Comparator, который передается в Collections.sort, он не получит переданную правильно отформатированную строку, так как сравнение возвращает int. Поэтому я думаю, что я ищу некоторые общие рекомендации, которые помогут в этом задании, но не полностью отдаю ответ. Благодарю.Как избавиться от запятой, пробелов, сортировки в Java

Редактировать: Назначение - написать список в порядке, удалив дубликаты и лишние пробелы.

public class TextProcess 
    { 
     public static void main(String[] args) 
     { 
      try { 
// get data from class file 
       List<String> data = TextFileUtils.readTextFile("addressbooktest.txt"); 
// process data. Really just the same address book that looks like 
// firstName, lastName, phone, email 
// with the commas, but deleting duplicates, the extra whitespace, and sorting alphabetically 
       Collections.sort(data, FIRSTNAMECOMPARATOR); 
     // write to output file 
       TextFileUtils.writeTextFile(data, "parsedaddressbooktest.txt"); 
       } 

      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     private static final FirstNameComparator FIRSTNAMECOMPARATOR = new FirstNameComparator(); 
    } 

    class FirstNameComparator implements Comparator<String> 
    { 
     public int compare(String s1, String s2) 
     { 

      String[] st1 = s1.split(","); 
      String[] st2 = s2.split(","); 


      String firstName1 = st1[0].toUpperCase().trim(); 
      String lastName1 = st1[1].toUpperCase().trim(); 

      String firstName2 = st2[0].toUpperCase().trim(); 
      String lastName2 = st2[1].toUpperCase().trim(); 
      if (!(firstName1.equals(firstName2))) 
       return firstName1.compareTo(firstName2); 
      else 
       return lastName1.compareTo(lastName2); 
     } 
    } 
+0

Вместо описания кода в словах, лучше просто показать нам. Кроме того, как мы можем помочь с назначением, если мы не знаем, что такое назначение? – Thomas

+0

Спасибо за фрагмент на этот раз, можете ли вы суммировать рабочий процесс в словах? Вы пытаетесь сказать, что: 1. Читайте из файла. 2. Обработать текст - т. Е. Отсортировать их (сортировать по?) 3. Написать обратно в файл. (напишите что?) – yclian

+1

Комментирующий код типа '// вот что делает строка ниже, поможет вам и всем остальным. –

ответ

0

Comparator это просто способ определения относительного порядка двух элементов, больше ничего. Вы использовали бы это, когда хотите контролировать порядок сортировки коллекции объектов, но в этом случае кажется, что вы пытаетесь мутировать объекты внутри вашего компаратора; это не сработает.

Вы правы в том, что метод trim() избавит вас от ведущих и конечных пробелов (с учетом собственного определения пробелов, что отлично подходит для простых случаев использования, подобных вашим). Вам нужно будет использовать это раньше; после того, как вы извлекли «сырые» данные, конечно, но перед тем, как добавить данные в список.

Помимо этого, вы на самом деле не сказали, каковы требования. Я могу предположить, что вам нужно отбросить конечные пробелы, но как насчет запятых? Должны ли они интерпретироваться как разделители элементов, функционально эквивалентным образом для строк новой строки? Или что-то еще нужно?

Я думаю, что вы на правильном пути вообще; просто подумайте о необходимых шагах и попробуйте сделать каждый отдельно, так как это чище. Из того, что я могу сказать, ваши шаги могут быть примерно такими:

  1. Определить и открыть поток для чтения данных из файла (сделано).
  2. Используйте этот поток для обслуживания символьных данных из файла, по одной строке за раз (сделано).
  3. Для каждой строки удалите пробелы и разделите запятую.
  4. Для каждой форматированной строки добавьте ее в список.
  5. Сортировка списка в определенном порядке.
+0

Я не согласен с тем, что представленный выше компаратор мутирует сравниваемые предметы. Строки не могут быть мутированы, и компаратор не модифицирует массив. Кроме того, что вы подразумеваете под «методом trim(), будет избавляться от ведущих и конечных пробелов»? Если вы используете str.split (","), как указано выше, этого не произойдет. Вы должны сделать это с помощью параметра regex. –

1

Я не уверен, что именно вас беспокоит с кодом, но вот то, что код, который вы представили, кажется, делает:

1) Она считывает строки в текстовый файл, а также организует их в качестве список строк, сохраняя их порядок (предположительно, потому что мы не видим, как фактически реализуется TextFileUtils.readTextFile (..)).

2) Сортирует список в порядке возрастания имени. Предполагается, что каждая строка состоит из последовательности слов, разделенных запятой, где первое слово является первым именем, а второе - фамилией. Первичное упорядочение осуществляется по первому имени, а вторичное упорядочение - по имени. Использование String.Split() является частью реализации FirstNameComparator.

3) Записывает исходные строки после сортировки в другой текстовый файл.

Примечания о Компараторах:

Comparator определяет механизм для сравнения двух элементов. Как только механизм будет реализован, вы можете использовать его для различных целей, когда вопросы упорядочения (сортировка, поиск максимума/минимума, деревья поиска, очереди приоритетов и т. Д.). Ваше объяснение шагов не очень точно; код не считывает файл в список, выполняет разделение, а затем сортирует. Разделение на самом деле является частью сортировки. Алгоритм сортировки многократно вызывает ваш компаратор, пока он не определит, что сортировка завершена. Кроме того, способ, которым он будет реализован, теперь, вероятно, будет разбить одну и ту же строку несколько раз, чтобы сравнить его с разными строками (не так эффективно, но я полагаю, что здесь здесь не основное внимание).

еще два комментария

  • Что касается того, как вы разбора строк: текущий код имеет дело только с запятыми. Он не удаляет пробелы. Вы можете использовать более сложное регулярное выражение для работы с другими типами разделителей и пробелов.

  • Я не вижу в коде все, что удаляет дубликаты

Смежные вопросы