Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Паттерн проектирования Iterator

Преимущество использования массивов и коллекций заключается не только в том, что можно поместить в них произвольное количество объектов и извлекать их при необходимости, но и в том, что все эти объекты можно комплексно обрабатывать. Например, вывести на экран все шашки, содержащиеся в списке checkers. В случае массива мы пользуемся циклом for:

for (int i = 1; i < array.length; i++){// обрабатываем элемент array[i]}

Имея дело со списком, мы можем поступить аналогичным образом, только вместо array[i] писать array.get(i). Но мы не можем поступить так с коллекциями, элементы которых не индексируются (например, очередью или множеством). А в случае индексированной коллекции надо хорошо знать особенности ее работы: как определить количество элементов, как обратиться к элементу по индексу, может ли коллекция быть разреженной (т.е. могут ли существовать индексы, с которыми не связано никаких элементов) и т.д.

В программировании существует несколько испытанных временем и детально проработанных приемов структурной организации программы, называемых паттернами (шаблонами) проектирования. Один из таких паттернов называется Iterator. Идея заключается в том, что к коллекции «привязывается» объект, единственное назначение которого — выдать все элементы этой коллекции в некотором порядке, не раскрывая ее внутреннюю структуру.

В пакете java.util описан интерфейс Iterator, воплощающий этот паттерн проектирования. Он имеет всего три метода:

13. next() возвращает очередной элемент коллекции, к которой «привязан» итератор (и делает его текущим). Порядок перебора определяет сам итератор.

14. hasNext() возвращает true, если перебор элементов еще не закончен.

15. remove() удаляет текущий элемент.

Интерфейс Collection помимо рассмотренных ранее методов, имеет метод iterator(), который возвращает итератор для данной коллекции, готовый к ее обходу. С помощью такого итератора можно обработать все элементы любой коллекции следующим простым способом:

 

Iterator iter = coll.iterator();

// coll — коллекция, элементы которой мы хотим обработать

while (iter.hasNext())

{// обрабатываем объект, возвращаемый методом iter.next()}

 

Задание 1

В своем Java – проекте для лабораторных работ создайте класс MyCollection с методом main. Добавьте в этот класс приведенные ниже методы coll1, coll2, coll3, coll4, coll5 работы с коллекциями, проанализируйте их и обратитесь к каждому из них в методе main.

 

Примечание 1. Не забудьте подключить библиотеку

import java.util.*;

 

Примечание 2. Для выполнения метода coll5 вам будет необходим класс Dog, отлаженный в лабораторной работе «Основы объектно-ориентированного программирования в Java».

 

Далее приведены Java – коды методов coll1, coll2, coll3, coll4, coll5, для выполнения задания 1:

publicstaticvoid coll1(){

// Коллекция из 10 чисел. Переводим их в строки, чтобы

// работатьсособенностями Collection

Collection collection = new ArrayList();

for(int i = 0; i < 10; i++) collection.add(Integer.toString(i));

// выводимколлекцию

Iterator it = collection.iterator();

while(it.hasNext())

System.out.println(it.next());

}//

 

publicstaticvoid coll2(){

ArrayList arrayList = new ArrayList();

arrayList.add("First element");

arrayList.add("Second element");

arrayList.add("Third element");

Iterator iterator = arrayList.iterator();

while(iterator.hasNext()) {

System.out.println((String)iterator.next());

}

System.out.println("\n");

arrayList.add(2,"Insertion");

iterator = arrayList .iterator();

while(iterator.hasNext()){

System.out.println((String)iterator.next());

}

}//

 

publicstaticvoid coll3(){

LinkedList linkedList = new LinkedList();

linkedList.add("Element1");

linkedList.addFirst("Element2");

linkedList.addFirst("Element3");

linkedList.addLast("Element4");

dumpList(linkedList);

linkedList.remove(2);

dumpList(linkedList);

String element = (String)linkedList .getLast();

linkedList.remove(element);

dumpList(linkedList);

}//

 

//печать коллекции

publicstaticvoid dumpList(List list){

Iterator it = list.iterator();

while(it.hasNext()){

System.out.println((String)it.next());

}

}//

 

 

publicstaticvoid coll4(){

Vector vector = new Vector();

vector.add("Борис");

vector.add("Анна");

vector.add("Яна");

vector.add("Сергей");

vector.add("Виктор");

System.out.println("Исходныйсписок");

dumpList(vector);

Collections.sort(vector);

System.out.println();

System.out.println("Списокпослесортировки");

dumpList(vector);

}

 

publicstaticvoid coll5(){

ArrayList arrayList = new ArrayList();

arrayList.add(new Dog("Шарик", 2));

arrayList.add(new Dog("Тузик", 3));

arrayList.add(new Dog("Жучка", 1));

 

for(int i = 0; i < arrayList.size(); i++){

((Dog)arrayList.get(i)).voice();

}

}

 

Задание 2. Добавьте в класс задания 1 метод работы со стеком и очередью, использующий объект LinkedList, отладьте его на своих данных.

Кодметода:

publicstaticvoid testLinkedList() {

LinkedList linkedList = new LinkedList();

System.out.println(linkedList); //пустойсписок

// Трактуем его, как стек, вталкиваем:

linkedList.addFirst("один");

linkedList.addFirst("два");

linkedList.addFirst("три");

linkedList.addFirst("четыре");

System.out.println(linkedList);

// Аналогично "заглядыванию" в вершину стека:

System.out.println(linkedList.getFirst());

// Аналогичновыталкиваниюизстека:

System.out.println(linkedList.removeFirst());

System.out.println(linkedList.removeFirst());

// Трактуем, как очередь, вталкиваем элементы

// и вытаскиваем с конца:

System.out.println(linkedList.removeLast());

// С обеими приведенными выше операциями - это двойная очередь!

System.out.println(linkedList);

}

Задание 3 (самостоятельное)

Создайте новый класс Student, содержащий конструктор с четырьмя параметрами - имя студента и его три экзаменационные оценки. Включите в этот класс метод getAvg() для вычисления среднего балла и вывода имени и среднего балла.

Протестируйте ваш класс, используя список (для этого предварительно придется создать десяток объектов класса Student и поместить их в список). Тестирование аналогично приведенному выше методу coll5().

Приложение 1

Основные методы коллекций

1. add(E e) - добавляем элемент в коллекцию, если такого там ещё нет. Возвращает true, если элемент добавлен

2. addAll(Collection c) - добавляет все элементы коллекции с (если их ещё нет)

3. clear() - удаляет все элементы коллекции

4. contains(Object o) - возвращает true, если элемент есть в коллекции

5. containsAll(Collection c) - возвращает true, если все элементы содержатся в коллекции

6. equals(Object o) - проверяет, одинаковы ли коллекции

7. hashCode() - возвращает hashCode

8. isEmpty() - возвращает true если в коллекции нет ни одного элемента

9. iterator() - возвращает итератор по коллекции

10. remove(Object o) - удаляет элемент

11. removeAll(Collection c) - удаляет элементы, принадлежащие переданной коллекции

12. retainAll(Collection c) - удаляет элементы, не принадлежащие переданной коллекции

13. size() - количество элементов коллекции

14. toArray() - возвращает массив, содержащий элементы коллекции

15. toArray(T[] a) - также возвращает массив, но (в отличии от предыдущего метода, который возвращает массив объектов типа Object) возвращает массив объектов типа, переданного в параметре.

 

Работа с файлами в Java

ФАЙЛЫ. ПОТОКИ ВВОДА/ВЫВОДА

Потоки ввода/вывода используются для передачи данных в файловые потоки и на консоль. Потоки представляют собой объекты соответствующих классов. Библиотека ввода/вывода предоставляет пользователю большое число классов и методов и постоянно обновляется.

Класс File

Для работы с физическим файлами и каталогами (директориями), расположенными на внешних носителях, в приложениях Java используются классы из пакета java.io.

Класс Fileслужит для хранения и обработки в качестве объектов каталогов и имен файлов. Этот класс не содержит методы для работы с содержимым файла, но позволяет манипулировать такими свойствами файла, как права доступа, дата и время создания, путь в иерархии каталогов, создание, удаление файла, изменение его имени и каталога и т.д.

Объект класса Fileсоздается в Java одним из нижеприведенных способов:

File myFile = new File(”\\com\\myfile.txt”);

File myDir = new File(”c:\\jdk1.6.0\\src\\java\\io”);

File myFile = new File(myDir, ”File.java”);

File myFile = new File(”c:\\com”, ”myfile.txt”);

File myFile = new File(new URL(”Интернет-адрес”));

В первом случае создается объект, соответствующий файлу, во втором – подкаталогу. Третий и четвертый случаи идентичны. Для создания объекта указывается каталог и имя файла. В пятом – создается объект, соответствующий адресу в Интернете.

При создании объекта класса Fileлюбым из конструкторов компилятор не выполняет проверку на существование физического файла с заданным путем.

Существует разница между разделителями, употребляющимися при записи пути к файлу: для системы Unix – “/”, а для Windows – “\\”.

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

Пример 1. Работа с файловой системой (обрабатывается файл c:/1.txt), состоящая из двух частей. Проанализируйте и отладьте обе части.

 

importjava.io.*;

importjava.util.*;

publicclass FileTest {

 

publicstaticvoid main(String[] args) {

// часть 1

//c объектом типа File ассоциируется файл на диске c:/1.txt

File fp = new File("c:/1.txt");

if(fp.exists()) {

System.out.println(fp.getName() + " существует");

if(fp.isFile()) {//если объект – дисковый файл

System.out.println("Путь к файлу:\t"

+ fp.getPath());

System.out.println("Абсолютный путь:\t"

+ fp.getAbsolutePath());

System.out.println("Размерфайла:\t"

+ fp.length());

System.out.println("Последняямодификация :\t"

+ new Date(fp.lastModified()));

System.out.println("Файлдоступендлячтения:\t"

+ fp.canRead());

System.out.println("Файлдоступендлязаписи:\t"

+ fp.canWrite());

System.out.println("Файлудален:\t"

+ fp.delete());

}

} else {

System.out.println("файл " + fp.getName() + " несуществует");

}

try{

if(fp.createNewFile())

System.out.println("Файл " + fp.getName()

+ " создан");

} catch(IOException e) {

System.err.println(e);

}

// часть 2

// в объект типа File помещается каталог\директория

// каталог "c:/1" должен быть создан с несколькими файлами

File dir = new File("c:/1");

if (dir.exists() && dir.isDirectory())/*еслиобъект

является каталогом и если этот

каталог существует */

System.out.println();

System.out.println("каталог " + dir.getName() + " существует");

File[] files= dir.listFiles();

for(int i = 0; i < files.length; i++){

Date date = new Date(files[i].lastModified());

System.out.print("\n" + files[i].getPath()

+ " \t| " + files[i].length() + "\t| "

+ date.toString());

//использовать toLocaleString() или toGMTString()

}

// метод listRoots() возвращает доступные корневые каталоги

File root = File.listRoots()[1];

System.out.printf("\n%s %,d из %,d свободно.", root.getPath(),root.getUsableSpace(),root.getTotalSpace());

}

}

 

В результате работы части 1 данной программы файл 1.txtбудет очищен, а на консоль выведено:

1.txt существует

Путь к файлу: c:\1.txt

Абсолютный путь: c:\1.txt

Размер файла: 0

Последняя модификация : Sat Dec 15 11:48:57 MSK 2012

Файл доступен для чтения: true

Файл доступен для записи: true

Файл удален: true

Файл 1.txt создан

У каталога как объекта класса Fileесть дополнительное свойство - просмотр списка имен файлов с помощью методов list(), listFiles(), listRoots(). Благодаря данному свойству, в результате работы части 2 данной программы на консоль выводится системная информация о содержимом указанного каталога, например, вот такая:

 

каталог 1 существует

 

c:\1\1.txt | 322 | MonJul 30 13:05:06 MSK 2012

c:\1\answer.txt | 187 | Sun Oct 14 12:06:02 MSK 2012

c:\1\books.html | 1275 | Sat Nov 10 16:58:22 MSK 2012

c:\1\Books.txt | 519 | Mon Jul 30 09:56:51 MSK 2012

c:\1\Books.xml | 530 | Mon Jul 30 11:07:13 MSK 2012

c:\1\Books1.xml | 214 | Sat May 30 13:06:16 MSD 2009

c:\1\Books2.xml | 189 | Sat May 30 13:12:32 MSD 2009

c:\1\Hello_Sam.class | 434 | Sat Nov 10 10:58:14 MSK 2012

c:\1\Hello_Sam.java | 134 | Sat Nov 10 10:57:19 MSK 2012

c:\1\index.html | 508 | Sat Nov 10 09:17:07 MSK 2012

c:\1\Samojlova.class | 402 | Sat Nov 10 09:05:48 MSK 2012

c:\1\Samojlova.java | 212 | Sat Nov 10 08:58:32 MSK 2012

c:\1\Samojlova_Data.MDF | 1048576 | Fri Dec 14 20:32:27 MSK 2012

c:\1\Samojlova_log.LDF | 516096 | Fri Dec 14 20:32:27 MSK 2012

c:\1\Запуск Java.txt | 212 | Sat Nov 10 12:52:01 MSK 2012

c:\1\Копия index.html | 221 | Sat Nov 10 11:54:55 MSK 2012

c:\1\СамойловаТатьянаАрк.txt | 186 | Sun Jul 29 11:17:23 MSK 2012

c:\1\СамойловаТатьянаАркадьевна.txt | 491 | Sun Oct 14 12:11:57 MSK 2012

c:\1\Самойлова_Татьяна.txt | 136 | Sun Oct 14 11:50:14 MSK 2012

c:\1\Словарь.txt | 3637 | Thu Jul 19 08:02:45 MSK 2012

C:\ 8 487 092 224 из 33 682 485 248 свободно.

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...