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

Глава 1 (продолжение 4)

Вверх

1.5 Использование связного списка
Одним из недостатков нашей программы является то, что для временного хранения считанных из файла слов мы используем обычный массив фиксированного размера. Но в java для этой цели лучше подойдут специально разработанные классы. Одним из таких классов является связный список LinkedList.

Для того, чтобы программа могла работать с классом LinkedList мы должны подключить библиотеку, в которой содержится данный класс. Подключаем следующей инструкцией:

import java.util.*;

Далее, заменим в нашей программе фиксированный массив связным списком.

//Объявим связный список LinkedList
LinkedList Word_List = new LinkedList();

Для добавления элементов в связный список воспользуемся функцией add() класса LinkedList.

int count=0;
try {

for (;;) {
String word = fin.readString();

if (! search(Word_List,word)) {

if(word.length() == number){
Word_List.add(word);
count++;
}
}
}


} catch (EOFException e) {
fout.println(count + " words read.\n\n");
}

Функцию report() вывода данных в файл следует так же переписать,
с использованием связного списка.

void report (LinkedList Word_List, Stream fout) {

int k = 0;
for (ListIterator list = Word_List.listIterator(); list.hasNext(); ) {
String str = (String) list.next();
fout.print(str);
fout.print(" ");
k++;
if(k==7){
fout.println("\t");
k=0;
}
}
}

Функция search() так же должна измениться:

boolean search (LinkedList Word_List, String x) {

for (ListIterator list = Word_List.listIterator(); list.hasNext();){
String str = (String) list.next(); if (x.compareTo(str)==0) return true;
}
return false;
}

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

String word = fin.readString();

if (! search(Word_List,word)) {
...

report(Word_List,fout);

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

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

int len = Word_List.size();
String group [] = new String[len];

int num = 0;
for (ListIterator list = Word_List.listIterator(); list.hasNext();){

String str = (String) list.next();
group[num] = str;
num++;
}
selectionSort(group,num);

Как видим мы воспользовались функцией size() класса LinkedList для инициализации целочисленной переменной len, а затем используя эту переменную объявляем массив в динамической памяти и этот массив будет иметь нужную нам длину.

int len = Word_List.size();
String group [] = new String[len];

Благодаря функции size() мы определяем число элементов связного списка уже после того, как связный список сформирован и инициирован данными. Этот примем помогает нам создать и инициировать данными в цикле обычный массив group, который будет передан в качестве аргумента в функцию сортировки selectionSort(). Вторым аргументом будет длина массива.

selectionSort(group,num);

Далее в программе будет вызвана прежняя (не модифицированная) библиотечная функция report() с тремя параметрами, которая выведет результат в файл, переданный через третий параметр.

rep.report(group,num,fout);

Код программы в файле Prog05


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

Hosted by uCoz