From fa9955026f65cc00758176af86a52b43c67f4498 Mon Sep 17 00:00:00 2001 From: "vincent.steinman" <vincent.steinmann@etu.hesge.ch> Date: Tue, 18 Oct 2022 10:32:03 +0200 Subject: [PATCH] Finish work s1+ --- tp/src/main/java/org/example/Main.java | 175 +++++++++++++---------- tp/target/classes/org/example/Main.class | Bin 5165 -> 5789 bytes 2 files changed, 102 insertions(+), 73 deletions(-) diff --git a/tp/src/main/java/org/example/Main.java b/tp/src/main/java/org/example/Main.java index 19195df..c48e660 100644 --- a/tp/src/main/java/org/example/Main.java +++ b/tp/src/main/java/org/example/Main.java @@ -2,12 +2,13 @@ package org.example; import java.util.Scanner; public class Main { - static Person p1 = new Person("Doe", "John"); - static String[] phone = {"0"}; - static String[] social = {"S"}; - static String[] emails = {"a"}; - static Contact c1 = new Contact(p1, "jst", phone, emails, social, "j"); - static Contact[] contactArray = {c1}; +// static Person p1 = new Person("Doe", "John"); +// static String[] phone = {"0"}; +// static String[] social = {"S"}; +// static String[] emails = {"a"}; +// static Contact c1 = new Contact(p1, "jst", phone, emails, social, "j"); +// static Contact c2 = new Contact(p1,"u",phone, emails,social, "NONE"); + static Contact[] contactArray = {}; public static void main(String[] args) { while(true){ System.out.println(""); @@ -33,13 +34,14 @@ public class Main { Show(); break; default: - System.out.println("Please enter valid number"); + System.out.println("Please enter valid input"); break; } } } public static void Add(){ - int size = contactArray.length; + int size_array = contactArray.length; + Contact[] newContactArray = new Contact[size_array + 1]; System.out.println("Enter first names"); Scanner myObj = new Scanner(System.in); String firstName = myObj.nextLine(); @@ -63,80 +65,105 @@ public class Main { String[] socialList = phone.split(" "); Contact c = new Contact(p, address, phoneList, emailList, socialList, job); - contactArray[size] = c; + System.arraycopy(contactArray,0,newContactArray, 0,size_array); + newContactArray[size_array] = c; + contactArray = newContactArray; } public static void Edit(){ - System.out.println("Which contact?"); - Scanner myObj = new Scanner(System.in); - String contactNb = myObj.nextLine(); - if(TryNumber(contactNb)){ - System.out.println("[0] Edit First names"); - System.out.println("[1] Edit Last names"); - System.out.println("[2] Edit Address"); - System.out.println("[3] Edit Phones"); - System.out.println("[4] Edit Emails"); - System.out.println("[5] Edit Social"); - System.out.println("[6] Edit Job"); - String usrInput = myObj.nextLine(); + int size_array = contactArray.length; + if(size_array == 0){ + System.out.println("List is empty"); + } + else{ + System.out.println("Which contact?"); + Scanner myObj = new Scanner(System.in); + String contactNb = myObj.nextLine(); + if(TryNumber(contactNb)){ + System.out.println("[0] Edit First names"); + System.out.println("[1] Edit Last names"); + System.out.println("[2] Edit Address"); + System.out.println("[3] Edit Phones"); + System.out.println("[4] Edit Emails"); + System.out.println("[5] Edit Social"); + System.out.println("[6] Edit Job"); + String usrInput = myObj.nextLine(); - switch (usrInput){ - case "0": - System.out.println("[0] Enter new first names"); - String editFirst = myObj.nextLine(); - contactArray[Integer.parseInt(contactNb)].EditFirstName(editFirst); - break; - case "1": - System.out.println("[0] Enter new last names"); - String editLast = myObj.nextLine(); - contactArray[Integer.parseInt(contactNb)].EditLastName(editLast); - break; - case "2": - System.out.println("[0] Enter new first address"); - String editAddr = myObj.nextLine(); - contactArray[Integer.parseInt(contactNb)].EditFirstName(editAddr); - break; - case "3": - System.out.println("[0] Enter new phone numbers (use / as separator)"); - String editPhone = myObj.nextLine(); - String[] editPhoneList = editPhone.split("/"); - contactArray[Integer.parseInt(contactNb)].EditPhone(editPhoneList); - break; - case "4": - System.out.println("[0] Enter new Emails (use / as separator)"); - String editEmail = myObj.nextLine(); - String[] editEmailList = editEmail.split("/"); - contactArray[Integer.parseInt(contactNb)].EditEmail(editEmailList); - break; - case "5": - System.out.println("[0] Enter new Socials (use / as separator)"); - String editSocial = myObj.nextLine(); - String[] editSocialList = editSocial.split("/"); - contactArray[Integer.parseInt(contactNb)].EditEmail(editSocialList); - break; - case "6": - System.out.println("[0] Enter new Job"); - String editJob = myObj.nextLine(); - contactArray[Integer.parseInt(contactNb)].EditLastName(editJob); - break; - default: - System.out.println("Please enter correct value"); - break; + switch (usrInput){ + case "0": + System.out.println("Enter new first names"); + String editFirst = myObj.nextLine(); + contactArray[Integer.parseInt(contactNb)].EditFirstName(editFirst); + break; + case "1": + System.out.println("Enter new last names"); + String editLast = myObj.nextLine(); + contactArray[Integer.parseInt(contactNb)].EditLastName(editLast); + break; + case "2": + System.out.println("Enter new first address"); + String editAddr = myObj.nextLine(); + contactArray[Integer.parseInt(contactNb)].EditFirstName(editAddr); + break; + case "3": + System.out.println("Enter new phone numbers (use / as separator)"); + String editPhone = myObj.nextLine(); + String[] editPhoneList = editPhone.split("/"); + contactArray[Integer.parseInt(contactNb)].EditPhone(editPhoneList); + break; + case "4": + System.out.println("Enter new Emails (use / as separator)"); + String editEmail = myObj.nextLine(); + String[] editEmailList = editEmail.split("/"); + contactArray[Integer.parseInt(contactNb)].EditEmail(editEmailList); + break; + case "5": + System.out.println("Enter new Socials (use / as separator)"); + String editSocial = myObj.nextLine(); + String[] editSocialList = editSocial.split("/"); + contactArray[Integer.parseInt(contactNb)].EditEmail(editSocialList); + break; + case "6": + System.out.println("Enter new Job"); + String editJob = myObj.nextLine(); + contactArray[Integer.parseInt(contactNb)].EditLastName(editJob); + break; + default: + System.out.println("Please enter correct value"); + break; + } + } + else { + System.out.println("Please enter valid input"); + System.out.println("It must be a number between 0 and " + (size_array -1)); } - } - else { - System.out.println("Please enter valid number"); } } public static void Delete(){ - Scanner myObj = new Scanner(System.in); - String usrInput = myObj.nextLine(); - System.out.println("Which Contact?"); - if(TryNumber(usrInput)){ - + int size_array = contactArray.length; + if(size_array == 0){ + System.out.println("List is empty"); } else{ - System.out.println("Please enter valid number"); + Contact[] newContactArray = new Contact[size_array -1]; + System.out.println("Which Contact?"); + Scanner myObj = new Scanner(System.in); + String usrInput = myObj.nextLine(); + if(TryNumber(usrInput)){ + for(int i = 0; i < size_array -1; i++){ + if(i >= Integer.parseInt(usrInput)){ + newContactArray[i] = contactArray[i+1]; + } + else{ + newContactArray[i] = contactArray[i]; + } + } + contactArray = newContactArray; + } + else{ + System.out.println("Please enter valid input"); + System.out.println("It must be a number between 0 and " + (size_array -1)); + } } } public static void Show(){ @@ -145,7 +172,9 @@ public class Main { System.out.println(); } } + //Test if the value is a number or not and if it's withing the range of the array public static boolean TryNumber(String nb){ + int size_array = contactArray.length; int nbInt = 0; try{ nbInt = Integer.parseInt(nb); @@ -153,6 +182,6 @@ public class Main { catch (NumberFormatException e){ } - return (nbInt < contactArray.length); + return (nbInt < size_array); } } \ No newline at end of file diff --git a/tp/target/classes/org/example/Main.class b/tp/target/classes/org/example/Main.class index c85a5a2fadb8dd33a5b7275e60c107969aa4c652..f1a65bacc03d7eae4f883748d81361de8ec72936 100644 GIT binary patch delta 3882 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 delta 3311 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 -- GitLab