Назад | Начало урока | Вперед
Содержание

Глава 06

Вверх

Пример 6.7 Сортировка слов в файле

Задача. Данный пример иллюстрирует применение на практике изученных алгоритмов.

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

Алгоритм. На рис 6.15 представлена та часть программы, которая отвечает за создание массива уникальных слов. После этого массив выводится, сортируется и выводится еще раз.

Программа. С помощью метода selectionSort осуществляется сортировка строк. Как отмечалось в разделе 3.6 оператор < нельзя применять для сравнения объектов ( в частности наших объектов String). Поэтому мы воспользуемся методом compareTo или compareToIgnoreCase. Тот же метод будет использован в процессе поиска. Далее следует текст программы.


import java.io.*;
import javagently.*;
import myutilities.*;

class SortWords {

/* The Sort Words program by J M Bishop Feb 1997
* ====================== Java 1.1 October 1997
* updated June 2000
* Reads in and then sorts up to 100
* different words.
* Illustrates sorting and searching an array.
*/

void selectionSort (String[] a, int n) {

String temp;
int chosen;

for (int leftmost = 0; leftmost < n-1; leftmost++) {

chosen = leftmost;
for (int j = leftmost+1; j < n; j++)
if (a[j].compareTo(a[chosen]) < 0)
chosen = j;
temp = a[chosen];
a[chosen] = a[leftmost];
a[leftmost] = temp;
}
}

boolean search (String[] a, int n, String x) {

for (int i = 0; i < n; i++)
if (x.compareTo(a[i])==0) return true;
return false;
}

void report (String[] a, int n) {

for (int i = 0; i < n; i++) {
System.out.print(a[i]+"\t");
if (i>0 && i % 7 == 0) System.out.println();
}
}

SortWords() throws IOException {

String group [] = new String[100];
System.out.print("Where are the words? ");
Stream fin = Filer.open("sort.java");

int count=0;
try {

while (count < 100) {
String word = fin.readString();
if (! search(group,count,word)) {
group[count] = word;
count ++;
}
}
} catch (EOFException e) {
System.out.println(count + " words read.\n\n");
}

System.out.print("Original\n");
System.out.print("========\n");
report(group,count);

selectionSort(group, count);

System.out.print("\n\nSorted\n");
System.out.print("======\n");
report(group,count);

}

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

new SortWords();
}

}

Тестирование. Разработана программа, которая для открытия файла использует класс Filer, благодаря чему возможна работа с любыми данными. Применяется метод сортировки selectionSort. Чтобы упростить процедуру считывания и максимально увеличить количество слов, которые могут повторяться, мы реорганизовали файл и ввели пробелы между всеми словами и символами.

Файл sort.java, который следует обработать:

Подсказка

Полученный результат довольно интересен:

Подсказка

Вывод программы позволяет получить представление об используемых Java принципах сортировки операторов, букв и цифр. Дальнейшее развитие данная тема получит в примере 5.4.

Анализ программы:

SortWords() throws IOException {

Объявим массив, в который будем складывать слова, считанные из файла:

String group [] = new String[100];

Затем откроем файл при помощи метода open класса Filer, которому передадим в параметр имя файла.

System.out.print("Where are the words? ");
Stream fin = Filer.open("sort.java");

Затем в цикле while будем пословно считывать из fin, и складывать в массив group считанные слова при помощи функции search. Функция search не только складывает переданное ей слово в массив group, но и проверяет, не содержится ли оно уже массиве. Если не содержится, то складывает его в массив, если уже содержится, то условие if не выполняется и программа переходит к считыванию следующего слова. По достижении конца файла, выводится сообщение о том, сколько слов считано из файла в массив group. При этом, повторяю слова в массиве group будут уникальны.

int count=0;
try {

while (count < 100) {
String word = fin.readString();
if (! search(group,count,word)) {
group[count] = word;
count ++;
}
}
} catch (EOFException e) {
System.out.println(count + " words read.\n\n");
}

Далее происходит вывод на экран слов из массива group при помощи функци report(). В параметр этой функции передается массив и число элементов, которые необходимо считать:

System.out.print("Original\n");
System.out.print("========\n");
report(group,count);

Затем функция сортировки:

selectionSort(group, count);

И снова вывод:

System.out.print("\n\nSorted\n");
System.out.print("======\n");
report(group,count);

}

Теперь рассмотрим подробнее функции, которые использованы в этой программе:

В функции selectionSort использован алгоритм сортировки методом отбора, который был рассмотрен нами ранее в этой главе. При этом в качестве параметров функции передается массив и число элементов массива:

void selectionSort (String[] a, int n) {

String temp;
int chosen;

for (int leftmost = 0; leftmost < n-1; leftmost++) {

chosen = leftmost;
for (int j = leftmost+1; j < n; j++)
if (a[j].compareTo(a[chosen]) < 0)
chosen = j;
temp = a[chosen];
a[chosen] = a[leftmost];
a[leftmost] = temp;
}
}

Функции search() передается массив, число элементов массива, и слово, которое необходимо проверить. Если оно в массиве не встретилось, то возвращается true, если встретилось, то false.

boolean search (String[] a, int n, String x) {

for (int i = 0; i < n; i++)
if (x.compareTo(a[i])==0) return true;
return false;
}

Функция report() выводит на экран переданный ей массив слов. При этом обратите внимание как интересно в функции report() при выводе сделана табуляция:

void report (String[] a, int n) {

for (int i = 0; i < n; i++) {
System.out.print(a[i]+"\t");
if (i>0 && i % 7 == 0) System.out.println();
}
}


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz