FindFood.java


Below is the syntax highlighted version of FindFood.java.


/*******************************************************************************
  * Donna Gabai, dgabai, P01A
  * 
  * Compile: javac FindFood.java
  * Execute: java FindFood myLat myLon minRating < restaurantFile
  * Dependencies: StdIn, StdOut
  * 
  * Given latitude, longitude and minimum restaurant rating
  * (and an input file of local restaurants)
  * Print out a list of acceptable nearby restaurants, starting with the closest
  * 
  */

public class FindFood {
    // great circle distance between (x1, y1) and (x2, y2)
    public static double dist(double x1, double y1, double x2, double y2) {
        // convert to radians
        double xr1 = Math.toRadians(x1);
        double xr2 = Math.toRadians(x2);
        double yr1 = Math.toRadians(y1);
        double yr2 = Math.toRadians(y2);
        
        // use formula given
        double arc = Math.acos(Math.sin(xr1) * Math.sin(xr2)
                        + Math.cos(xr1) * Math.cos(xr2) * Math.cos(yr1 - yr2));
        double dist = 1.1516 * 60 * Math.toDegrees(arc);
        return dist;
}
    
    // find closest restaurant 
    public static int findNext(double x, double y, double[] lat, double[] lon) {
        int N = lat.length;
        double minDist = Double.POSITIVE_INFINITY;
        int closest = 0;
        for (int i = 0; i < N; i++) {
            double d = dist(x, y, lat[i], lon[i]);
            if (minDist > d) {
                minDist = d;
                closest = i;
            }
        }
        return closest;
    }
    
    // take restaurant out of consideration for findNext
    public static void markFound(int f, double[] lat, double[] lon) {
        lat[f] = Double.POSITIVE_INFINITY;
        lon[f] = Double.POSITIVE_INFINITY;
    }
    
     public static void main(String[] args) {
        // my location and acceptable rating
        double x = Double.parseDouble(args[0]);
        double y = Double.parseDouble(args[1]);
        int rating = Integer.parseInt(args[2]);
        
        // set up arrays
        int N = StdIn.readInt();
        String[] names = new String[N];
        double[] lat   = new double[N];
        double[] lon   = new double[N];
        int[] ratings  = new int[N];
        
        // read in restaurant data
        for (int i = 0; i < N; i++) {
            names[i] = StdIn.readString();
            lat[i]   = StdIn.readDouble();
            lon[i]   = StdIn.readDouble();
            ratings[i] = StdIn.readInt();
        }
        
        // list acceptable restaurants, closest to farthest
        for (int i = 0; i < N; i++) {
            int next = findNext(x, y, lat, lon);
            if (ratings[next] >= rating) {
                StdOut.println(names[next] + " has a rating of "
                                   + ratings[next]);
                double dist = dist(x, y, lat[next], lon[next]);
                StdOut.printf("Distance: %.6f miles\n\n", dist);
            }
            // remove from consideration
            markFound(next, lat, lon);
        }       
    }
}