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

Глава 1

Чтение из файла и сортировка слов

Для того, чтобы программа, составлющая кроссворд могла работать, надо создать базу данных. У нас такой базой данных будут текстовые файлы, каждый файл должен создержать в себе множество слов, фиксированной длины. Например файл с пятибуквенными словами, или файл с семибуквенными словами. И эти файлы - нашу базу данных - мы можем создать сами при помощи программы, которую сейчас напишем. В качестве базовой программы возьмем программу из главы 6 книги Джуди Бишоп "Java 2". Затем дополним ее новыми возможностями.

1.1 Сортировка слов в файле

Вверх

Задача. Программа считывает из текстового файла sort.java пословно и складывает слова в массив, при этом повторяющиеся слова в массив не включает. Затем выводит данный массив на экран. Затем сортирует слова в массиве по алфавиту и снова выводит уже отсортированные слова на экран. Эта программа из книги Джуди Бишоп "Java 2".

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

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


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

class SortWords {

/* Программа "SortWords" автор Джуди Бишоп
* Считывает в массив и затем сортирует до 100
* различных слов.
* Демонстрирует сортировку и поиск в массиве.
*/

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 принципах сортировки операторов, букв и цифр.

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

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 использован алгоритм сортировки методом отбора, который был рассмотрен в главе 6. При этом в качестве параметров функции передается массив и число элементов массива:

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