Advertisement
Guest User

Untitled

a guest
May 27th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.FileReader;
  4. import java.io.BufferedWriter;
  5. import java.io.FileWriter;
  6. import java.util.ArrayList;
  7. import java.util.Collections;
  8. import java.util.Comparator;
  9.  
  10. public class Hash {
  11.  
  12. // Funktion zum Einlesen eines Files
  13. public static ArrayList<String> read(String fileName) {
  14.  
  15. ArrayList<String> data = new ArrayList<>();
  16.  
  17. try {
  18. BufferedReader reader = new BufferedReader(new FileReader(fileName));
  19.  
  20. String line = "";
  21.  
  22. while (line != null) {
  23.  
  24. line = reader.readLine();
  25.  
  26. if (line != null) {
  27. data.add(line);
  28. }
  29.  
  30. }
  31. reader.close();
  32.  
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }
  36.  
  37. return data;
  38. }
  39.  
  40. // Funktion zum Schreiben von Personendaten in einen File
  41. // k spezifiziert bis zum wievielten Element die Daten in das File geschrieben
  42. // werden
  43. public static void write(String fileName, ArrayList<?> data) {
  44.  
  45. try {
  46. BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
  47.  
  48. for (int i = 0; i < data.size(); i++) {
  49. if (data.get(i) == null) {
  50. writer.write("\n");
  51. } else {
  52. writer.write(data.get(i).toString() + "\n");
  53. }
  54. }
  55.  
  56. writer.close();
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. }
  61.  
  62. // Klasse Person
  63. private static class Person {
  64.  
  65. private String name;
  66. private String state;
  67. private char gender;
  68. private int age;
  69. private int ID;
  70.  
  71. // Constructor
  72. public Person(String name, String state, char gender, int age, int ID) {
  73. this.name = name;
  74. this.state = state;
  75. this.gender = gender;
  76. this.age = age;
  77. this.ID = ID;
  78. }
  79.  
  80. public Person(int ID) {
  81. this.ID = ID;
  82. }
  83.  
  84. public Person() {
  85. ID = -1;
  86. }
  87.  
  88. public String getName() {
  89. return name;
  90. }
  91.  
  92. public char getGender() {
  93. return gender;
  94. }
  95.  
  96. public String getState() {
  97. return state;
  98. }
  99.  
  100. public int getAge() {
  101. return age;
  102. }
  103.  
  104. public int getID() {
  105. return ID;
  106. }
  107.  
  108. public boolean equals(Person other) {
  109. if (!name.equals(other.getName()))
  110. return false;
  111.  
  112. if (!state.equals(other.getState()))
  113. return false;
  114.  
  115. if (gender != other.getGender())
  116. return false;
  117.  
  118. if (age != other.getAge())
  119. return false;
  120.  
  121. if (ID != other.getID())
  122. return false;
  123.  
  124. return true;
  125. }
  126.  
  127. public String toString() {
  128. String record = name + " " + state + " " + gender + " " + age + " " + ID;
  129.  
  130. if (name == null && state == null && gender == '\u0000' && age == 0)
  131. record = "" + ID;
  132.  
  133. if (ID == -1)
  134. record = "-1";
  135. return record;
  136. }
  137.  
  138. }
  139.  
  140. private static class HashTable {
  141.  
  142. private ArrayList<Person> hashTable;
  143. private ArrayList<Person> extraTable;
  144. private int c;
  145. private int m;
  146.  
  147. public HashTable(int m, int c) {
  148. hashTable = new ArrayList<Person>();
  149. extraTable = new ArrayList<Person>();
  150.  
  151. this.m = m;
  152. this.c = c;
  153.  
  154. for (int i = 0; i < m; i++) {
  155. hashTable.add(null);
  156. }
  157. }
  158.  
  159. private int getHash(int ID) {
  160. int m = hashTable.size();
  161. int hash = ID % m;
  162. return hash;
  163. }
  164.  
  165. public void insert(Person p) {
  166. int ID = p.getID();
  167. int hash = getHash(ID);
  168. int jumps = 0;
  169.  
  170. while (jumps <= (c * m)) {
  171. if (hashTable.get((hash + jumps) % m) == null) {
  172. hashTable.set((hash + jumps) % m, p);
  173. return;
  174. }
  175. jumps = jumps + c;
  176. }
  177. extraTable.add(p);
  178. }
  179.  
  180. public void delete(Person p) {
  181. int ID = p.getID();
  182. int hash = getHash(ID);
  183.  
  184. for (int i = 0; i < hashTable.size(); i++) {
  185. if (hashTable.get(i) != null) {
  186. if (hashTable.get(i).equals(p)) {
  187. hashTable.set(i, null);
  188. return;
  189. }
  190. }
  191. }
  192.  
  193. for (int i = 0; i < extraTable.size(); i++) {
  194. if (extraTable.get(i).equals(p)) {
  195. extraTable.remove(i);
  196. return;
  197. }
  198. }
  199. }
  200.  
  201. public Person find(int ID) {
  202. int hash = getHash(ID);
  203. int jumps = 0;
  204.  
  205. while (jumps <= (c * m)) {
  206. if (hashTable.get((hash + jumps) % m) != null) {
  207. if (hashTable.get((hash + jumps) % m).getID() == ID) {
  208. return hashTable.get((hash + jumps) % m);
  209. }
  210. }
  211. jumps = jumps + c;
  212. }
  213.  
  214. for (int i = 0; i < extraTable.size(); i++) {
  215. if (extraTable.get(i).getID() == ID)
  216. return extraTable.get(i);
  217. }
  218.  
  219. return new Person();
  220. }
  221.  
  222. public ArrayList<Person> writeTables() {
  223. ArrayList<Person> tmp = new ArrayList<>();
  224. for (int i = 0; i < hashTable.size(); i++) {
  225. tmp.add(hashTable.get(i));
  226. }
  227.  
  228. tmp.add(new Person(extraTable.size()));
  229.  
  230. return tmp;
  231. }
  232. }
  233.  
  234. public static void main(String args[]) {
  235.  
  236. System.out.println("\nHASH ME IF YOU CAN\n");
  237.  
  238. if (args.length < 5)
  239. return;
  240.  
  241. // Parameter für Lineares Sondieren
  242. int c = Integer.parseInt(args[0]);
  243.  
  244. // Größe der Hashtabelle
  245. int m = Integer.parseInt(args[1]);
  246.  
  247. System.out.println("c = " + c + " m = " + m);
  248. // Eingabedatei1
  249. String fileName1 = args[2];
  250.  
  251. // Datenstruktur zum Verwalten der eingelesenen Elemente
  252. ArrayList<String> data = read(fileName1);
  253.  
  254. // Personendaten
  255. ArrayList<Person> persons = new ArrayList<>();
  256.  
  257. // Konvertierung der eingelesenen Zeichenketten in Personenobjekte
  258. for (int i = 0; i < data.size(); i++) {
  259.  
  260. String[] vpr = null;
  261. vpr = data.get(i).split("\\s+");
  262.  
  263. String name, state;
  264. char gender;
  265. int age, ID;
  266.  
  267. name = vpr[0];
  268. state = vpr[1];
  269. gender = vpr[2].charAt(0);
  270. age = Integer.parseInt(vpr[3]);
  271. ID = Integer.parseInt(vpr[4]);
  272.  
  273. Person person = new Person(name, state, gender, age, ID);
  274. persons.add(person);
  275. }
  276.  
  277. // Hashing
  278. HashTable ht = new HashTable(m, c);
  279.  
  280. for (int i = 0; i < persons.size(); i++) {
  281. System.out.println("Insert no. " + i);
  282. ht.insert(persons.get(i));
  283. }
  284.  
  285. write(args[4], ht.writeTables());
  286.  
  287. // Delete
  288. for (int i = 1; i < persons.size(); i += 2) {
  289. System.out.println("Delete Person: " + persons.get(i).toString());
  290. ht.delete(persons.get(i));
  291. }
  292.  
  293. // ID Liste
  294. String fileName2 = args[3];
  295. ArrayList<String> IDdata = read(fileName2);
  296. ArrayList<Integer> IDs = new ArrayList<>();
  297.  
  298. for (int i = 0; i < IDdata.size(); i++) {
  299. String sID = IDdata.get(i);
  300. int ID = Integer.parseInt(sID);
  301. IDs.add(ID);
  302. }
  303.  
  304. // Search in HashTable
  305. ArrayList<Person> found = new ArrayList<>();
  306. for (int i = 0; i < IDs.size(); i++) {
  307. Person p = ht.find(IDs.get(i));
  308. System.out.println("Found Person: " + p.toString());
  309. found.add(p);
  310. }
  311.  
  312. write(args[5], found);
  313.  
  314. }
  315.  
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement