$ cat LowGrades.java
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Vector;
class
LowGrades {
private static Map<String, Integer>
in(InputStream ins) {
final Scanner scanner = new Scanner(ins);
scanner.useDelimiter("[|\n]");
final HashMap<String, Integer> lowGrades = new HashMap<String, Integer>();
while (scanner.hasNextInt()) {
scanner.nextInt();
final String course = scanner.next();
int grade = scanner.nextInt();
if (lowGrades.containsKey(course))
grade = Math.min(lowGrades.get(course), grade);
lowGrades.put(course, grade);
}
return lowGrades;
}
public static void
main(String[] args) {
out(System.out, in(System.in));
}
private static void
out(PrintStream outs, Map<String, Integer> lowGrades) {
final Vector<String> keys = new Vector<String>(lowGrades.keySet());
Collections.sort(keys);
for (String key : keys)
outs.printf("%s %d%n", key, lowGrades.get(key));
}
}
$ javac -Xlint LowGrades.java
$ cat LowGradesData
#! /usr/bin/awk -f
{for (i = 1; i <= NF; ++i) {
l = length($i)
lines[lcnt++] = "1|" $i "|" l
n = int(rand()*10) + 1
while (n-- > 0) {
l += int(rand()*10)
lines[lcnt++] = "1|" $i "|" l
}
}
}
END {
while (lcnt > 0) {
l = int(rand()*lcnt)
print lines[l]
lines[l] = lines[--lcnt]
}
}
$ echo facts all come with points of view | ./LowGradesData
1|of|30
1|all|3
1|all|18
1|points|6
1|of|9
1|facts|16
1|with|13
1|all|13
1|all|21
1|view|36
1|come|31
1|facts|7
1|view|4
1|facts|15
1|of|46
1|all|4
1|come|13
1|view|25
1|come|25
1|with|8
1|view|22
1|view|35
1|all|12
1|view|15
1|with|18
1|of|23
1|view|43
1|with|7
1|of|37
1|view|57
1|facts|5
1|view|26
1|points|12
1|view|7
1|with|26
1|come|23
1|view|48
1|of|7
1|points|12
1|come|15
1|all|17
1|of|3
1|with|4
1|with|26
1|of|15
1|come|4
1|of|2
$ echo facts all come with points of view | ./LowGradesData | java LowGrades
all 3
come 4
facts 5
of 2
points 6
view 4
with 4
$