Материал: Java. Лабораторная работа 4

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

System.out.print("Reversed list: "); list.rprint();

System.out.println("list.normEuclidean(): " + list.normEuclidean()); CircularLinkedList newList = new CircularLinkedList(0); newList.add(0, 1);

newList.add(1, 2); newList.add(2, 3); newList.add(3, 4);

System.out.print("\nList[1, 2, 3, 4]: "); newList.print();

newList.remove(3);

newList.remove(2);

newList.remove(1);

newList.remove(0);

System.out.print("After removing all items:"); newList.print();

newList = new CircularLinkedList(0); newList.add(0, 1);

newList.add(0, 2); newList.add(0, 3); newList.add(0, 4);

System.out.print("List[4, 3, 2, 1]: "); newList.print();

newList.remove(0);

newList.remove(0);

newList.remove(0);

newList.remove(0);

System.out.print("After removing all items:"); newList.print();

}

}

Результат компиляции и запуска приведен на рис. 1.

Рисунок 1 — Компиляция и запуск CircularLinkedListTest.java

Задание №2.

Модифицируем класс Vectors из предыдущей работы, добавив в него следующие методы (табл. 3):

6

— метод записи вектора в байтовый поток: public static void

outputVector(Vector v, OutputStream out);

— метод чтения вектора из байтового потока: public static Vector

inputVector(InputStream in);

— метод записи вектора в символьный поток: public static void

writeVector(Vector v, Writer out);

— метод чтения вектора из символьного потока: public static Vector

readVector(Reader in).

Вобоих случаях записанный вектор будет представлять собой последовательность чисел, первым из которых является размерность вектора (тип int), а остальные являются значениями координат (тип double).

Вслучае символьного потока будем считать, что вектор записывается в одну строку, в которой числа разделены пробелами. Для чтения вектора из символьного потока будем использовать класс StreamTokenizer.

Также опишем класс VectorStreamTest (табл. 4), находящийся вне пакета vectors, содержащий точку входа программы — метод main(), в котором

проверим возможности методов записи и методов чтения. Таблица 3 — Измененный код vectors/Vectors.java

package vectors;

import java.io.IOException; import java.io.Writer; import java.io.Reader; import java.io.InputStream; import java.io.OutputStream;

import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.PrintWriter; import java.io.StreamTokenizer;

public class Vectors {

// Умножение вектора на число

public static IVector mul(IVector array, double number) { int size = array.size();

IVector r = new Array(size); try {

for (int i = 0; i < size; ++i) { r.set(i, array.get(i) * number);

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

return r;

}

7

// Сложение двух векторов

public static IVector sum(IVector array, IVector arg) throws IncompatibleVectorSizesException {

int size = array.size(); if (size != arg.size()) {

throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());

}

IVector r = new Array(size); try{

for (int i = 0; i < size; ++i) { r.set(i, array.get(i) + arg.get(i));

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

return r;

}

// Скалярное произведение двух векторов

public static double mul(IVector array, IVector arg) throws IncompatibleVectorSizesException {

int size = array.size(); if (size != arg.size()) {

throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());

}

double r = 0; try {

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

r += array.get(i) * arg.get(i);

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

return r;

}

// Метод записи вектора в байтовый поток

public static void outputVector(IVector v, OutputStream out) throws IOException {

DataOutputStream dos = new DataOutputStream(out); int len = v.size();

dos.writeInt(len); try{

for (int i = 0; i < len; ++i) { dos.writeDouble(v.get(i));

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

dos.flush();

}

// Метод чтения вектора из байтового потока

public static IVector inputVector(InputStream in) throws IOException { DataInputStream dis = new DataInputStream(in);

int len = dis.readInt(); IVector result = new Array(len);

8

try {

for (int i = 0; i < len; ++i) { result.set(i, dis.readDouble());

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

return result;

}

// Метод записи вектора в символьный поток

public static void writeVector(IVector v, Writer out) throws IOException

{

PrintWriter pw = new PrintWriter(out); int len = v.size();

pw.print(len); try{

for (int i = 0; i < len; ++i) { pw.print(' '); pw.print(v.get(i));

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

pw.flush();

}

// Метод чтения вектора из символьного потока

public static IVector readVector(Reader in) throws IOException { StreamTokenizer token = new StreamTokenizer(in);

int t = token.nextToken();

IVector v = new Array((t != StreamTokenizer.TT_EOF) ? (int) token.nval : 0);

t = token.nextToken(); try {

for (int i = 0; t != StreamTokenizer.TT_EOF; ++i, t = token.nextToken()) {

if (t == StreamTokenizer.TT_NUMBER) { v.set(i, token.nval);

}

}

}

catch(Exception e) { System.out.println(e.getMessage());

}

return v;

}

}

Таблица 4 — Код VectorStreamTest.java

import vectors.Array; import vectors.Vectors;

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.CharArrayReader; import java.io.CharArrayWriter;

public class VectorStreamTest {

public static void main(String[] args) throws Exception { Array arr = new Array(8);

for (int i = 0, len = arr.size(); i < len; ++i) { arr.set(i, i);

9

}

System.out.println("Work with byte streams"); System.out.print("Source array: "); arr.print();

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

Vectors.outputVector(arr, byteArrayOutputStream); byteArrayOutputStream.flush(); System.out.print("Internal data (in bytes): "); System.out.println(byteArrayOutputStream.toString()); ByteArrayInputStream byteArrayInputStream = new

ByteArrayInputStream(byteArrayOutputStream.toByteArray()); System.out.print("Received array: "); Vectors.inputVector(byteArrayInputStream).print();

System.out.println("\nWork with character streams"); System.out.print("Source array: ");

arr.print();

CharArrayWriter charArrayWriter = new CharArrayWriter(); Vectors.writeVector(arr, charArrayWriter); charArrayWriter.flush();

System.out.print("Internal data (in chars): "); System.out.println(charArrayWriter.toString()); CharArrayReader charArrayReader = new

CharArrayReader(charArrayWriter.toCharArray());

System.out.print("Received array: "); Vectors.readVector(charArrayReader).print();

}

}

Результат компиляции и запуска приведен на рис. 2.

Рисунок 2 — Компиляция и запуск VectorStreamTest.java Задание №3.

Модифицируем классы Array и CircularLinkedList таким образом, чтобы они были сериализуемыми (табл. 5, 6).

Таблица 5 — Измененный код vectors/Array.java

package vectors;

import java.io.Serializable;

public class Array implements IVector, Serializable {

//Конструктор public Array(int n) {

data = new double[n];

}

//Получение элемента по индексу

10

Источник: https://studfile.net/preview/16431618/