Difference between revisions of "SET08112"

From Progzoo
Jump to: navigation, search
(Problem 5 – Use Map to find associates)
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
==SET08112 ArrayList Interface Tutorial==
+
==SET08112 - Algorithms and Data Structure==
In this tutorial you will use the ArrayList and the HashMap or TreeMap to solve some common problems.
+
*[[ArrayList Tutorial]]
You will use methods such as:
+
*[[Recursion Tutorial]]
* java.util.Collections.sort
+
*[[Finite State Machines Tutorial]] and [[Finite State Machine|FSM from lecture]]
* add
+
*[[Assessment 2011 Tornado]]
* get
+
*[[Recursive Descent Parsers]]
 
+
*[[Tree Tutorial]]
==Problem 1 - Sort a List==
+
<question className="SortStudents" title="Using Sort" copyfile="students.txt">
+
The file  from http://www.dcs.napier.ac.uk/~cs66/SET08112/tut2/students.txt  contains a list of students:
+
ADAMS, ROBERT
+
HASTIE, MARTIN
+
OTHIENO, JUDITH
+
ANDERSON, ROSS
+
...
+
Create a programme SortStudents.java that reads in this file and outputs the students in Alphabetical order.
+
*You can use an ArrayList to hold the students.
+
*ArrayList&lt;String> names = new ArrayList&lt;String>();
+
*You can use [http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29 java.util.Collections.sort] to sort the ArrayList
+
<hint>
+
Add this line after you have filled the ArrayList but before you print it.
+
java.util.Collections.sort(names);
+
</hint>
+
<prog>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("students.txt"));
+
    while (null!=(line=fh.readLine()))
+
      names.add(line);
+
    for (String s:names)
+
      System.out.println(s);
+
  }
+
}
+
</prog>
+
<answer>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
BufferedReader fh
+
= new BufferedReader(new FileReader("students.txt"));
+
    while (null!=(line=fh.readLine()))
+
      names.add(line);
+
    java.util.Collections.sort(names);
+
    for (String s:names)
+
      System.out.println(s);
+
  }
+
}
+
</answer>
+
</question>
+
 
+
==Problem 2 - List Routes==
+
<question className="SortStudents" title="Using Sort" copyfile="year1.txt">
+
The file year1.txt contains a list of all students in year one. Each line contains the name of the student and the name of the route (programme) they follow separated by a tab.
+
Brando, Marlon BSC (HONS) DIGITAL MEDIA F/T
+
Bridges, Jeff BSC (HONS) INTERACTIVE MEDIA DESIGN F/T
+
Brody, Adrien BENG (HONS) COMPUTER SECURITY AND FORENSICS F/T
+
 
+
Write a program to read in this file and output a list of routes with no duplicates.
+
You can use a program very similar to the one above – but this time:
+
*Use <code>line.split("\t")</code> to get the route
+
*Use <code>name.contains(st[1])</code> to add the route '''only''' if it is not already in the ArrayList
+
*You do not need to sort before output
+
 
+
<prog>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("year1.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] st = line.split("\t");
+
      names.add(st[1]);
+
    }
+
    for (String s:names)
+
      System.out.println(s);
+
  }
+
}
+
</prog>
+
<answer>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("year1.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] st = line.split("\t");
+
      if (!names.contains(st[1]))
+
        names.add(st[1]);
+
    }
+
    for (String s:names)
+
      System.out.println(s);
+
  }
+
}
+
</answer>
+
</question>
+
==Problem 3 - Who's missing?==
+
<question className="SortStudents" title="Using Sort" copyfile="students.txt present.txt">
+
The file present.txt contains those students from students.txt who attended a particular tutorial. We want a list of all those students who were not present.
+
Brody, Adrien
+
Irons, Jeremy
+
Spacek, Sissy
+
 
+
How to do this…
+
*Create an array list called present
+
*Open the file present.txt and add every line to the ArrayList present
+
*Open the file student.txt
+
*For each line in the file – if that student is not in present print the name.
+
if (!present.contains(line)) System.out.println(line);
+
<prog>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("present.txt"));
+
    while (null!=(line=fh.readLine())){
+
      names.add(line);
+
    }
+
  }
+
}
+
</prog>
+
<answer>
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class SortStudents{
+
  public static void main(String[]argv) throws Exception{
+
    ArrayList&lt;String> names = new ArrayList&lt;String>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("present.txt"));
+
    while (null!=(line=fh.readLine())){
+
      names.add(line);
+
    }
+
    fh.close();
+
    fh = new BufferedReader(new FileReader("students.txt"));
+
    while (null!=(line=fh.readLine())){
+
      if (!names.contains(line)) System.out.println(line);
+
    }
+
  }
