Java fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
8.0 KiB

  1. # Yhteystiedot ja osoitekirja 2/3 - Olioiden vertaileminen
  2. Kuten merkkijonoja käsiteltäessä olemme huomanneet, merkkijonojen vertailu `==`-vertailuoperaattorilla vertailee olioviittauksia eikä merkkijonojen sisältöä. Samalla tavoin käy vertailtaessa Contact-olioita. Merkkijonoille on toteutettu oma `equals`-metodinsa, jonka avulla pystytään vertailemaan kahden eri merkkijonon sisältöä. Tässä tehtävässä sinun tulee toteuttaa vastaavasti `Contact`-luokkaan `equals`-metodi, joka vertailee, ovatko kaksi `Contact`-oliota sisällöiltään samanlaiset.
  3. Lue sivu [Olioiden samankaltaisuus](https://ohjelmointi-19.mooc.fi/osa-6/3-olioiden-samankaltaisuus) saadaksesi lisätietoa olioiden vertailusta ja `equals`-metodin toteuttamisesta.
  4. ## ADD-KOMENTO
  5. Jatkokehitä myös `AddressBook`-osoitekirjan ominaisuutta yhteystietojen lisäämiseksi siten, että osoitekirjaan ei lisätä kahta sisällöiltään täysin samanlaista yhteystietoa:
  6. ```
  7. > add Maija Meikäläinen, maija@example.com, +35850555556
  8. Added Maija Meikäläinen (email: maija@example.com, phone: +35850555556)
  9. > add Maija Meikäläinen, maija@example.com, +35850555556
  10. That contact already exists.
  11. ```
  12. Jos käyttäjän syöttämä yhteystieto löytyy jo valmiiksi osoitekirjasta, sitä ei pidä lisätä, vaan ohjelman tulee tulostaa teksti `That contact already exists.`
  13. ## ESIMERKKI
  14. ```
  15. This is an address book application. Available commands:
  16. list
  17. help
  18. add <name>, <email>, <phone>
  19. search <name>
  20. exit
  21. > add Maija Meikäläinen, maija@example.com, +35850555556
  22. Added Maija Meikäläinen (email: maija@example.com, phone: +35850555556)
  23. > add Matti Meikäläinen, matti@example.com, +35850555555
  24. Added Matti Meikäläinen (email: matti@example.com, phone: +35850555555)
  25. > add Maija Meikäläinen, maija@example.com, +35850555556
  26. That contact already exists.
  27. ...
  28. ```
  29. **AddressBookApp.java**
  30. ```
  31. import java.util.ArrayList;
  32. import java.util.List;
  33. import java.util.Scanner;
  34. public class AddressBookApp {
  35. private static String welcomeText = "This is an address book application. Available commands:\n";
  36. private static String commandMenu = " list\n" +
  37. " help\n" +
  38. " add <name>, <email>, <phone>\n" +
  39. " search <name>\n" +
  40. " exit\n";
  41. // Keep here instead of translating to a local variable
  42. private static String inputCLIPrefix = "> ";
  43. // Keep added addressBook values during application runtime
  44. private static AddressBook addressBook = new AddressBook();
  45. public static void main(String[] args) {
  46. System.out.print(welcomeText + commandMenu);
  47. while (true) {
  48. runApp();
  49. }
  50. }
  51. private static void runApp() {
  52. Scanner inputPrompt = new Scanner(System.in);
  53. Object[] getInput = parseInput(inputCLIPrefix, inputPrompt);
  54. String inputCmd = String.valueOf(getInput[0]);
  55. // TODO Avoid risk of ClassCastException
  56. List<String> inputArgs = (ArrayList<String>)getInput[1];
  57. int argsCount = 3;
  58. switch(inputCmd) {
  59. case "list":
  60. System.out.println(addressBook.toString());
  61. break;
  62. case "help":
  63. System.out.print(welcomeText + commandMenu);
  64. break;
  65. case "add":
  66. // TODO Should this be checked in AddressBook.add method instead?
  67. if (inputArgs.size() != argsCount) {
  68. System.err.printf("Invalid count of input arguments (expected %d).\n", argsCount);
  69. break;
  70. }
  71. String name = String.valueOf(inputArgs.get(0));
  72. String email = String.valueOf(inputArgs.get(1));
  73. String phone = String.valueOf(inputArgs.get(2));
  74. Contact contact = new Contact(name, email, phone);
  75. // NOTE: Else condition not needed as 3 arguments is always passed to this object method call
  76. if(addressBook.add(contact)) {
  77. System.out.printf("Added %s\n", contact.toString());
  78. }
  79. break;
  80. case "search":
  81. String searchTerm = String.valueOf(inputArgs.get(0));
  82. Contact match = addressBook.search(searchTerm);
  83. if (match == null) {
  84. System.out.printf("%s does not match any contact.\n", searchTerm);
  85. } else {
  86. System.out.println(match.toString());
  87. }
  88. break;
  89. case "exit":
  90. System.out.print("Bye!\n");
  91. System.exit(0);
  92. default:
  93. System.err.println("Command not found.");
  94. //break;
  95. }
  96. }
  97. private static Object[] parseInput(String prefix, Scanner inputRaw) {
  98. System.out.print(prefix);
  99. String inputR = inputRaw.nextLine();
  100. String command = inputR.split(" ")[0];
  101. String[] theRest = inputR.split(",");
  102. theRest[0] = theRest[0].replaceAll("^\\s*" + command + "\\s*","");
  103. List<String> arguments = new ArrayList<String>();
  104. for (int i = 0; i < theRest.length; i++) {
  105. arguments.add(theRest[i].trim());
  106. }
  107. Object[] parsedOutput = new Object[2];
  108. parsedOutput[0] = command;
  109. parsedOutput[1] = arguments;
  110. return parsedOutput;
  111. }
  112. }
  113. ```
  114. **AddressBook.java**
  115. ```
  116. import java.util.ArrayList;
  117. import java.util.List;
  118. public class AddressBook {
  119. private List<Contact> contacts;
  120. public AddressBook() {
  121. this.contacts = new ArrayList<>();
  122. }
  123. public boolean add(Contact newContact) {
  124. // Create a temporary ArrayList, if we have contacts already
  125. // Get list of all contacts, put them into the new ArrayList contactsTemp
  126. // Loop through all contacts in contactsTemp
  127. // Check the current contact in contactsTemp against newContact
  128. if (this.contacts.size() > 0) {
  129. List<Contact> contactsTemp = new ArrayList<>(this.contacts);
  130. for (Contact tempContact : contactsTemp) {
  131. if (tempContact.equals(newContact)) {
  132. System.out.println("That contact already exists.");
  133. return false;
  134. }
  135. }
  136. }
  137. this.contacts.add(newContact);
  138. return true;
  139. }
  140. public Contact search(String keyword) {
  141. for (Contact current : this.contacts) {
  142. String name = current.getName();
  143. if (name != null && name.toLowerCase().contains(keyword.toLowerCase())) {
  144. return current; // palautetaan löytynyt arvo heti
  145. }
  146. }
  147. return null; // palautetaan null, jos ei löytynyt
  148. }
  149. @Override
  150. public String toString() {
  151. String returnString = "";
  152. for (Contact contact : this.contacts) {
  153. returnString += contact + "\n";
  154. }
  155. return returnString;
  156. }
  157. }
  158. ```
  159. **Contact.java**
  160. ```
  161. public class Contact {
  162. private String name;
  163. private String email;
  164. private String phone;
  165. // NOTE: This does not validate or check input String values
  166. // (Is name actually a name, email a valid email, and phone number an actual phone number?)
  167. public Contact(String name, String email, String phone) {
  168. this.name = name;
  169. this.email = email;
  170. this.phone = phone;
  171. }
  172. public String getName() {
  173. return this.name;
  174. }
  175. @Override
  176. public boolean equals(Object contact) {
  177. if (this == contact) { return true; }
  178. if (!(this instanceof Contact)) { return false; }
  179. Contact contactT = (Contact) contact;
  180. if (this.name.equals(contactT.name) && this.email.equals(contactT.email) && this.phone.equals(contactT.phone)) {
  181. return true;
  182. }
  183. return false;
  184. }
  185. public String toString() {
  186. // Haluttu muoto: "Maija Meikäläinen (email: foo@bar.fi, phone: 5555)"
  187. return this.name + " (email: " + this.email + ", phone: " + this.phone + ")";
  188. }
  189. }
  190. ```