/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.Collectors;
import java.util.function.Function;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		final Collection<Record> records = new ArrayList<>();
		records.add(new Record("11111", "Orlando"));
		records.add(new Record("11111", "Orlando"));
		records.add(new Record("11111", "Orlando"));
		records.add(new Record("11111", "Los Angeles"));
		records.add(new Record("11111", "Los Angeles"));
		records.add(new Record("11111", "San Francisco"));
		
		records.add(new Record("22222", "Cincinatti"));
		records.add(new Record("22222", "Cleveland"));
		records.add(new Record("22222", "Cleveland"));
		records.add(new Record("22222", "Columbus"));
		records.add(new Record("22222", "Columbus"));
		records.add(new Record("22222", "Columbus"));
		
		final Map<String, List<Record>> recordsByZip = records.stream()
		    .collect(Collectors.groupingBy(Record::getZip));
		
		recordsByZip.forEach((zip, entries) -> {
			final Map<String, Long> frequencyMap = entries.stream()
				.map(Record::getCity)
				.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
			
			System.out.println("Frequency map for zip " + zip);
			frequencyMap.forEach((city, frequency) -> System.out.println(city + ": " + frequency));
			System.out.println();
		});
	}
}

class Record {
	private String zip;
	private String city;
	
	public Record(String zip, String city) {
		this.zip = zip;
		this.city = city;
	}
	
	public String getZip() {
		return zip;
	}
	public void setZip(String zip) {
		this.zip = zip;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
}