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
Модифицируем класс 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.
Модифицируем классы 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