Add files for Exercise 10
This commit is contained in:
parent
e432360dc9
commit
9af35e8cb9
107
app/src/main/java/ch/nuth/zhaw/exbox/FuzzySearchServer.java
Normal file
107
app/src/main/java/ch/nuth/zhaw/exbox/FuzzySearchServer.java
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class FuzzySearchServer implements CommandExecutor {
|
||||||
|
public static List<String> names = new ArrayList<>(); // List of all names
|
||||||
|
public static Map<String, List<Integer>> trigrams = new HashMap<>(); // List of all Trigrams
|
||||||
|
public static Map<Integer, Integer> counts = new HashMap<>(); // Key: index of
|
||||||
|
|
||||||
|
// load all names into names List
|
||||||
|
// each name only once (i.e. no doublettes allowed
|
||||||
|
public static void loadNames(String nameString) {
|
||||||
|
// TODO implement
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a single trigram to 'trigrams' index
|
||||||
|
public static void addToTrigrams(int nameIdx, String trig) {
|
||||||
|
// TODO implement
|
||||||
|
}
|
||||||
|
|
||||||
|
// works better for flipped and short names if " " added and lowercase
|
||||||
|
private static String nomalize(String name) {
|
||||||
|
return " " + name.toLowerCase().trim() + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
// construct a list of trigrams for a name
|
||||||
|
public static List<String> trigramForName(String name) {
|
||||||
|
name = nomalize(name);
|
||||||
|
// TODO implement
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void constructTrigramIndex(List<String> names) {
|
||||||
|
for (int nameIdx = 0; nameIdx < names.size(); nameIdx++) {
|
||||||
|
List<String> trigs = trigramForName(names.get(nameIdx));
|
||||||
|
for (String trig : trigs) {
|
||||||
|
addToTrigrams(nameIdx, trig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void incCount(int cntIdx) {
|
||||||
|
Integer c = counts.get(cntIdx);
|
||||||
|
c = (c == null) ? 1 : c + 1;
|
||||||
|
counts.put(cntIdx, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// find name index with most corresponding trigrams
|
||||||
|
// if no trigram/name matches at all then return -1
|
||||||
|
public static int findIdx(String name) {
|
||||||
|
counts.clear();
|
||||||
|
int maxIdx = -1;
|
||||||
|
// TODO implement
|
||||||
|
return maxIdx;
|
||||||
|
}
|
||||||
|
// finde Namen gebe "" zurück wenn gefundener Name nicht grösser als verlangter score ist.
|
||||||
|
public static String find(String searchName, int scoreRequired) {
|
||||||
|
int found = findIdx(searchName);
|
||||||
|
String foundName = "";
|
||||||
|
if (found >= 0 && score(found) >= scoreRequired) {
|
||||||
|
foundName = names.get(found);
|
||||||
|
}
|
||||||
|
return foundName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int score(int found) {
|
||||||
|
String foundName = names.get(found);
|
||||||
|
return (int) (100.0 * Math.min(counts.get(found), foundName.length()) / foundName.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String execute(String searchName) {
|
||||||
|
int found = findIdx(searchName);
|
||||||
|
if (found >= 0) {
|
||||||
|
int score = score(found);
|
||||||
|
String foundName = names.get(found);
|
||||||
|
return searchName + " -> " + foundName + " " + score + "%\n";
|
||||||
|
} else {
|
||||||
|
return "nothing found\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
FuzzySearchServer fs = new FuzzySearchServer();
|
||||||
|
System.out.println(fs.execute("Kiptum Daniel"));
|
||||||
|
System.out.println(fs.execute("Daniel Kiptum"));
|
||||||
|
System.out.println(fs.execute("Kip Dan"));
|
||||||
|
System.out.println(fs.execute("Dan Kip"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
String rangliste = "Mueller Stefan;02:31:14\n" +
|
||||||
|
"Marti Adrian;02:30:09\n" +
|
||||||
|
"Kiptum Daniel;02:11:31\n" +
|
||||||
|
"Ancay Tarcis;02:20:02\n" +
|
||||||
|
"Kreibuhl Christian;02:21:47\n" +
|
||||||
|
"Ott Michael;02:33:48\n" +
|
||||||
|
"Menzi Christoph;02:27:26\n" +
|
||||||
|
"Oliver Ruben;02:32:12\n" +
|
||||||
|
"Elmer Beat;02:33:53\n" +
|
||||||
|
"Kuehni Martin;02:33:36\n";
|
||||||
|
loadNames(rangliste);
|
||||||
|
constructTrigramIndex(names);
|
||||||
|
}
|
||||||
|
}
|
68
app/src/test/java/ch/nuth/zhaw/exbox/ADS10_3_test.java
Normal file
68
app/src/test/java/ch/nuth/zhaw/exbox/ADS10_3_test.java
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
package ch.nuth.zhaw.exbox;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author K Rege
|
||||||
|
* @version 1.00 2018/3/17
|
||||||
|
* @version 1.01 2021/8/1
|
||||||
|
*/
|
||||||
|
public class ADS10_3_test {
|
||||||
|
@BeforeEach
|
||||||
|
void init() {
|
||||||
|
FuzzySearchServer.names.clear();
|
||||||
|
FuzzySearchServer.trigrams.clear();
|
||||||
|
String rangliste = "Mueller Stefan;02:31:14\n" +
|
||||||
|
"Marti Adrian;02:30:09\n" +
|
||||||
|
"Kiptum Daniel;02:11:31\n" +
|
||||||
|
"Ancay Tarcis;02:20:02\n" +
|
||||||
|
"Kreibuhl Christian;02:21:47\n" +
|
||||||
|
"Ott Michael;02:33:48\n" +
|
||||||
|
"Menzi Christoph;02:27:26\n" +
|
||||||
|
"Oliver Ruben;02:32:12\n" +
|
||||||
|
"Elmer Beat;02:33:53\n" +
|
||||||
|
"Kuehni Martin;02:33:36\n";
|
||||||
|
FuzzySearchServer.loadNames(rangliste);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLoadNames() {
|
||||||
|
assertEquals(10, FuzzySearchServer.names.size(), "Länge von 'names' Liste");
|
||||||
|
assertEquals("Mueller Stefan", FuzzySearchServer.names.get(0), "Erster Name");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTrigramForName() {
|
||||||
|
List<String> trigList = FuzzySearchServer.trigramForName("Heinz");
|
||||||
|
assertEquals(5, trigList.size(), "Länge von Trigram Liste");
|
||||||
|
String[] good = {" he", "hei", "ein", "inz", "nz "};
|
||||||
|
for (int i = 0; i < good.length; i++) {
|
||||||
|
assertEquals(good[i], trigList.get(i), "trigram [" + i + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddToTrigrams() {
|
||||||
|
FuzzySearchServer.addToTrigrams(0, "mue");
|
||||||
|
FuzzySearchServer.addToTrigrams(0, "uel");
|
||||||
|
FuzzySearchServer.addToTrigrams(1, "mar");
|
||||||
|
assertEquals(3, FuzzySearchServer.trigrams.size(), "Länge von 'trigram'");
|
||||||
|
assertEquals(0, FuzzySearchServer.trigrams.get("mue").get(0), "mue");
|
||||||
|
assertEquals(0, FuzzySearchServer.trigrams.get("uel").get(0), "uel");
|
||||||
|
assertEquals(1, FuzzySearchServer.trigrams.get("mar").get(0), "mar");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFind() {
|
||||||
|
FuzzySearchServer.constructTrigramIndex(FuzzySearchServer.names);
|
||||||
|
assertEquals("Kiptum Daniel", FuzzySearchServer.find("Kiptum Daniel", 80));
|
||||||
|
assertEquals("Kiptum Daniel", FuzzySearchServer.find("Daniel Kiptum", 80));
|
||||||
|
assertEquals("Kiptum Daniel", FuzzySearchServer.find("Kip Dan", 30));
|
||||||
|
assertEquals("Kiptum Daniel", FuzzySearchServer.find("Dan Kip", 30));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue