Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. package cardreader;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.util.Scanner;
  6.  
  7. /** En tabell av användare. */
  8. public class UserTable {
  9. /** Maximalt antal användare systemet kan hantera */
  10. private static final int MAX_USERS = 30000;
  11.  
  12. /** Namn på filen som innehåller användardata */
  13. private static final String FILENAME = "users.txt";
  14.  
  15. /** Användare, sorterade efter kortnummer */
  16. private User[] users;
  17.  
  18. /** Antal användare som lagrats i vektorn ovan */
  19. private int n;
  20.  
  21. /** Skapar en användartabell. Innehållet läses in från en fil. */
  22. public UserTable() {
  23. users = new User[MAX_USERS];
  24. n = 0;
  25.  
  26. // Filinläsning (baserad på Java snabbreferens)
  27. Scanner scan = null;
  28. try {
  29. scan = new Scanner(new File(FILENAME));
  30. } catch (FileNotFoundException e) {
  31. System.out.println("Filen '" + FILENAME + "' kunde inte läsas!");
  32. System.exit(-1);
  33. }
  34.  
  35. System.out.println("Läser in användardata från " + FILENAME + "...");
  36. while (scan.hasNextLine()) {
  37. int nbr = scan.nextInt();
  38. String name = scan.nextLine();
  39. name = name.trim(); // städa bort inledande mellanslag
  40. User book = new User(nbr, name);
  41. add(book);
  42. n++;
  43. }
  44. System.out.println("Klar med inläsning av användardata.");
  45. }
  46.  
  47. /**
  48. * Lägger in en ny användare. Tabellen hålls sorterad efter kortnummer
  49. * (stigande), och användaren läggs in på rätt plats i vektorn. Antalet
  50. * användare ökar med 1.
  51. */
  52. public void add(User u) {
  53. // sätt in användaren på rätt plats i vektorn
  54.  
  55. // 1. hitta rätt plats
  56. int pos = 0;
  57. while (pos < n && users[pos].getCardNbr() < u.getCardNbr()) {
  58. pos++;
  59. }
  60.  
  61. // 2. skapa en lucka i vektorn
  62. for (int i = n; i > pos; i--) {
  63. users[i] = users[i - 1];
  64. }
  65.  
  66. // 3. stoppa in den nya boken i luckan
  67. users[pos] = u;
  68. }
  69.  
  70. /**
  71. * Slår upp det givna kortnumret, och returnerar motsvarande användare. Om
  72. * ingen sådan användare finns returneras null.
  73. *
  74. * Av effektivitetsskäl används binärsökning.
  75. */
  76. public User find(long cardNbr) {
  77. // binärsökning (baserad på Holm, 2007)
  78.  
  79. int low = 0;
  80. int high = n - 1;
  81. int mid = -1;
  82. boolean found = false;
  83. while (low <= high && ! found) {
  84. mid = (low + high) / 2;
  85. if (users[mid].getCardNbr() == cardNbr) {
  86. found = true;
  87. } else if (users[mid].getCardNbr() < cardNbr) {
  88. low = mid + 1;
  89. } else {
  90. high = mid - 1;
  91. }
  92. }
  93.  
  94. return found ? users[mid] : null;
  95. }
  96.  
  97. /**
  98. * Testmetod för binärsökningen:
  99. * går igenom alla användare och kollar att deras kortnummer kan sökas upp.
  100. * Om något kortnummer inte kunde sökas upp returneras detta. Annars, om
  101. * alla sökningar lyckades, returneras 0.
  102. */
  103. public int testFind() {
  104. for (int i = 0; i < n; i++) {
  105. int nbr = users[i].getCardNbr();
  106. User found = find(nbr);
  107. if (found != users[i]) {
  108. return nbr;
  109. }
  110. }
  111. return 0;
  112. }
  113.  
  114. /**
  115. * Slår upp den användare som har det givna namnet.
  116. * Om flera sådana användare finns returneras den första i vektorn.
  117. * Om ingen sådan användare finns returneras null.
  118. *
  119. * Eftersom denna sökning görs sällan räcker det med linjärsökning.
  120. */
  121. public User findByName(String name) {
  122. for (int i = 0; i < n - 1; i++) {
  123. if (users[i].getName().equals(name)) {
  124. return users[i];
  125.  
  126. }
  127. }
  128.  
  129. return null;
  130. }
  131.  
  132. /** Skriver ut hela användartabellen. */
  133. public void print() {
  134. System.out.println("Tabellens innehåll:");
  135. System.out.println("-------------------");
  136. for (int i = 0; i < n; i++) {
  137. System.out.println(users[i].toString());
  138. }
  139. System.out.println("-------------------");
  140. System.out.println("Totalt " + n + " användare i systemet.");
  141. }
  142.  
  143. /** Returnerar antalet användare i tabellen. */
  144. public int getNbrUsers() {
  145. return n;
  146. }
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement