Find the Force of Gravity Between Two Objects With Java


The challenge

Your job is to find the gravitational force between two spherical objects (obj1 , obj2).

Two arrays are give :

  • arr_val (value array), consists of 3 elements
    • 1st element : mass of obj 1
    • 2nd element : mass of obj 2
    • 3rd element : distance between their centers
  • arr_unit (unit array), consists of 3 elements
    • 1st element : unit for mass of obj 1
    • 2nd element : unit for mass of obj 2
    • 3rd element : unit for distance between their centers

Mass units are :

  • kilogram (kg)
  • gram (g)
  • milligram (mg)
  • microgram (μg)
  • pound (lb)

Distance units are :

  • meter (m)
  • centimeter (cm)
  • millimeter (mm)
  • micrometer (μm)
  • feet (ft)

Additional notes

value of G = 6.67 x 10-11N.kg–2.m2

1ft = 0.3048m

1lb = 0.453592kg

return value must be Newton for force (obviously)

Test cases

import static org.junit.Assert.assertEquals;
import java.util.concurrent.ThreadLocalRandom;
import org.junit.Test;

public class TestCases {

  private static void test(double expected, double[] arrVal, String[] arrUnit) {
    assertEquals(expected, Solution.solution(arrVal, arrUnit), expected * 1e-5);
  }

  @Test
  public void fixedTests() {
    test(6.67e-12, new double[] {1000, 1000, 100}, new String[] {"g", "kg", "m"});
    test(6.67e-9, new double[] {1000, 1000, 100}, new String[] {"kg", "kg", "m"});
    test(0.0000667, new double[] {1000, 1000, 100}, new String[] {"kg", "kg", "cm"});
  }

  private static final String[] WEIGHT_UNITS = {"kg", "g", "mg", "μg", "lb"};
  private static final double[] WEIGHT_UNIT_CONVERSION_FACTORS = {1, 1e-3, 1e-6, 1e-9, 0.453592};

  private static final String[] DISTANCE_UNITS = {"m", "cm", "mm", "μm", "ft"};
  private static final double[] DISTANCE_UNIT_CONVERSION_FACTORS = {1, 1e-2, 1e-3, 1e-6, 0.3048};

  @Test
  public void randomTests() {
    ThreadLocalRandom random = ThreadLocalRandom.current();
    for (int i = 0; i < 100; i++) {
      double m1 = random.nextDouble(1, 1e5);
      double m2 = random.nextDouble(1, 1e5);
      double r = random.nextDouble(0.3, 1e7);
      double[] arrVal = new double[] {m1, m2, r};
      double f = 6.67e-11 * m1 * m2 / r / r;
      int u1 = random.nextInt(WEIGHT_UNITS.length);
      int u2 = random.nextInt(WEIGHT_UNITS.length);
      int u3 = random.nextInt(DISTANCE_UNITS.length);
      arrVal[0] /= WEIGHT_UNIT_CONVERSION_FACTORS[u1];
      arrVal[1] /= WEIGHT_UNIT_CONVERSION_FACTORS[u2];
      arrVal[2] /= DISTANCE_UNIT_CONVERSION_FACTORS[u3];
      String[] arrUnit = new String[] {WEIGHT_UNITS[u1], WEIGHT_UNITS[u2], DISTANCE_UNITS[u3]};
      test(f, arrVal, arrUnit);
    }
  }

}

The solution in Java

Option 1:

public class Solution {

  public static double solution(double[] arrVal, String[] arrUnit) {

    double newtons = 6.67e-11 * arrVal[0] * arrVal[1] / (arrVal[2] * arrVal[2]);

    for (String el : arrUnit) {
      newtons /= (el=="g") ? 1e3 : (el=="mg") ? 1e6 : (el=="μg") ? 1e9 : (el=="ft") ? 0.3048 * 0.3048 : 1;
      newtons *= (el=="lb") ? 0.453592 : (el=="cm") ? 1e4 : (el=="mm") ? 1e6 : (el=="μm") ? 1e12 : 1;
    }

    return newtons;

  }
}

Option 2:

import java.util.*;
public class Solution {

   public static double solution(double[] arrVal, String[] arrUnit) {
        Map<String, Double>massUnits = new HashMap<>();
        massUnits.put("kg",1d);
        massUnits.put("g",1/1000d);
        massUnits.put("mg",1/1000000d);
        massUnits.put("μg",1/1000000000d);
        massUnits.put("lb",0.453592);
        Map<String, Double>distancenits = new HashMap<>();
        distancenits.put("m",1d);
        distancenits.put("cm",1/100d);
        distancenits.put("mm",1/1000d);
        distancenits.put("μm",1/1000000d);
        distancenits.put("ft",0.3048);
       return 6.67e-11*(arrVal[0]*massUnits.get(arrUnit[0])*arrVal[1]*massUnits.get(arrUnit[1]))/(arrVal[2]*arrVal[2]*distancenits.get(arrUnit[2])*distancenits.get(arrUnit[2]));
    }

}