Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public interface Vector {
- public double magnitude();
- }
- public class Vector1 implements Vector {
- public final double x;
- public Vector1(double x) {
- this.x = x;
- }
- @Override
- public double magnitude() {
- return x;
- }
- public double getX() {
- return x;
- }
- }
- public class Vector2 implements Vector {
- public final double x, y;
- public Vector2(double x, double y) {
- this.x = x;
- this.y = y;
- }
- @Override
- public double magnitude() {
- return Math.sqrt(x * x + y * y);
- }
- public double getX() {
- return x;
- }
- public double getY() {
- return y;
- }
- }
- public class Vector {
- private final double[] components;
- public Vector(double[] components) {
- this.components = components;
- }
- public int dimensions() {
- return components.length;
- }
- public double magnitude() {
- double sum = 0;
- for (double component : components) {
- sum += component * component;
- }
- return Math.sqrt(sum);
- }
- public double getComponent(int index) {
- return components[index];
- }
- }
- public interface Vector(){
- abstract class Abstract {
- protected abstract double[] asArray();
- int dimensions(){ return asArray().length; }
- double magnitude(){
- double sum = 0;
- for (double component : asArray()) {
- sum += component * component;
- }
- return Math.sqrt(sum);
- }
- //any additional behavior here
- }
- }
- public class Scalar extends Vector.Abstract {
- private double x;
- public double getX(){
- return x;
- }
- @Override
- public double[] asArray(){
- return new double[]{x};
- }
- }
- public class Cartesian extends Vector.Abstract {
- public double x, y;
- public double getX(){ return x; }
- public double getY(){ return y; }
- @Override public double[] asArray(){ return new double[]{x, y}; }
- }
- public interface Vector{
- default public double magnitude(){
- double sum = 0;
- for (double component : asArray()) {
- sum += component * component;
- }
- return Math.sqrt(sum);
- }
- default public int dimensions(){
- return asArray().length;
- }
- default double getComponent(int index){
- return asArray()[index];
- }
- double[] asArray();
- // giving up a little bit of static-safety in exchange for
- // runtime exceptions, we can implement the getX(), getY()
- // etc methods here,
- // and simply have them throw if the dimensionality is too low
- // (you can of course do this on the abstract-class strategy as well)
- //document or use checked-exceptions to indicate that these methods throw IndexOutOfBounds exceptions (or a wrapped version)
- default public getX(){
- return getComponent(0);
- }
- default public getY(){
- return getComponent(1);
- }
- //...
- }
- //as a general rule, defaulted interfaces should assume statelessness,
- // so you want to avoid putting mutating operations
- // as defaulted methods on an interface, since they'll only make your life harder
- }
- class Vector2 extends Vector
- {
- public Vector2(double x, double y) {
- super(new double[]{x,y});
- }
- public double getX() {
- return getComponent(0);
- }
- public double getY() {
- return getComponent(1);
- }
- }
- public abstract class Vector {
- protected abstract int dimension();
- protected abstract double getComponent(int i);
- protected abstract void setComponent(int i, double value);
- public double magnitude() {
- double sum = 0.0;
- for (int i=0; i<dimension(); i++) {
- sum += getComponent(i) * getComponent(i);
- }
- return Math.sqrt(sum);
- }
- public void add(Vector other) {
- for (int i=0; i<dimension(); i++) {
- setComponent(i, getComponent(i) + other.getComponent(i));
- }
- }
- public static Vector1 create(double x) {
- return new Vector1(x);
- }
- public static Vector create(double... values) {
- switch(values.length) {
- case 1:
- return new Vector1(values[0]);
- default:
- return new DynVector(values);
- }
- }
- }
- class Vector1 extends Vector {
- private double x;
- public Vector1(double x) {
- super();
- this.x = x;
- }
- @Override
- public double magnitude() {
- return Math.abs(x);
- }
- @Override
- protected int dimension() {
- return 1;
- }
- @Override
- protected double getComponent(int i) {
- return x;
- }
- @Override
- protected void setComponent(int i, double value) {
- x = value;
- }
- @Override
- public void add(Vector other) {
- x += ((Vector1) other).x;
- }
- public void add(Vector1 other) {
- x += other.x;
- }
- }
- class DynVector extends Vector {
- private double[] values;
- public DynVector(double[] values) {
- this.values = values;
- }
- @Override
- protected int dimension() {
- return values.length;
- }
- @Override
- protected double getComponent(int i) {
- return values[i];
- }
- @Override
- protected void setComponent(int i, double value) {
- values[i] = value;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement