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.
 

8.0 KiB

Yhteystiedot ja osoitekirja 2/3 - Olioiden vertaileminen

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.

Lue sivu Olioiden samankaltaisuus saadaksesi lisätietoa olioiden vertailusta ja equals-metodin toteuttamisesta.

ADD-KOMENTO

Jatkokehitä myös AddressBook-osoitekirjan ominaisuutta yhteystietojen lisäämiseksi siten, että osoitekirjaan ei lisätä kahta sisällöiltään täysin samanlaista yhteystietoa:

> add Maija Meikäläinen, maija@example.com, +35850555556
Added Maija Meikäläinen (email: maija@example.com, phone: +35850555556)
> add Maija Meikäläinen, maija@example.com, +35850555556
That contact already exists. 

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.

ESIMERKKI

This is an address book application. Available commands:
list
help
add <name>, <email>, <phone>
search <name>
exit
> add Maija Meikäläinen, maija@example.com, +35850555556
Added Maija Meikäläinen (email: maija@example.com, phone: +35850555556)
> add Matti Meikäläinen, matti@example.com, +35850555555
Added Matti Meikäläinen (email: matti@example.com, phone: +35850555555)
> add Maija Meikäläinen, maija@example.com, +35850555556
That contact already exists.
...

AddressBookApp.java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class AddressBookApp {
private static String welcomeText = "This is an address book application. Available commands:\n";
private static String commandMenu = " list\n" +
" help\n" +
" add <name>, <email>, <phone>\n" +
" search <name>\n" +
" exit\n";
// Keep here instead of translating to a local variable
private static String inputCLIPrefix  = "> ";
// Keep added addressBook values during application runtime
private static AddressBook addressBook = new AddressBook();
public static void main(String[] args) {
System.out.print(welcomeText + commandMenu);
while (true) {
runApp();
}
}
private static void runApp() {
Scanner inputPrompt    = new Scanner(System.in);
Object[] getInput      = parseInput(inputCLIPrefix, inputPrompt);
String inputCmd        = String.valueOf(getInput[0]);
// TODO Avoid risk of ClassCastException
List<String> inputArgs = (ArrayList<String>)getInput[1];
int argsCount          = 3;
switch(inputCmd) {
case "list":
System.out.println(addressBook.toString());
break;
case "help":
System.out.print(welcomeText + commandMenu);
break;
case "add":
// TODO Should this be checked in AddressBook.add method instead?
if (inputArgs.size() != argsCount) {
System.err.printf("Invalid count of input arguments (expected %d).\n", argsCount);
break;
}
String name  = String.valueOf(inputArgs.get(0));
String email = String.valueOf(inputArgs.get(1));
String phone = String.valueOf(inputArgs.get(2));
Contact contact = new Contact(name, email, phone);
// NOTE: Else condition not needed as 3 arguments is always passed to this object method call
if(addressBook.add(contact)) {
System.out.printf("Added %s\n", contact.toString());
}
break;
case "search":
String searchTerm  = String.valueOf(inputArgs.get(0));
Contact match      = addressBook.search(searchTerm);
if (match == null) {
System.out.printf("%s does not match any contact.\n", searchTerm);
} else {
System.out.println(match.toString());
}
break;
case "exit":
System.out.print("Bye!\n");
System.exit(0);
default:
System.err.println("Command not found.");
//break;
}
}
private static Object[] parseInput(String prefix, Scanner inputRaw) {
System.out.print(prefix);
String inputR = inputRaw.nextLine();
String command   = inputR.split(" ")[0];
String[] theRest = inputR.split(",");
theRest[0] = theRest[0].replaceAll("^\\s*" + command + "\\s*","");
List<String> arguments = new ArrayList<String>();
for (int i = 0; i < theRest.length; i++) {
arguments.add(theRest[i].trim());
}
Object[] parsedOutput = new Object[2];
parsedOutput[0] = command;
parsedOutput[1] = arguments;
return parsedOutput;
}
}

AddressBook.java

import java.util.ArrayList;
import java.util.List;
public class AddressBook {
private List<Contact> contacts;
public AddressBook() {
this.contacts = new ArrayList<>();
}
public boolean add(Contact newContact) {
// Create a temporary ArrayList, if we have contacts already
// Get list of all contacts, put them into the new ArrayList contactsTemp
// Loop through all contacts in contactsTemp
// Check the current contact in contactsTemp against newContact
if (this.contacts.size() > 0) {
List<Contact> contactsTemp = new ArrayList<>(this.contacts);
for (Contact tempContact : contactsTemp) {
if (tempContact.equals(newContact)) {
System.out.println("That contact already exists.");
return false;
}
}
}
this.contacts.add(newContact);
return true;
}
public Contact search(String keyword) {
for (Contact current : this.contacts) {
String name = current.getName();
if (name != null && name.toLowerCase().contains(keyword.toLowerCase())) {
return current; // palautetaan löytynyt arvo heti
}
}
return null; // palautetaan null, jos ei löytynyt
}
@Override
public String toString() {
String returnString = "";
for (Contact contact : this.contacts) {
returnString += contact + "\n";
}
return returnString;
}
}

Contact.java

public class Contact {
private String name;
private String email;
private String phone;
// NOTE: This does not validate or check input String values
// (Is name actually a name, email a valid email, and phone number an actual phone number?)
public Contact(String name, String email, String phone) {
this.name = name;
this.email = email;
this.phone = phone;
}
public String getName() {
return this.name;
}
@Override
public boolean equals(Object contact) {
if (this == contact) { return true; }
if (!(this instanceof Contact)) { return false; }
Contact contactT = (Contact) contact;
if (this.name.equals(contactT.name) && this.email.equals(contactT.email) && this.phone.equals(contactT.phone)) {
return true;
}
return false;
}
public String toString() {
// Haluttu muoto: "Maija Meikäläinen (email: foo@bar.fi, phone: 5555)"
return this.name + " (email: " + this.email + ", phone: " + this.phone + ")";
}
}