170 likes | 276 Views
CSci 143 Sets & Maps. Adapted from Marty Stepp, University of Washington http://www.cs.washington.edu/143/. Exercise. Write a program that counts the number of unique words in a large text file (say, Moby Dick or the King James Bible). Store the words in a collection
E N D
CSci 143Sets & Maps Adapted from Marty Stepp, University of Washington http://www.cs.washington.edu/143/
Exercise • Write a program that counts the number of unique words in a large text file (say, Moby Dick or the King James Bible). • Store the words in a collection • Report the number of unique words • Allow the user to search for a word, and report whether or not the word occurred • What collection would you use?
Sets "the" "of" "if" "to" "down" "from" "by" "she" "you" "in" set.contains("to") true "him" "why" set.contains("be") false set • Set - a collection of unique values (no duplicates) • Allowed operations: add, remove, search (contains) • No indexes • Order is unimportant
Set implementation • in Java, sets implement the Set interface in java.util • HashSet and TreeSet classes implement Set • HashSet • implemented using a "hash table" array • very fast • elements are stored in unpredictable order • TreeSet • implemented using a "binary search tree“ • pretty fast • elements are stored in sorted order
Set methods List<String> list = new ArrayList<String>(); ... Set<Integer> set = new HashSet<Integer>(); Set<String> set2 = new HashSet<String>(list); • can construct an empty set, or one based on another collection
Set operations addAll retainAll removeAll
Sets and ordering • Sets do not use indexes; you cannot get element i • HashSet : elements are stored in an unpredictable order Set<String> names = new HashSet<String>(); names.add("Jake"); names.add("Robert"); names.add("Marisa"); names.add("Kasey"); System.out.println(names); // [Kasey, Robert, Jake, Marisa] • TreeSet : elements are stored in sorted order Set<String> names = new TreeSet<String>(); ... // [Jake, Kasey, Marisa, Robert]
The "for each" loop for (typename : collection) { statements; } • Provides a clean syntax for looping over the elements of a Set, List, array, or other collection Set<Double> grades = new HashSet<Double>(); ... for (double grade : grades) { System.out.println(“Grade is: " + grade); }
Exercise • Write a program that counts the number of unique words in a large text file (say, Moby Dick or the King James Bible). • Store the words in a collection • Report the number of unique words • Allow the user to search for a word, and report whether or not the word occurred • What collection would you use?
Maps • map: Holds a set of unique keys and a collection of values, where each key is associated with one value. • a.k.a. "dictionary", "associative array", "hash" • basic map operations: • put(key, value ): Adds a mapping from a key toa value. • get(key): Retrieves thevalue mapped to the key • remove(key): Removesthe given key and itsmapped value map.get("Juliet") returns "Capulet"
Maps and tallying 14 "M" "O" 3 "I" 16 keys values • a map can be thought of as generalization of an array • the "index" (key) can be any data type // (M)cCain, (O)bama, (I)ndependent • count votes: "MOOOOOOMMMMMOOOOOOMOMMIMOMMIMOMMIO"
Map implementation • maps implement the Map interface in java.util • HashMap and TreeMap classes implement Map • HashMap • implemented using a "hash table" array • very fast • keys are stored in unpredictable order • TreeMap • implemented using a "binary search tree“ • pretty fast • keys are stored in sorted order • a map requires 2 type parameters • one for keys, one for values Map<String, Integer> ages = new HashMap<String, Integer>();
Example Map<String, Integer> ages = new HashMap<String, Integer>(); ages.put("Marty", 19); ages.put("Geneva", 2); ages.put("Vicki", 57); System.out.println(ages); {Vicki=57, Marty=19, Geneva=2} Press any key to continue . . .
keySet • keySet method returns a set of all keys in the map • can loop over the keys in a foreach loop • can get each key's associated value using get Map<String, Integer> ages = new HashMap<String, Integer>(); ages.put("Marty", 19); ages.put("Geneva", 2); ages.put("Vicki", 57); for (String name : ages.keySet()) { System.out.println(name + " -> " + ages.get(name)); }
Exercise • Write a program to count the number of occurrences of each word in a file. • Print every word that appears in the file at least 1000 times, in alphabetical order. • Allow the user to type a word and report how many times that word appears in the file. • What collection is appropriate for this problem?
Maps vs. Sets • A set is like a map from elements to boolean values. • We are remembering one related piece of information about every element: Is “Sam" in the set? (true/false) • A map allows the related piece of information to be something other than a boolean: What is “Sam" 's phone number? Set “Sam" true false Map “Sam" "206-685-2181"