+
}
+
</answer>
+
</question>
+
 
+
==Problem 4 - Count Routes==
+
<question className="CountRoutes" title="Count Routes" copyfile="year1.txt">
+
Use the file year1.txt to print a list of all the routes in alphabetical order. We also want a count of how many students are in each route.
+
BENG (HONS) COMPUTER NETWORKS AND DISTRIBUTED SYSTEMS F/T 10
+
BENG (HONS) COMPUTER SECURITY AND FORENSICS F/T 28
+
BENG (HONS) COMPUTING F/T 22
+
BENG (HONS) EMBEDDED COMPUTER SYSTEMS F/T 1
+
...
+
 
+
How to do this:
+
*See the section “Use Map to aggregate” from the lecture
+
*Use the '''HashMap''' structure to map String to Integer, the String will be the route name, the Integer will be the number of students
+
*'''HashMap''' supports methods '''put''' and '''get'''
+
*You can use two passes to process get the answer.
+
**On the first pass run over the list and put the value 0 against every route you encounter.
+
**On the second pass use put to add 1 to each route you encounter.
+
*It is better to use a single pass:
+
**For each route if the key exists then +1 of the value, if the key does not exist then put 1.
+
<prog>
+
import java.util.HashMap;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class CountRoutes{
+
  public static void main(String[]argv) throws Exception{
+
    HashMap&lt;String,Integer> routes = new HashMap&lt;String,Integer>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("year1.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] s = line.split("\t");
+
      routes.put(s[1],42);
+
    }
+
    for (String r:routes.keySet())
+
      System.out.printf("%s\t%d\n", r,routes.get(r));
+
  }
+
}
+
</prog>
+
<answer>
+
import java.util.HashMap;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class CountRoutes{
+
  public static void main(String[]argv) throws Exception{
+
    HashMap&lt;String,Integer> routes = new HashMap&lt;String,Integer>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("year1.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] s = line.split("\t");
+
      if (!routes.containsKey(s[1]))
+
        routes.put(s[1],0);
+
      routes.put(s[1],1+routes.get(s[1]));
+
    }
+
    for (String r:routes.keySet())
+
      System.out.printf("%s\t%d\n", r,routes.get(r));
+
  }
+
}
+
</answer>
+
</question>
+
 
+
==Problem 5 – Use Map to find associates==
+
<question className="FindRegions" title="Find Associates Regions" copyfile="bbc.txt">
+
Read in the file bbc.txt and output a list of countries by region.
+
One way to do this is to build up a list of countries for each region. To do that you could use a structure such as:
+
TreeMap&lt;String,ArrayList&lt;String>> region
+
    = new TreeMap&lt;String,ArrayList&lt;String>>();
+
<prog>
+
import java.util.TreeMap;
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class FindRegions{
+
  public static void main(String[]argv) throws Exception{
+
    TreeMap&lt;String,ArrayList&lt;String>> region
+
      = new TreeMap&lt;String,ArrayList&lt;String>>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("bbc.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] s = line.split("\t");
+
    }
+
  }
+
}
+
</prog>
+
<answer>
+
import java.util.TreeMap;
+
import java.util.ArrayList;
+
import java.io.BufferedReader;
+
import java.io.FileReader;
+
+
public class FindRegions{
+
  public static void main(String[]argv) throws Exception{
+
    TreeMap&lt;String,ArrayList&lt;String>> region
+
      = new TreeMap&lt;String,ArrayList&lt;String>>();
+
    String line;
+
    BufferedReader fh
+
      = new BufferedReader(new FileReader("bbc.txt"));
+
    while (null!=(line=fh.readLine())){
+
      String [] s = line.split("\t");
+
      if (!region.containsKey(s[1]))
+
        region.put(s[1],new ArrayList&lt;String>());
+
      region.get(s[1]).add(s[0]);
+
    }
+
    for (String r:region.keySet()){
+
      System.out.printf("%s\n", r,region.get(r));
+
      for (String s : region.get(r))
+
        System.out.printf("  %s\n", s);
+
    }
+
  }
+
}
+
</answer>
+
</question>
+

Latest revision as of 09:37, 2 March 2012

SET08112 - Algorithms and Data Structure