1 import java.io.File;
2 import java.io.FileNotFoundException;
3 import java.io.PrintWriter;
4 import java.util.Scanner;
5
6 /**
7 This program reads data files of country populations and areas and prints the
8 population density for each country.
9 */
10 public class PopulationDensity
11 {
12 public static void main(String[] args) throws FileNotFoundException
13 {
14 // Construct Scanner objects for input files
15
16 Scanner in1 = new Scanner(new File("worldpop.txt"));
17 Scanner in2 = new Scanner(new File("worldarea.txt"));
18
19 // Construct PrintWriter for the output file
20
21 PrintWriter out = new PrintWriter("world_pop_density.txt");
22
23 // Read lines from each file
24
25 while (in1.hasNextLine() && in2.hasNextLine())
26 {
27 String line1 = in1.nextLine();
28 String line2 = in2.nextLine();
29
30 // Extract country and associated value
31 String country = extractCountry(line1);
32 double population = extractValue(line1);
33 double area = extractValue(line2);
34
35 // Compute and print the population density
36 double density = 0;
37 if (area != 0) // Protect against division by zero
38 {
39 density = population / area;
40 }
41 out.printf("%-40s%15.2f\n", country, density);
42 }
43
44 in1.close();
45 in2.close();
46 out.close();
47 }
48
49 /**
50 Extracts the country from an input line.
51 @param line a line containing a country name, followed by a number
52 @return the country name
53 */
54 public static String extractCountry(String line)
55 {
56 int i = 0; // Locate the start of the first digit
57 while (!Character.isDigit(line.charAt(i))) { i++; }
58 return line.substring(0, i).trim(); // Extract the country name
59 }
60
61 /**
62 Extracts the value from an input line.
63 @param line a line containing a country name, followed by a value
64 @return the value associated with the country
65 */
66 public static double extractValue(String line)
67 {
68 int i = 0; // Locate the start of the first digit
69 while (!Character.isDigit(line.charAt(i))) { i++; }
70 // Extract and convert the value
71 return Double.parseDouble(line.substring(i).trim());
72 }
73 }