From 49a24f5c8161617a13d007bb90c4ab2f14be975c Mon Sep 17 00:00:00 2001 From: azriel-11 <59181348+azriel-11@users.noreply.github.com> Date: Tue, 2 Jun 2026 18:41:20 +0300 Subject: [PATCH 1/3] Implementation of the scalar plus --- .../lesson02/baksalyar/CalcException.java | 23 +++++++++++++ .../lesson02/baksalyar/MathRunner.java | 26 +++++++++++++++ .../baksalyar/servis/ActionProcessing.java | 26 +++++++++++++++ .../baksalyar/servis/factory/plus/Plus.java | 7 ++++ .../factory/plus/matrixPlus/MatrixPlus.java | 11 +++++++ .../factory/plus/scalarPlus/ScalarPlus.java | 27 +++++++++++++++ .../plus/scalarPlus/ScalarPlusMatrix.java | 19 +++++++++++ .../plus/scalarPlus/ScalarPlusScalar.java | 11 +++++++ .../plus/scalarPlus/ScalarPlusVector.java | 17 ++++++++++ .../factory/plus/vectorPlus/VectorPlus.java | 27 +++++++++++++++ .../plus/vectorPlus/VectorPlusVector.java | 19 +++++++++++ .../lesson02/baksalyar/tensor/Matrix.java | 33 +++++++++++++++++++ .../lesson02/baksalyar/tensor/Scalar.java | 22 +++++++++++++ .../lesson02/baksalyar/tensor/Var.java | 4 +++ .../lesson02/baksalyar/tensor/Vector.java | 33 +++++++++++++++++++ 15 files changed, 305 insertions(+) create mode 100644 src/com/javarush/module2/lesson02/baksalyar/CalcException.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/MathRunner.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java create mode 100644 src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java diff --git a/src/com/javarush/module2/lesson02/baksalyar/CalcException.java b/src/com/javarush/module2/lesson02/baksalyar/CalcException.java new file mode 100644 index 0000000..f09f3e6 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/CalcException.java @@ -0,0 +1,23 @@ +package module2.lesson02.baksalyar; + +public class CalcException extends RuntimeException { + public CalcException(String message) { + super(message); + } + + protected CalcException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public CalcException(Throwable cause) { + super(cause); + } + + public CalcException(String message, Throwable cause) { + super(message, cause); + } + + public CalcException() { + super(); + } +} \ No newline at end of file diff --git a/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java new file mode 100644 index 0000000..dc63f26 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java @@ -0,0 +1,26 @@ +package module2.lesson02.baksalyar; + +import module2.lesson02.baksalyar.servis.ActionProcessing; +import module2.lesson02.baksalyar.tensor.Matrix; +import module2.lesson02.baksalyar.tensor.Scalar; +import module2.lesson02.baksalyar.tensor.Var; +import module2.lesson02.baksalyar.tensor.Vector; + +import java.util.Scanner; + +public class MathRunner { + static void main() { +// Var left=new Scalar(3); +// Var right=new Vector("[1,2,3,4]"); + + Scalar left = new Scalar(2.0); +// Var right = new Scalar(3); +// Var right =new Vector(new double[]{1,2,3,4}); + Var right =new Matrix(new double[][]{{1, 2}, {3, 4}}); + + ActionProcessing process = new ActionProcessing(); + + var resylt = process.plus(left, right); + System.out.println(resylt.toString()); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java b/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java new file mode 100644 index 0000000..a0a8b5f --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java @@ -0,0 +1,26 @@ +package module2.lesson02.baksalyar.servis; + +import module2.lesson02.baksalyar.CalcException; +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.servis.factory.plus.matrixPlus.MatrixPlus; +import module2.lesson02.baksalyar.servis.factory.plus.scalarPlus.*; +import module2.lesson02.baksalyar.servis.factory.plus.vectorPlus.VectorPlus; +import module2.lesson02.baksalyar.tensor.*; + +import java.util.HashMap; +import java.util.Map; + +public class ActionProcessing { + private Map, Plus> mapPlus = new HashMap<>(); + + public ActionProcessing() { + mapPlus.put(Scalar.class, new ScalarPlus()); + mapPlus.put(Vector.class, new VectorPlus()); + mapPlus.put(Matrix.class, new MatrixPlus()); + } + + public Var plus(Var left, Var right) { + if (!mapPlus.containsKey(left.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } + return mapPlus.get(left.getClass()).plus(left, right); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java new file mode 100644 index 0000000..5c74d24 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java @@ -0,0 +1,7 @@ +package module2.lesson02.baksalyar.servis.factory.plus; + +import module2.lesson02.baksalyar.tensor.Var; + +public interface Plus { + public Var plus(Var left, Var right); +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java new file mode 100644 index 0000000..7018940 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java @@ -0,0 +1,11 @@ +package module2.lesson02.baksalyar.servis.factory.plus.matrixPlus; + +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.Var; + +public class MatrixPlus implements Plus { + @Override + public Var plus(Var left, Var right) { + return null; + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java new file mode 100644 index 0000000..34ccb73 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java @@ -0,0 +1,27 @@ +package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; + +import module2.lesson02.baksalyar.CalcException; +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.*; + + +import java.util.HashMap; +import java.util.Map; + +public class ScalarPlus implements Plus { + + private static Map, Plus> map = new HashMap<>(); + + public ScalarPlus() { + map.put(Scalar.class, new ScalarPlusScalar()); + map.put(Vector.class, new ScalarPlusVector()); + map.put(Matrix.class, new ScalarPlusMatrix()); + } + + + @Override + public Var plus(Var left, Var right) { + if (!map.containsKey(right.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } + return map.get(right.getClass()).plus(left, right); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java new file mode 100644 index 0000000..406fc60 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java @@ -0,0 +1,19 @@ +package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; + +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.*; + +public class ScalarPlusMatrix implements Plus { + @Override + public Var plus(Var left, Var right) { + double[][] result = ((Matrix)right).getValues(); + double valueScalar = ((Scalar)left).getValue(); + for (int i = 0; i < result.length; i++) { + for (int j = 0; j < result[i].length; j++) { + result[i][j] += valueScalar; + } + } + + return new Matrix(result); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java new file mode 100644 index 0000000..88084b3 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java @@ -0,0 +1,11 @@ +package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; + +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.*; + +public class ScalarPlusScalar implements Plus { + @Override + public Var plus(Var left, Var right) { + return new Scalar(((Scalar)left).getValue() + ((Scalar)right).getValue()); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java new file mode 100644 index 0000000..0fc9006 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java @@ -0,0 +1,17 @@ +package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; + +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.*; + +public class ScalarPlusVector implements Plus { + + @Override + public Var plus(Var left, Var right) { + double[] result = ((Vector)right).getValues().clone(); + double valueScalar = ((Scalar)left).getValue(); + for(int i = 0; i < result.length; i++){ + result[i] += valueScalar; + } + return new Vector(result); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java new file mode 100644 index 0000000..0d975f1 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java @@ -0,0 +1,27 @@ +package module2.lesson02.baksalyar.servis.factory.plus.vectorPlus; + +import module2.lesson02.baksalyar.CalcException; +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.servis.factory.plus.scalarPlus.ScalarPlusScalar; +import module2.lesson02.baksalyar.tensor.Scalar; +import module2.lesson02.baksalyar.tensor.Var; +import module2.lesson02.baksalyar.tensor.Vector; + +import java.util.HashMap; +import java.util.Map; + +public class VectorPlus implements Plus { + private static Map, Plus> map = new HashMap<>(); + + public VectorPlus() { + map.put(Scalar.class, new ScalarPlusScalar()); + map.put(Vector.class, new VectorPlusVector()); +// map.put(Matrix.class, new ScalarPlusMatrix()); + } + + @Override + public Var plus(Var left, Var right) { + if (!map.containsKey(right.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } + return map.get(right.getClass()).plus(left, right); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java new file mode 100644 index 0000000..31014d3 --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java @@ -0,0 +1,19 @@ +package module2.lesson02.baksalyar.servis.factory.plus.vectorPlus; + +import module2.lesson02.baksalyar.CalcException; +import module2.lesson02.baksalyar.servis.factory.plus.Plus; +import module2.lesson02.baksalyar.tensor.Var; +import module2.lesson02.baksalyar.tensor.Vector; + +public class VectorPlusVector implements Plus { + @Override + public Var plus(Var left, Var right) { + double[] result = ((Vector)left).getValues().clone(); + double[] rightValue = ((Vector)right).getValues().clone(); + if (result.length != rightValue.length) {throw new CalcException("Vector lengths do not match");} + for (int i = 0; i < result.length; i++) { + result[i] += rightValue[i]; + } + return new Vector(result); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java new file mode 100644 index 0000000..4d137ce --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java @@ -0,0 +1,33 @@ +package module2.lesson02.baksalyar.tensor; + +import java.util.Arrays; + +public class Matrix extends Var{ + private final double[][] values; + + public Matrix(double[][] values){this.values = values;} + + public Matrix(String strMatrixValues){ + String[] rows = strMatrixValues.trim().split("\\]\\s+\\["); + values = new double[rows.length][]; + + for (int i = 0; i < rows.length; i++) { + String row = rows[i]; + row = row.replace("[", "").replace("]", ""); + String[] elements = row.split(",\\s*"); + values[i] = new double[elements.length]; + for (int j = 0; j < elements.length; j++) { + values[i][j] = Integer.parseInt(elements[j].trim()); + } + } + } + + public double[][] getValues() { + return values; + } + + @Override + public String toString() { + return Arrays.deepToString(values); + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java new file mode 100644 index 0000000..6ca0cbe --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java @@ -0,0 +1,22 @@ +package module2.lesson02.baksalyar.tensor; + +public class Scalar extends Var { + private final double value; + + public Scalar(double value){ + this.value = value; + } + + public Scalar(String value){ + this.value = Double.parseDouble(value); + } + + public Scalar(Scalar other){this.value = other.value;} + + public double getValue() {return value;} + + @Override + public String toString() { + return value + ""; + } +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java new file mode 100644 index 0000000..0ddf65a --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java @@ -0,0 +1,4 @@ +package module2.lesson02.baksalyar.tensor; + +public class Var { +} diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java new file mode 100644 index 0000000..d4a644a --- /dev/null +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java @@ -0,0 +1,33 @@ +package module2.lesson02.baksalyar.tensor; + +import java.util.Arrays; + +public class Vector extends Var{ + private final double[] values; + + public Vector(double[] values) { + this.values = values.clone(); + } + + public Vector(Vector vector) { + this.values = vector.values.clone(); + } + + public Vector(String strVectorValues){ + String[] parts = strVectorValues.replaceAll("\\s+", "") + .replace("[", "") + .replace("]", "") + .split(","); + values = new double[parts.length]; + for(int i = 0; i < strVectorValues.length(); i++){ + values[i] = Double.parseDouble(parts[i]); + } + } + + public double[] getValues() {return values;} + + @Override + public String toString() { + return Arrays.toString(values); + } +} From d7a208c1c626e249a1c3a39e5afa5c6c622aa13e Mon Sep 17 00:00:00 2001 From: azriel-11 <59181348+azriel-11@users.noreply.github.com> Date: Tue, 2 Jun 2026 18:43:58 +0300 Subject: [PATCH 2/3] Implementation of the scalar plus --- src/com/javarush/module2/lesson02/baksalyar/MathRunner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java index dc63f26..9f166b9 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java +++ b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java @@ -18,6 +18,7 @@ static void main() { // Var right =new Vector(new double[]{1,2,3,4}); Var right =new Matrix(new double[][]{{1, 2}, {3, 4}}); + ActionProcessing process = new ActionProcessing(); var resylt = process.plus(left, right); From 6e3af74724e7bf2b45d9de66629b02eff28e2534 Mon Sep 17 00:00:00 2001 From: azriel-11 <59181348+azriel-11@users.noreply.github.com> Date: Wed, 3 Jun 2026 00:22:48 +0300 Subject: [PATCH 3/3] Changed the code based on the use of the Double Dispatch technique --- .../lesson02/baksalyar/MathRunner.java | 25 ++++------------ .../baksalyar/servis/ActionProcessing.java | 26 ---------------- .../baksalyar/servis/factory/plus/Plus.java | 7 ----- .../factory/plus/matrixPlus/MatrixPlus.java | 11 ------- .../factory/plus/scalarPlus/ScalarPlus.java | 27 ----------------- .../plus/scalarPlus/ScalarPlusMatrix.java | 19 ------------ .../plus/scalarPlus/ScalarPlusScalar.java | 11 ------- .../plus/scalarPlus/ScalarPlusVector.java | 17 ----------- .../factory/plus/vectorPlus/VectorPlus.java | 27 ----------------- .../plus/vectorPlus/VectorPlusVector.java | 19 ------------ .../lesson02/baksalyar/tensor/Matrix.java | 29 +++++++++++++++++- .../lesson02/baksalyar/tensor/Scalar.java | 30 +++++++++++++++++++ .../lesson02/baksalyar/tensor/Var.java | 25 +++++++++++++++- .../lesson02/baksalyar/tensor/Vector.java | 30 ++++++++++++++++++- 14 files changed, 117 insertions(+), 186 deletions(-) delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java delete mode 100644 src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java diff --git a/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java index 9f166b9..8e44151 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java +++ b/src/com/javarush/module2/lesson02/baksalyar/MathRunner.java @@ -1,27 +1,14 @@ package module2.lesson02.baksalyar; -import module2.lesson02.baksalyar.servis.ActionProcessing; -import module2.lesson02.baksalyar.tensor.Matrix; -import module2.lesson02.baksalyar.tensor.Scalar; -import module2.lesson02.baksalyar.tensor.Var; -import module2.lesson02.baksalyar.tensor.Vector; - -import java.util.Scanner; +import module2.lesson02.baksalyar.tensor.*; public class MathRunner { static void main() { -// Var left=new Scalar(3); -// Var right=new Vector("[1,2,3,4]"); - - Scalar left = new Scalar(2.0); -// Var right = new Scalar(3); -// Var right =new Vector(new double[]{1,2,3,4}); + Var left = new Scalar(1); +// Var right = new Scalar(2); +// Var right = new Vector(new double[]{1,2,3,4}); Var right =new Matrix(new double[][]{{1, 2}, {3, 4}}); - - - ActionProcessing process = new ActionProcessing(); - - var resylt = process.plus(left, right); - System.out.println(resylt.toString()); + var result = left.plus(right); + System.out.println(result); } } diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java b/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java deleted file mode 100644 index a0a8b5f..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/ActionProcessing.java +++ /dev/null @@ -1,26 +0,0 @@ -package module2.lesson02.baksalyar.servis; - -import module2.lesson02.baksalyar.CalcException; -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.servis.factory.plus.matrixPlus.MatrixPlus; -import module2.lesson02.baksalyar.servis.factory.plus.scalarPlus.*; -import module2.lesson02.baksalyar.servis.factory.plus.vectorPlus.VectorPlus; -import module2.lesson02.baksalyar.tensor.*; - -import java.util.HashMap; -import java.util.Map; - -public class ActionProcessing { - private Map, Plus> mapPlus = new HashMap<>(); - - public ActionProcessing() { - mapPlus.put(Scalar.class, new ScalarPlus()); - mapPlus.put(Vector.class, new VectorPlus()); - mapPlus.put(Matrix.class, new MatrixPlus()); - } - - public Var plus(Var left, Var right) { - if (!mapPlus.containsKey(left.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } - return mapPlus.get(left.getClass()).plus(left, right); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java deleted file mode 100644 index 5c74d24..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/Plus.java +++ /dev/null @@ -1,7 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus; - -import module2.lesson02.baksalyar.tensor.Var; - -public interface Plus { - public Var plus(Var left, Var right); -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java deleted file mode 100644 index 7018940..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/matrixPlus/MatrixPlus.java +++ /dev/null @@ -1,11 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.matrixPlus; - -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.Var; - -public class MatrixPlus implements Plus { - @Override - public Var plus(Var left, Var right) { - return null; - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java deleted file mode 100644 index 34ccb73..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlus.java +++ /dev/null @@ -1,27 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; - -import module2.lesson02.baksalyar.CalcException; -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.*; - - -import java.util.HashMap; -import java.util.Map; - -public class ScalarPlus implements Plus { - - private static Map, Plus> map = new HashMap<>(); - - public ScalarPlus() { - map.put(Scalar.class, new ScalarPlusScalar()); - map.put(Vector.class, new ScalarPlusVector()); - map.put(Matrix.class, new ScalarPlusMatrix()); - } - - - @Override - public Var plus(Var left, Var right) { - if (!map.containsKey(right.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } - return map.get(right.getClass()).plus(left, right); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java deleted file mode 100644 index 406fc60..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusMatrix.java +++ /dev/null @@ -1,19 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; - -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.*; - -public class ScalarPlusMatrix implements Plus { - @Override - public Var plus(Var left, Var right) { - double[][] result = ((Matrix)right).getValues(); - double valueScalar = ((Scalar)left).getValue(); - for (int i = 0; i < result.length; i++) { - for (int j = 0; j < result[i].length; j++) { - result[i][j] += valueScalar; - } - } - - return new Matrix(result); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java deleted file mode 100644 index 88084b3..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusScalar.java +++ /dev/null @@ -1,11 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; - -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.*; - -public class ScalarPlusScalar implements Plus { - @Override - public Var plus(Var left, Var right) { - return new Scalar(((Scalar)left).getValue() + ((Scalar)right).getValue()); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java deleted file mode 100644 index 0fc9006..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/scalarPlus/ScalarPlusVector.java +++ /dev/null @@ -1,17 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.scalarPlus; - -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.*; - -public class ScalarPlusVector implements Plus { - - @Override - public Var plus(Var left, Var right) { - double[] result = ((Vector)right).getValues().clone(); - double valueScalar = ((Scalar)left).getValue(); - for(int i = 0; i < result.length; i++){ - result[i] += valueScalar; - } - return new Vector(result); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java deleted file mode 100644 index 0d975f1..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlus.java +++ /dev/null @@ -1,27 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.vectorPlus; - -import module2.lesson02.baksalyar.CalcException; -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.servis.factory.plus.scalarPlus.ScalarPlusScalar; -import module2.lesson02.baksalyar.tensor.Scalar; -import module2.lesson02.baksalyar.tensor.Var; -import module2.lesson02.baksalyar.tensor.Vector; - -import java.util.HashMap; -import java.util.Map; - -public class VectorPlus implements Plus { - private static Map, Plus> map = new HashMap<>(); - - public VectorPlus() { - map.put(Scalar.class, new ScalarPlusScalar()); - map.put(Vector.class, new VectorPlusVector()); -// map.put(Matrix.class, new ScalarPlusMatrix()); - } - - @Override - public Var plus(Var left, Var right) { - if (!map.containsKey(right.getClass())) {throw new CalcException("Operation %s + %s is not allowed".formatted(left, right)); } - return map.get(right.getClass()).plus(left, right); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java b/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java deleted file mode 100644 index 31014d3..0000000 --- a/src/com/javarush/module2/lesson02/baksalyar/servis/factory/plus/vectorPlus/VectorPlusVector.java +++ /dev/null @@ -1,19 +0,0 @@ -package module2.lesson02.baksalyar.servis.factory.plus.vectorPlus; - -import module2.lesson02.baksalyar.CalcException; -import module2.lesson02.baksalyar.servis.factory.plus.Plus; -import module2.lesson02.baksalyar.tensor.Var; -import module2.lesson02.baksalyar.tensor.Vector; - -public class VectorPlusVector implements Plus { - @Override - public Var plus(Var left, Var right) { - double[] result = ((Vector)left).getValues().clone(); - double[] rightValue = ((Vector)right).getValues().clone(); - if (result.length != rightValue.length) {throw new CalcException("Vector lengths do not match");} - for (int i = 0; i < result.length; i++) { - result[i] += rightValue[i]; - } - return new Vector(result); - } -} diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java index 4d137ce..d4a05f4 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Matrix.java @@ -2,7 +2,7 @@ import java.util.Arrays; -public class Matrix extends Var{ +public class Matrix extends Var { private final double[][] values; public Matrix(double[][] values){this.values = values;} @@ -26,6 +26,33 @@ public double[][] getValues() { return values; } + @Override + public Var plus(Var other) { + return other.plusMatrix(this); + } + + @Override + public Matrix plusScalar(Scalar other) { + double[][] result = values.clone(); + for (int i = 0; i < result.length; i++) { + for (int j = 0; j < result[i].length; j++) { + result[i][j] += other.getValue(); + } + } + return new Matrix(result); + } + + @Override + public Var plusMatrix(Matrix other) { + var result = other.values.clone(); + for (int i = 0; i < result.length; i++) { + for (int j = 0; j < result[i].length; j++) { + result[i][j] += values[i][j]; + } + } + return new Matrix(result); + } + @Override public String toString() { return Arrays.deepToString(values); diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java index 6ca0cbe..d4bbb12 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Scalar.java @@ -15,6 +15,36 @@ public Scalar(String value){ public double getValue() {return value;} + @Override + public Var plus(Var other) { + return other.plusScalar(this); + } + + @Override + public Scalar plusScalar(Scalar other) { + return new Scalar(value + other.value); + } + + @Override + public Vector plusVector(Vector other) { + double[] result = other.getValues().clone(); + for(int i = 0; i < result.length; i++){ + result[i] += value; + } + return new Vector(result); + } + + @Override + public Matrix plusMatrix(Matrix other) { + double[][] result = other.getValues().clone(); + for (int i = 0; i < result.length; i++) { + for (int j = 0; j < result[i].length; j++) { + result[i][j] += value; + } + } + return new Matrix(result); + } + @Override public String toString() { return value + ""; diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java index 0ddf65a..fef0032 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Var.java @@ -1,4 +1,27 @@ package module2.lesson02.baksalyar.tensor; -public class Var { + +import module2.lesson02.baksalyar.CalcException; + +public abstract class Var { + public Var plus(Var other) {throw new CalcException("Operation %s + %s is not allowed".formatted(this, other));} + public Var plusScalar(Scalar other){throw new CalcException("Operation %s + %s is not allowed".formatted(this, other));} + public Var plusVector(Vector other){throw new CalcException("Operation %s + %s is not allowed".formatted(this, other));} + public Var plusMatrix(Matrix other){throw new CalcException("Operation %s + %s is not allowed".formatted(this, other));} + + public Var minus(Var other) {throw new CalcException("Operation %s - %s is not allowed".formatted(this, other));} + public Var minusScalar(Scalar other){throw new CalcException("Operation %s - %s is not allowed");} + public Var minusVector(Vector other){throw new CalcException("Operation %s - %s is not allowed");} + public Var minusMatrix(Matrix other){throw new CalcException("Operation %s - %s is not allowed");} + + public Var multiply(Var other) {throw new CalcException("Operation %s * %s is not allowed");} + public Var multiplyScalar(Scalar other){throw new CalcException("Operation %s * %s is not allowed");} + public Var multiplyVector(Vector other){throw new CalcException("Operation %s * %s is not allowed");} + public Var multiplyMatrix(Matrix other){throw new CalcException("Operation %s * %s is not allowed");} + + public Var divide(Var other) {throw new CalcException("Operation %s / %s is not allowed");} + public Var divisionScalar(Scalar other) {throw new CalcException("Operation %s / %s is not allowed");} + public Var divisionVector(Vector other) {throw new CalcException("Operation %s / %s is not allowed");} + public Var divisionMatrix(Matrix other) {throw new CalcException("Operation %s / %s is not allowed");} + } diff --git a/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java b/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java index d4a644a..05fa4e5 100644 --- a/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java +++ b/src/com/javarush/module2/lesson02/baksalyar/tensor/Vector.java @@ -1,8 +1,10 @@ package module2.lesson02.baksalyar.tensor; +import module2.lesson02.baksalyar.CalcException; + import java.util.Arrays; -public class Vector extends Var{ +public class Vector extends Var { private final double[] values; public Vector(double[] values) { @@ -26,6 +28,32 @@ public Vector(String strVectorValues){ public double[] getValues() {return values;} + @Override + public Var plus(Var other) { + return other.plusVector(this); + } + + @Override + public Vector plusScalar(Scalar other) { + double[] result = values.clone(); + for(int i = 0; i < result.length; i++){ + result[i] += other.getValue(); + } + return new Vector(result); + } + + @Override + public Vector plusVector(Vector other) { + if (values.length != other.values.length) { + throw new CalcException("Operation %s + %s is not allowed".formatted(this, other)); + } + var result = other.getValues().clone(); + for(int i = 0; i < result.length; i++){ + result[i] += values[i]; + } + return new Vector(result); + } + @Override public String toString() { return Arrays.toString(values);