Add files for exercise 09
This commit is contained in:
parent
785b359d37
commit
29bd296ceb
7 changed files with 3670 additions and 0 deletions
3166
HashRangZuerich.csv
Normal file
3166
HashRangZuerich.csv
Normal file
File diff suppressed because it is too large
Load diff
45
app/src/main/java/ch/nuth/zhaw/exbox/HashServer.java
Normal file
45
app/src/main/java/ch/nuth/zhaw/exbox/HashServer.java
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class HashServer implements CommandExecutor {
|
||||||
|
private final static int STARTNR = 0;
|
||||||
|
private final static int NAME = 1;
|
||||||
|
private final static int TIME = 2;
|
||||||
|
|
||||||
|
private final Map<MyCompetitor, MyCompetitor> data = new MyHashtable<>(4000);
|
||||||
|
|
||||||
|
private long parseTime(String s) throws Exception {
|
||||||
|
DateFormat sdf = new SimpleDateFormat("HH:mm:ss.S");
|
||||||
|
Date date = sdf.parse(s);
|
||||||
|
return date.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void load(Map<MyCompetitor, MyCompetitor> data, String list) {
|
||||||
|
String[] lines = list.split("\n");
|
||||||
|
for (String line : lines) {
|
||||||
|
String[] items = line.split(";");
|
||||||
|
MyCompetitor c = new MyCompetitor(Integer.parseInt(items[STARTNR]), // startNr
|
||||||
|
items[NAME], // name
|
||||||
|
items[TIME]); // time
|
||||||
|
data.put(c, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String execute(String arg) {
|
||||||
|
if (arg.toUpperCase().startsWith("GET")) {
|
||||||
|
String[] items = arg.substring(3).trim().split(";");
|
||||||
|
MyCompetitor key = new MyCompetitor(Integer.parseInt(items[1]), items[0], "00:00:00.0");
|
||||||
|
MyCompetitor o = data.get(key);
|
||||||
|
if (o != null) {
|
||||||
|
return items[0] + " " + items[1] + " -> " + o + "\n";
|
||||||
|
}
|
||||||
|
return "not found\n";
|
||||||
|
}
|
||||||
|
load(data, arg);
|
||||||
|
return "" + data.size() + " loaded\n";
|
||||||
|
}
|
||||||
|
}
|
65
app/src/main/java/ch/nuth/zhaw/exbox/MyCompetitor.java
Normal file
65
app/src/main/java/ch/nuth/zhaw/exbox/MyCompetitor.java
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class MyCompetitor implements Comparable<MyCompetitor> {
|
||||||
|
private final String name;
|
||||||
|
private final String time;
|
||||||
|
private int rank;
|
||||||
|
|
||||||
|
public MyCompetitor(int rank, String name, String time) {
|
||||||
|
this.rank = rank;
|
||||||
|
this.name = name;
|
||||||
|
this.time = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRank(int rank) {
|
||||||
|
this.rank = rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTime() {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long parseTime(String s) {
|
||||||
|
try {
|
||||||
|
DateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
Date date = sdf.parse(s);
|
||||||
|
return date.getTime();
|
||||||
|
} catch (Exception e) {System.err.println(e);}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String timeToString(int time) {
|
||||||
|
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
return df.format(new Date(time));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return ""+ rank + " "+name+" "+time;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(MyCompetitor o) {
|
||||||
|
// to be done
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
// to be done
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals (Object o) {
|
||||||
|
// to be done
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
96
app/src/main/java/ch/nuth/zhaw/exbox/MyHashtable.java
Normal file
96
app/src/main/java/ch/nuth/zhaw/exbox/MyHashtable.java
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public class MyHashtable<K, V> implements Map<K, V> {
|
||||||
|
private K[] keys = (K[]) new Object[10];
|
||||||
|
private V[] values = (V[]) new Object[10];
|
||||||
|
|
||||||
|
private int hash(Object k) {
|
||||||
|
int h = Math.abs(k.hashCode());
|
||||||
|
return h % keys.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MyHashtable(int size) {
|
||||||
|
// to be done
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes all mappings from this map (optional operation).
|
||||||
|
public void clear() {
|
||||||
|
// to be done
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Associates the specified value with the specified key in this map (optional operation).
|
||||||
|
public V put(K key, V value) {
|
||||||
|
// to be done
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the value to which this map maps the specified key.
|
||||||
|
public V get(Object key) {
|
||||||
|
// to be done
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes the mapping for this key from this map if present (optional operation).
|
||||||
|
public V remove(Object key) {
|
||||||
|
// to be done (Aufgabe 3)
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the number of key-value mappings in this map.
|
||||||
|
public int size() {
|
||||||
|
// to be done
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnsupportedOperationException ===================================================================
|
||||||
|
// Returns a collection view of the values contained in this map.
|
||||||
|
public Collection<V> values() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if this map contains a mapping for the specified key.
|
||||||
|
public boolean containsKey(Object key) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if this map maps one or more keys to the specified value.
|
||||||
|
public boolean containsValue(Object value) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a set view of the mappings contained in this map.
|
||||||
|
public Set<Map.Entry<K, V>> entrySet() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compares the specified object with this map for equality.
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copies all of the mappings from the specified map to this map (optional operation).
|
||||||
|
public void putAll(Map<? extends K, ? extends V> t) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the hash code value for this map.
|
||||||
|
public int hashCode() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if this map contains no key-value mappings.
|
||||||
|
public boolean isEmpty() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a set view of the keys contained in this map.
|
||||||
|
public Set<K> keySet() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
35
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_2_test.java
Normal file
35
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_2_test.java
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author K Rege
|
||||||
|
* @version 1.00 2018/3/17
|
||||||
|
* @version 1.01 2021/8/1
|
||||||
|
*/
|
||||||
|
public class ADS9_2_test {
|
||||||
|
MyCompetitor c1 = new MyCompetitor(1, "Kiptum Daniel", "02:11:31");
|
||||||
|
MyCompetitor c2 = new MyCompetitor(1, "Kiptum Daniel", "02:11:31");
|
||||||
|
MyCompetitor c3 = new MyCompetitor(2, "Ancay Tarcis", "02:20:02");
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEquals() {
|
||||||
|
assertEquals(c1, c2);
|
||||||
|
assertNotEquals(c1, c3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCompareTo() {
|
||||||
|
assertEquals(0, c1.compareTo(c2));
|
||||||
|
assertNotEquals(0, c1.compareTo(c3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHashcode() {
|
||||||
|
assertEquals(c1.hashCode(), c2.hashCode());
|
||||||
|
assertNotEquals(c1.hashCode(), c3.hashCode());
|
||||||
|
}
|
||||||
|
}
|
144
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_3_test.java
Normal file
144
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_3_test.java
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class Town {
|
||||||
|
int hashCode;
|
||||||
|
String name;
|
||||||
|
String nb;
|
||||||
|
Town (int hashCode, String name, String nb) {
|
||||||
|
this.name = name; this.hashCode = hashCode; this.nb = nb;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (!(o instanceof Town)) return false;
|
||||||
|
return ((Town)o).name.equals(this.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return hashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name + " " + hashCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ADS9_3_test {
|
||||||
|
Map<Town, Town> hashmap;
|
||||||
|
List<Town> towns;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() {
|
||||||
|
towns = List.of(
|
||||||
|
new Town(5, "Bari", "BA"),
|
||||||
|
new Town(8, "Bologna", "BO"),
|
||||||
|
new Town(3, "Catania", "CA"),
|
||||||
|
new Town(9, "Firenze", "FI"),
|
||||||
|
new Town(0, "Genova", "GV"),
|
||||||
|
new Town(12, "Milano", "MI"),
|
||||||
|
new Town(7, "Napoli", "NA"),
|
||||||
|
new Town(7, "Palermo", "PA"),
|
||||||
|
new Town(7, "Roma", "RM"),
|
||||||
|
new Town(5, "Torino", "TO")
|
||||||
|
);
|
||||||
|
|
||||||
|
hashmap = new MyHashtable<>(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
Town t1 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd2() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
Town t1 = towns.get(1);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t1, t1);
|
||||||
|
Town t2 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t2);
|
||||||
|
t2 = hashmap.get(t1);
|
||||||
|
assertEquals(t1, t2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd3() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.remove(t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
Town t1 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd4() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSize() {
|
||||||
|
hashmap.clear();
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
testAdd2();
|
||||||
|
assertEquals(2, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemove() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
Town t1 = towns.get(1);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.remove(t0);
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.remove(t1);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
hashmap.remove(t0);
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMixed() {
|
||||||
|
hashmap.clear();
|
||||||
|
Map<Town, Town> hashmap2 = new HashMap<>();
|
||||||
|
for (int i = 0; i < 10000; i++) {
|
||||||
|
Town c = towns.get((int)(Math.random() * towns.size()));
|
||||||
|
int op = (int)(Math.random() * 2);
|
||||||
|
switch (op) {
|
||||||
|
case 0: hashmap.put(c, c); hashmap2.put(c, c); break;
|
||||||
|
case 1: hashmap.remove(c); hashmap2.remove(c); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertEquals(hashmap2.size(), hashmap.size());
|
||||||
|
for (Town t : towns) {
|
||||||
|
Town c1 = hashmap.get(t);
|
||||||
|
Town c2 = hashmap2.get(t);
|
||||||
|
assertEquals(c1, c2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
119
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_4_test.java
Normal file
119
app/src/test/java/ch/nuth/zhaw/exbox/ADS9_4_test.java
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class ADS9_4_test {
|
||||||
|
Map<Town, Town> hashmap;
|
||||||
|
List<Town> towns;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() {
|
||||||
|
towns = List.of(
|
||||||
|
new Town(5, "Bari", "BA"),
|
||||||
|
new Town(8, "Bologna", "BO"),
|
||||||
|
new Town(3, "Catania", "CA"),
|
||||||
|
new Town(9, "Firenze", "FI"),
|
||||||
|
new Town(0, "Genova", "GV"),
|
||||||
|
new Town(12, "Milano", "MI"),
|
||||||
|
new Town(7, "Napoli", "NA"),
|
||||||
|
new Town(7, "Palermo", "PA"),
|
||||||
|
new Town(7, "Roma", "RM"),
|
||||||
|
new Town(5, "Torino", "TO")
|
||||||
|
);
|
||||||
|
|
||||||
|
hashmap = new MyHashtable<>(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
Town t1 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd2() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
Town t1 = towns.get(1);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t1, t1);
|
||||||
|
Town t2 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t2);
|
||||||
|
t2 = hashmap.get(t1);
|
||||||
|
assertEquals(t1, t2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd3() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.remove(t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
Town t1 = hashmap.get(t0);
|
||||||
|
assertEquals(t0, t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAdd4() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSize() {
|
||||||
|
hashmap.clear();
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
testAdd2();
|
||||||
|
assertEquals(2, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemove() {
|
||||||
|
hashmap.clear();
|
||||||
|
Town t0 = towns.get(0);
|
||||||
|
Town t1 = towns.get(1);
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.remove(t0);
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
hashmap.put(t0, t0);
|
||||||
|
hashmap.remove(t1);
|
||||||
|
assertEquals(1, hashmap.size());
|
||||||
|
hashmap.remove(t0);
|
||||||
|
assertEquals(0, hashmap.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMixed() {
|
||||||
|
hashmap.clear();
|
||||||
|
Map<Town, Town> hashmap2 = new HashMap<>();
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
Town c = towns.get((int)(Math.random() * towns.size()));
|
||||||
|
int op = (int)(Math.random() * 2);
|
||||||
|
switch (op) {
|
||||||
|
case 0: hashmap.put(c, c); hashmap2.put(c, c); break;
|
||||||
|
case 1: hashmap.remove(c); hashmap2.remove(c); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertEquals(hashmap2.size(), hashmap.size());
|
||||||
|
for (Town t : towns) {
|
||||||
|
Town c1 = hashmap.get(t);
|
||||||
|
Town c2 = hashmap2.get(t);
|
||||||
|
assertEquals(c1, c2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue