КлассыBufferedReader, BufferedWriter, PrintWriter
Примерыобьявления:
FileReaderinputStream = null;
FileWriteroutputStream = null;
inputStream = new FileReader ( "input.txt" );
outputStream = new FileWriter ( "output.txt" );
2. Потоки строк: свойства, связь потока с файлом, чтение, запись, закрытие:
Текстовые потоки в java это буферизированные потоки символов с именами BufferdReader, PrintWriter. Содержат кроме обычных методов операции readLine (ввод строки) и println (вывод строки). Текстовые потоки используются для работы с данными, которые состоят из символов.
Связь потока с файлами:
Объявление вводного потока input типа BufferedReader:
Input= new BufferedReader(newFileReader(“..txt ”));
Конструктор класса BufferedReader требует в качестве параметра символьный файловый поток, который связан с файлом обычном образом.
Объявление выводного потока output типа PrintWriter
Output =newPrintWriter(“….txt”);
Обработка строк текстового файла, не представляющих числовые данные, обычно состоит из следующих действий:
-ввод строки из файла при помощи метода readLine
-разделение строки на слова
-обработка слов строки
Обработка числовых данных в свободном формате отличается от обработки текстовых строк только тем, что после разделения строки на слова слово преобразуется в число подходящим методом. Методы находятся в классах-оболочках стандартных типов. Например метод parseDouble(word) класса double. Возвращает double значение для строки word.
3. Исключения при работе с потоками:
Исключения в языке java- это объект, который описывает исключительную ситуацию, произошедшую в некоторой части кода. Когда создается исключительная ситуация, создается обьект, представляющий это исключение, и «вбрасываются» в метод, вызвавший ошибку. В свою очередь, метод может выбрать, обрабатывать ли исключение самому или передать его куда то еще. В любом случае, в некоторой точке исключения «захватываются» и обрабатываются.
Обработка исключений в java управляется с помощью 5 ключевыхслов - try, catch, throw, throws, finally.
Программные операторы, которые нужно контролировать относительно исключений, содержаться в блоке try. Если в блоке try происходит исключение, то говорят, что оно выброшено (thrown) этим блоком. Оператор catch перехватывает исключение и обрабатывает его.
Общая форма блока обработки исключений:
Try{//блок кода для контроля над ошибками
}
Catch(ExceptionType1 e){
//обработчикисключенийдля ExceptionType1
}
Catch(ExceptionType2 e){
//обработчикисключенийдля ExceptionType2
}
Finally{
//блок кода для обработки перед возвратом из Try блока
}
При чтении из файлов возможны следующие исключения:
-поток пуст
-не открытый/закрытый поток и т.д.
4. Понятие рекурсии, рекурсивное вычисление факториала:
Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.
N!=N*(N-1)!
При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.
Факториал:
public class Factorials {//рекурсия
public static long factR (int n) {
if (n<2) return 1L;
else return n*factR (n-1) ;
////////////второй вариант рекурсии////
другой вариант функции
public static long factR (int n) {
long r = 1L;
if (n >1) r = n * factR (n-1);
return r;
}
//////////////////////////////////////////////////
}
public static long factNr ( int n ){ //нерекурсивный
long r = 1L;
for(int i = 2; i <= n; i++) r *= i;
return r;
}
public static void main (String[ ] args) { //проверкафункций
longfr, fnr;
for(int i=5; i<22; i++) { fr = factR(i); fnr = factNr ( i );
System.out.println(" “ + i + "! =“ +fr + " “ + fnr);
}
}
5. Понятие рекурсии, рекурсивное вычисление суммы элементов массива:
Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.
При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.
Public class RecSum{
Public static intarSum(int [] B, intsart, int end){
Int res=0;
If(start<=end){
If(start==end)res=B[start]; // нерекурсивнаячасть
Else res=B[start]+arSum(B,start+1,end);//рекурсивнаячасть
}
Return res;
}
Public static void (){
Intn,sum;
Int[]A= new int[]{1,2,3,4,5};
n=A.length;
sum=arSum(A,0,n-1);
}
}
6. Понятие рекурсии, рекурсивное вычисление максимального элемента массива:
Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.
При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.
Public class Max{
public static intarMin( int[ ] B, int start, int end) {
intres=0;
if (start<=end) { res = B[start];
if (start<end) {
int min = arMin (B,start+1,end);
if (res<min) res=min;
};
};
return res;
}
public static void main ( String[ ] args ) {
int[ ] A = { 10, 3, 5, 1, 6, 4, 2, 8 }; //созданиемассива
intamin = arMin (A,0,A.length-1);
System.out.println (amin); //вызов метода и печать результата
}
}
7. Формулировка задачи о ханойских башнях:
Есть три стержня A, B, и C. На стержень A надето N дисков, наверху самый маленький, каждый следующий диск больше предыдущего, а внизу самый большой. На другие стержни дисков не надето.
Hеобходимо перенести диски со стержня A на стержень C, пользуясь стержнем B, как вспомогательным, так, чтобы диски на стержне C располагались в том же порядке, в каком они располагаются на диске A перед перемещением.
При перемещении, никогда нельзя класть больший диск на меньший, диски перекладываются по одному. В основе решения задачи и реализации ее в программе лежит рекурсивный метод. Для того, чтобы переложить всю пирамиду, надо сначала переложить все, что выше самого большого диска, с первого на вспомогательный стержень, потом переложить это самое большой диск с первого на третий стержень, а потом переложить оставшуюся пирамиду со второго на третий стержень, пользуясь первым стержнем, как вспомогательным.
8. Применение рекурсии при определении связного списка:
Рекурсивное определение списка элементов (пусть элементами будут числа)
(Список) ::= (элемент) | //нерекурсивная часть,
(Список)(запятая)(элемент) | //рекурсивная часть
(элемент)(запятая)(Список) //рекурсивная часть
Если есть некоторый список, то можно получить новый список,
приписав элемент слева или справа
Пример:
Список 23, 35, 74, 2, 11 - это
элемент 23 запятая Список 35, 74, 2, 11
Список 35, 74, 2, 11 – это
элемент 35 запятая Список 74, 2, 11
Список 74, 2, 11 – это
Элемент 74 запятая Список 2, 11
Список 2, 11 - это
элемент 2 запятая Список 11
Список 11 – это элемент, т.е. частный случай списка
9. Понятие списка. Объявление элемента списка:
Рекурсивные данные: связный список
Список -упорядоченная совокупность, состоящая из элементов.
Длина списка - число элементов, содержащихся в списке, список нулевой длины называется пустым списком. К списку применимы операции включения, исключения. Основные операции (методы) для списков: добавить элемент (новый элемент становится первым в списке)удалить элемент (удаляется первый элемент списка, второй станет первым)дополнительные методы удалить все элементы копировать список проверить равенство списков добавить элемент в конец списка; удалить элемент из конца списка добавить или удалить элемент получить элемент по его номеру изменить порядок элементов на упорядочить элементы обратный найти позицию данного элемента в упорядоченном списке
Добавление элемента
1. Создается новый элемент, задается ссылка на него, и заполняется
информационная часть. Поле связи (next) пустое, т.е. = null
2. Ссылка из головы копируется в поле next нового элемента (стрелка 3).
Теперь на первый элемент списка указывают два элемента: голова списка
и новый элемент (стрелки 1 и 3).
3. Ссылка на новый элемент копируется в поле next головы, так что next начинает "указывать" на новый элемент (появляется стрелка
2, стрелка 1 исчезает).
После этого новый элемент становится первым элементом списка:
Голова указывает на новый элемент, новый элемент – на старый первый,
далее – как было в исходном списке.
Текст программы:
Определяемкласс – Элементсписка. Дляуниверсальностиполеinf –
типаObject(Object – базовый тип длявсехобъектныхтипов)
publicclassListEl { //ListElement – элементсписка
Objectinf; //информационнаячасть
ListElnext; //ссылка на следующийэлемент
ListEl( ) { next = null; inf = null; } //конструктор
ListEl (Object ob) { inf = ob; next = null; } //конструктор
Первыйконструкторсоздает "пустой" элемент – обессылки == null
Второйконструктор в ссылкуinfкопируетссылкунаобъект,
заданныйкакаргументконструктора
//добавить элемент ob к списку hd
public static void printMyList ( ListEl a ) { //печатьсписка
ListElc = a.next; //с – текущийэлементсписка
while( c != null ) { // покаестьэлементы,
System.out.print(c.inf + " "); // напечататьинфо-часть с
c = c.next; // и перейти к следующему
}; System.out.println( ); // когдавсеэлементы
// напечатаны, перейти к новой
// строке
//классObjectсодержитметодtoString, благодаря
//которомуprintlnможетвывестиобъект. При
//необходимостиtoStringпереопределяется
public static void main(String[ ] args){
ListEl list=new ListEl (); //создали≪голову≫списка
for (int i=0; i<10; i++) //10 раздобавляем к списку
// поодномуэлементу,
addToList (list, Integer.toString( i * i ) ) ; //помещаявinf-часть
//квадратыцелыхчисел
printMyList( list ); //печатаемсозданныйсписок
}
}
10. Структура объявления двусвязного списка:
Функциональность Очереди соответствует действиям с двусвязным списком:"голова" показывает на последний добавленный элемент, а "хвост" – на элемент, который должен быть удален первым. (В очереди с течением времени элементы перемещаются от "головы" к «хвосту»).
15. Типовые операции для односвязных списков:
Список - упорядоченная совокупность, состоящая из элементов.
Список называется упорядоченным, если имеется отношение предыдущего элемента к следующему. Список с таким отношением порядка называется односвязным. Здесь ссылка в каждом узле указывает на следующий узел в списке. В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла невозможно. Длина списка – это число элементов, содержащихся в списке. Список нулевой длины называется пустым списком. К списку применимы операции: включения, исключения. Списки являются простейшими динамическими типами данных.
Односвязный список:
Основные операции (методы) для списков:
добавить элемент (новый элемент становится первым в списке)
удалить элемент (удаляется первый элемент списка, второй станет первым)
Дополнительные методы:
удалить все элементы, копировать список, проверить равенство списков, добавить элемент в конец списка, удалить элемент из конца списка, добавить или удалить элемент, получить элемент по его номеру, изменить порядок элементов на обратный, упорядочить элементы, найти позицию данного элемента в упорядоченном списке.
16. Кольцевой и двусвязный списки: отличия от односвязного списка:
Двусвязный список:
В отличие от односвязного списка, в двусвязном списке ссылки в каждом узле указывают на предыдущий и на последующий узел в списке. По двусвязному списку можно передвигаться в любом направлении — как к началу, так и к концу. В этом списке проще производить удаление и перестановку элементов, так как всегда известны адреса тех элементов списка, указатели которых направлены на изменяемый элемент.
Кольцевой список:
Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным.Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний. Реализация такой структуры происходит на базе линейного списка. В каждом кольцевом списке есть указатель на первый элемент. В этом списке константы NULL не существует.
Так же существуют циклические списки с выделенным головным элементом, облегчающие полный проход через список.
Все операции и методы для односвязного списка применимы и к двусвязным спискам и кольцевым спискам!!!
17. Порядок добавления элемента в односвязный список:
1. Создается новый элемент, задается ссылка на него, и заполняется информационная часть. Поле связи (next) пустое, т.е. = null
2. Ссылка из головы копируется в поле next нового элемента (стрелка 3). /Теперь на первый элемент списка указывают два элемента: голова списка и новый элемент (стрелки 1 и 3)/
3. Ссылка на новый элемент копируется в поле nextголовы / так что next начинает "указывать" на новый элемент (появляется стрелка 2, стрелка 1 исчезает)/ После этого новый элемент становится первым элементом списка: голова указывает на новый элемент, новый элемент – на старый первый, далее – как было в исходном списке.
При удалении элемента действия проводятся в обратном порядке.
public class ListEl { //ListElement – элементсписка
Objectinf; //информационная часть
ListElnext; //ссылка на следующий элемент
ListEl( ) { next = null; inf = null; } //конструктор
ListEl (Object ob) { inf = ob; next = null; } //конструктор
public static void addToList (ListElhd, Object ob) {
ListEl e=new ListEl (ob );
if(hd.next!= null) { // если список не пуст,
ListElold= hd.next; // сохранить ссылку
hd.next =e; // голову связать с новым
e.next =old;
}
elsehd.next =e; // или сделать элемент первым
}
public static void printMyList ( ListEl a ) { //печатьсписка
ListElc= a.next; //с – текущий элемент списка
while( c != null ) { // пока есть элементы,
System.out.print(c.inf+ " "); // напечатать инфо-часть с
c= c.next; // и перейти к следующему
}; System.out.println( ); // когда все элементы
public static void main(String[ ] args){
ListEl list=new ListEl(); //создали «голову» списка
for (int i=0; i<10; i++)
addToList (list, Integer.toString(i *i ) ) ; //помещая в inf-часть
printMyList ( list ); //печатаем созданный список
}
}
Результат в терминале:
81 64 49 36 25 16 9 4 1 0
18. Основные типы коллекций, имеющиеся в JavaCollectionFramework:
Коллекции – это хранилища, поддерживающие различные способы накопления и упорядочения объектов с целью обеспечения возможностей эффективного доступа к ним. Они представляют собой реализацию абстрактных типов (структур) данных, поддерживающих три основные операции:
· добавление нового элемента в коллекцию;
· удаление элемента из коллекции;
· изменение элемента в коллекции.