Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 KB | None | 0 0
  1. public interface Vector {
  2. public double magnitude();
  3. }
  4.  
  5. public class Vector1 implements Vector {
  6. public final double x;
  7. public Vector1(double x) {
  8. this.x = x;
  9. }
  10. @Override
  11. public double magnitude() {
  12. return x;
  13. }
  14. public double getX() {
  15. return x;
  16. }
  17. }
  18.  
  19. public class Vector2 implements Vector {
  20. public final double x, y;
  21. public Vector2(double x, double y) {
  22. this.x = x;
  23. this.y = y;
  24. }
  25. @Override
  26. public double magnitude() {
  27. return Math.sqrt(x * x + y * y);
  28. }
  29. public double getX() {
  30. return x;
  31. }
  32. public double getY() {
  33. return y;
  34. }
  35. }
  36.  
  37. public class Vector {
  38. private final double[] components;
  39. public Vector(double[] components) {
  40. this.components = components;
  41. }
  42. public int dimensions() {
  43. return components.length;
  44. }
  45. public double magnitude() {
  46. double sum = 0;
  47. for (double component : components) {
  48. sum += component * component;
  49. }
  50. return Math.sqrt(sum);
  51. }
  52. public double getComponent(int index) {
  53. return components[index];
  54. }
  55. }
  56.  
  57. public interface Vector(){
  58.  
  59. abstract class Abstract {
  60. protected abstract double[] asArray();
  61.  
  62. int dimensions(){ return asArray().length; }
  63.  
  64. double magnitude(){
  65. double sum = 0;
  66. for (double component : asArray()) {
  67. sum += component * component;
  68. }
  69. return Math.sqrt(sum);
  70. }
  71.  
  72. //any additional behavior here
  73. }
  74. }
  75.  
  76. public class Scalar extends Vector.Abstract {
  77. private double x;
  78.  
  79. public double getX(){
  80. return x;
  81. }
  82.  
  83. @Override
  84. public double[] asArray(){
  85. return new double[]{x};
  86. }
  87. }
  88.  
  89. public class Cartesian extends Vector.Abstract {
  90.  
  91. public double x, y;
  92.  
  93. public double getX(){ return x; }
  94. public double getY(){ return y; }
  95.  
  96. @Override public double[] asArray(){ return new double[]{x, y}; }
  97. }
  98.  
  99. public interface Vector{
  100.  
  101. default public double magnitude(){
  102. double sum = 0;
  103. for (double component : asArray()) {
  104. sum += component * component;
  105. }
  106. return Math.sqrt(sum);
  107. }
  108.  
  109. default public int dimensions(){
  110. return asArray().length;
  111. }
  112.  
  113. default double getComponent(int index){
  114. return asArray()[index];
  115. }
  116.  
  117. double[] asArray();
  118.  
  119. // giving up a little bit of static-safety in exchange for
  120. // runtime exceptions, we can implement the getX(), getY()
  121. // etc methods here,
  122. // and simply have them throw if the dimensionality is too low
  123. // (you can of course do this on the abstract-class strategy as well)
  124.  
  125. //document or use checked-exceptions to indicate that these methods throw IndexOutOfBounds exceptions (or a wrapped version)
  126.  
  127. default public getX(){
  128. return getComponent(0);
  129. }
  130. default public getY(){
  131. return getComponent(1);
  132. }
  133. //...
  134.  
  135.  
  136. }
  137.  
  138. //as a general rule, defaulted interfaces should assume statelessness,
  139. // so you want to avoid putting mutating operations
  140. // as defaulted methods on an interface, since they'll only make your life harder
  141. }
  142.  
  143. class Vector2 extends Vector
  144. {
  145. public Vector2(double x, double y) {
  146. super(new double[]{x,y});
  147. }
  148.  
  149. public double getX() {
  150. return getComponent(0);
  151. }
  152.  
  153. public double getY() {
  154. return getComponent(1);
  155. }
  156. }
  157.  
  158. public abstract class Vector {
  159. protected abstract int dimension();
  160. protected abstract double getComponent(int i);
  161. protected abstract void setComponent(int i, double value);
  162.  
  163. public double magnitude() {
  164. double sum = 0.0;
  165. for (int i=0; i<dimension(); i++) {
  166. sum += getComponent(i) * getComponent(i);
  167. }
  168. return Math.sqrt(sum);
  169. }
  170.  
  171. public void add(Vector other) {
  172. for (int i=0; i<dimension(); i++) {
  173. setComponent(i, getComponent(i) + other.getComponent(i));
  174. }
  175. }
  176.  
  177. public static Vector1 create(double x) {
  178. return new Vector1(x);
  179. }
  180.  
  181. public static Vector create(double... values) {
  182. switch(values.length) {
  183. case 1:
  184. return new Vector1(values[0]);
  185. default:
  186. return new DynVector(values);
  187. }
  188.  
  189. }
  190. }
  191.  
  192. class Vector1 extends Vector {
  193. private double x;
  194.  
  195. public Vector1(double x) {
  196. super();
  197. this.x = x;
  198. }
  199.  
  200. @Override
  201. public double magnitude() {
  202. return Math.abs(x);
  203. }
  204.  
  205. @Override
  206. protected int dimension() {
  207. return 1;
  208. }
  209.  
  210. @Override
  211. protected double getComponent(int i) {
  212. return x;
  213. }
  214.  
  215. @Override
  216. protected void setComponent(int i, double value) {
  217. x = value;
  218. }
  219.  
  220. @Override
  221. public void add(Vector other) {
  222. x += ((Vector1) other).x;
  223. }
  224.  
  225. public void add(Vector1 other) {
  226. x += other.x;
  227. }
  228. }
  229.  
  230. class DynVector extends Vector {
  231. private double[] values;
  232. public DynVector(double[] values) {
  233. this.values = values;
  234. }
  235.  
  236. @Override
  237. protected int dimension() {
  238. return values.length;
  239. }
  240.  
  241. @Override
  242. protected double getComponent(int i) {
  243. return values[i];
  244. }
  245.  
  246. @Override
  247. protected void setComponent(int i, double value) {
  248. values[i] = value;
  249. }
  250.  
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement