From 0ca5087c196555e65ad524b12f2fd54676263f91 Mon Sep 17 00:00:00 2001 From: Kai Zhe Date: Wed, 11 Sep 2019 20:52:32 +0800 Subject: [PATCH] Completed C-Sort, C-DetectDuplicates --- .classpath | 4 ++ build.gradle | 6 +++ src/main/java/Duke.java | 31 ++++------- src/main/java/MainWindow.java | 7 +++ src/main/java/command/AddCommand.java | 2 +- src/main/java/command/FindCommand.java | 2 +- src/main/java/command/SortCommand.java | 46 +++++++++++++++++ src/main/java/data/duke.txt | Bin 289 -> 368 bytes src/main/java/duke/Duke.class | Bin 1784 -> 1711 bytes src/main/java/duke/MainWindow.class | Bin 2139 -> 2310 bytes src/main/java/duke/command/AddCommand.class | Bin 1292 -> 1294 bytes src/main/java/duke/command/FindCommand.class | Bin 1540 -> 1542 bytes src/main/java/duke/command/SortCommand.class | Bin 0 -> 1156 bytes src/main/java/duke/task/Task.class | Bin 997 -> 1363 bytes src/main/java/duke/task/TaskList.class | Bin 1597 -> 3600 bytes src/main/java/duke/util/Parser.class | Bin 4108 -> 4636 bytes src/main/java/duke/util/Ui.class | Bin 2183 -> 2182 bytes src/main/java/task/Task.java | 42 +++++++++++++++ src/main/java/task/TaskList.java | 51 ++++++++++++++++++- src/main/java/util/Parser.java | 44 ++++++++++++---- src/main/java/util/Ui.java | 2 +- src/test/java/duke/TaskListTest.java | 8 +-- 22 files changed, 207 insertions(+), 38 deletions(-) create mode 100644 src/main/java/command/SortCommand.java create mode 100644 src/main/java/duke/command/SortCommand.class diff --git a/.classpath b/.classpath index 4021bf2b52..477eda2a99 100644 --- a/.classpath +++ b/.classpath @@ -15,4 +15,8 @@ + + + + diff --git a/build.gradle b/build.gradle index 7deb70c7e5..b6cea02032 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ plugins { id 'application' id 'checkstyle' id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'org.openjfx.javafxplugin' version '0.0.7' } shadowJar { @@ -31,6 +32,11 @@ repositories { mavenCentral() } +javafx { + version = "11.0.2" + modules = [ 'javafx.controls', 'javafx.fxml' ] +} + application { // Change this to your main class. mainClassName = "duke.Duke" diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 19682dbb69..1e42907efc 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -46,8 +46,7 @@ public Duke(String filePath) { * @param args Arguments entered when main method is executed. */ public static void main(String[] args) { - Duke duke = new Duke(SAVE_PATH); - duke.run(); + new Duke(SAVE_PATH).run(); } /** @@ -56,7 +55,14 @@ public static void main(String[] args) { * @param input Input entered by user. */ public String getResponse(String input) { - return this.step(input); + try { + Command c = Parser.parse(input); + c.execute(tasks, ui, storage); + this.storage.save(tasks); + } catch (DukeException e) { + this.ui.showError(e.getMessage()); + } + return this.ui.getOutput(); } /** @@ -68,8 +74,7 @@ public void run() { boolean isExit = false; while (!isExit) { try { - String fullCommand = ui.readCommand(); - Command c = Parser.parse(fullCommand); + Command c = Parser.parse(ui.readCommand()); c.execute(tasks, ui, storage); storage.save(tasks); isExit = c.isExit(); @@ -78,20 +83,4 @@ public void run() { } } } - - /** - * Step-wise execution of Duke. - * - * @param input User input. - */ - public String step(String input) { - try { - Command c = Parser.parse(input); - c.execute(tasks, ui, storage); - this.storage.save(tasks); - } catch (DukeException e) { - this.ui.showError(e.getMessage()); - } - return this.ui.getOutput(); - } } diff --git a/src/main/java/MainWindow.java b/src/main/java/MainWindow.java index 4d89bb9823..74de04aa77 100644 --- a/src/main/java/MainWindow.java +++ b/src/main/java/MainWindow.java @@ -1,5 +1,6 @@ package duke; +import duke.util.Ui; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ScrollPane; @@ -29,6 +30,12 @@ public class MainWindow extends AnchorPane { @FXML public void initialize() { scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + Ui ui = new Ui(); + ui.showWelcome(); + String welcome = ui.getOutput(); + dialogContainer.getChildren().add( + DialogBox.getDukeDialog(welcome, dukeImage) + ); } public void setDuke(Duke d) { diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 4caa7d5d49..ea8c11b816 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -30,7 +30,7 @@ public AddCommand(Task task) { * @param storage Storage that stores the modified TaskList. */ public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException { - tasks.add(this.task); + tasks.addTask(this.task); ui.printResponse("Got it. I've added this task:\n " + this.task.toString() + "\n" + "Now you have " + tasks.size() + " tasks in the list."); diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 01b153f07b..a34c5459dd 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -33,7 +33,7 @@ public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException TaskList tempList = new TaskList(); for (Task task : tasks) { if (task.toString().contains(this.query)) { - tempList.add(task); + tempList.addTask(task); } } ui.printResponse("Here are the matching tasks in your list:\n " diff --git a/src/main/java/command/SortCommand.java b/src/main/java/command/SortCommand.java new file mode 100644 index 0000000000..880dfc16fe --- /dev/null +++ b/src/main/java/command/SortCommand.java @@ -0,0 +1,46 @@ +package duke.command; + +import duke.exception.DukeException; +import duke.util.Parser; +import duke.util.Ui; +import duke.util.Storage; +import duke.task.TaskList; +import duke.task.Task; + +/** + * Command containing method for finding Tasks in TaskList. + */ +public class SortCommand extends Command { + private String field; + + /** + * Constructor for SortCommand. + * + * @param field Field to sort tasks by. + */ + public SortCommand(String field) { + this.field = field; + } + + /** + * Sorts Tasks in TaskList according to the specified field. + * + * @param tasks TaskList to sort Tasks. + * @param ui Ui for printing responses to the console. + * @param storage Storage that stores the modified TaskList. + */ + public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException { + tasks.sort(field); + ui.printResponse("Here is the sorted list:\n" + + tasks.toString() + "\n"); + } + + /** + * Returns boolean to initiate exit of program. + * + * @return False so program does not exit. + */ + public boolean isExit() { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/data/duke.txt b/src/main/java/data/duke.txt index 94d96a3a40a72533fe051eaf1225e11703a13c29..3233419fec6b3f4ad975a3a861f46ade3ebd5a25 100644 GIT binary patch delta 158 zcmZ3;^nq!D6bJvO@WLXmlbjQk44s(DSr`}?n2L)Sgi=bgQ}s#`i?j7yQWH~hGV@aF z3#(Lq_pgdzVqmB!V&Fq42mz|vqa2KVPlosVFB<1I4 wmoPB8OpKD#EM%x-U|}c*Q5@wQ3=E99Dn`%BfQq>cjf@SA6@a7(P;E#B07DNkV*mgE delta 80 zcmeysw2*0n6vwi=5!03|pI0+c$&j6~oP~jbfpM}Xqnu2Dn5b?~VMq^@b=KIdfoNvB!zWc*|Z5O`&eE$)^Fwzo(RXA@! zV8}u{A`-(EDiEpW$%w=S3so4>n~NGnHHt}$YR;HM+(IoPx;kND9G5Iy#uZJRuwdh= zW=-larNcEHrZvSgBQg8(#dnc((qi5DB8K9<2q^TzC!ikeJj#T3^0|%ha!#QKrv&Q$ zoTc)Qx6;{+!bx;0%wb-k3*AoC=rR}JbJmUK$T|2V78RC|lDMw0j2j9!aZ6zZs|stn z)oqRLz^8CmqjlVKipH7~H$Qh<*-So}+1_RsfkuB|_F?*II=qqI%!X6>t=wid>UcdZ zj%9iamAUPSXSuw9=?|<@hu{bS58BXy6Wn>ZGu)4AT}-WRrY+_Qa%h_IG6vHXM3~`ea{lABszIStT^+6fE$pgvMReCiPWc z2~8y&*RX`CX8}63EqxzCUJHhhjt@j+^2&Y7W0RerRKOJ+0|SF^8nT233VUitNnb%z`!r8D1s^g delta 976 zcmZuwOHUI~7(I7d7&_cSD4@JV9?GLF7DXuXRHP!%78I!R7NNlg69_YnE=;=c7npJ7 ziXA(J#Eh@RxN+mgt^dJ4U?LIE9ctK^X1?b+ch2|C?Hm6uf9~6#kDmcVv7w{82t5V_ zq6X^FtK*u10`&S=>C@3~pa@Zw45(;OMMFA<73R8*8wN_ztJovT+*IXJWnu`cq1ldTjdL@K9&n-7nz#YoU>ws^j*(sKGhZGds^r zbAOz~jX8(wIWm1AFzx1X=yZzG} z%7xf1hjvV`rbFlmE8`EqhYnm)U;-lWxW|-!f|w6zd_g?qpzQQ5B?N$bG`PkRbdeT8 zXP#W|PC>;%asmg$ohVZiAcuZBetHL!pD-DQUzR6D5IKmKya!~N*PAg$(ZrH2tP0zHROP8wr6hDu(@ z8jK@|33OwUgd{0(3?ad4lF>BOx{BdBf=`%SQwdMz#mS3*M(Jt~(GYbe!b%jM|LELD zXS3u%>V!Z diff --git a/src/main/java/duke/MainWindow.class b/src/main/java/duke/MainWindow.class index 58e1408b78bead3c6d690fd81e3957a93359a096..e04d07d379a379a879697c0671517dfbfc109a7d 100644 GIT binary patch delta 925 zcmZXS*-{fh6o$WWmyU95^ zOmsTaDC2x87i{gaL$^r}7wyp{lgsp)T%pgP-z1AxI}F%i(5?-cT;*Ci!;IMd*X=NB za)U9Gn~WD4+_F1v+Z}i8{9S{42KP7Cw>5{4I;&kTbxkM&Jg_EocXm(_BCPN+si>yL zdZ)V+wbUreIchMam}W*%!Eu9G#T*fXdBp-z4Hb&dg?;hZOvE=TJ&V*S9fYx&erg5j%hS=-v2Y|9oeyiIO@(7a@z`SA@;cqtTW4QNx8PXcoxN6_t0L7A2!%BA zDy<1uzU6RwtsZArW`?X8T@EjG&jcdTDQnnOlPHsC0z=+K45Q(ZnM?GTsBZf{kP{CF za+RDqkQ2kZd&sTss@$q*iuB1lNUWFHfVJalOPrQbCJu>NQZJ^E5~(*xm%iH-k(ym? zsrrDKBwa)$$w-puw!zOHg>1L z6eKC^7tI&SqJ2u|7u@3xZ&32aCdDJ;Df`?bTa*a+-onzqNA2-9h>J$?&?NNDg6f(qgSN?Z_v2qNG->dWAe(rn$dU);7#CgR9hl})-((7=E zJ_no2Wi)c7l&glX8R&Ny;JP{8a2O=+aFbgmylvo)!w`2Jh8Z!p3B{gR9Fu;-|bjqVImd{3+{$H|0b53_0nD}wd^Ln*pNZRlxCV4i@I3W%VpNHvtBM1 zcPDdRHoB5dDjsPb^F$Nospd58{(HMAe};C=VU8%CX`b^!bDR?jSM!ot#hk`tUeijO z<|NIEq~;YV#e!y$CCxHvi<*C2jb`S=PDZoBswT^-BBxnnU9(|ksG3_}^kNA&m7e-A zUGl^72SX8mJXr6iLxX-QI2+2WLtm5~*$KCT0R1axB~C u(8MR|ZKfoWx`w@0vbs`vuS2j?tVU@Od#zD%*d;-)U_age`R|efo9^Ej^?8W^ diff --git a/src/main/java/duke/command/AddCommand.class b/src/main/java/duke/command/AddCommand.class index 33019d9a780d985356f41de4154e398079bc50e6..409079f4322e2c4142f8beac97fccb938b58e895 100644 GIT binary patch delta 40 scmeC->f_q5n^BrQF(oA=u{fKNL0H2lr8GNLzXZtB2MKMy!f3$^00s;V5dZ)H delta 38 tcmeC<>fze3n^BTEF(rkOK~%#hE3qt5KPNFSUEe<`D>b=f^EE~bW&q<63@88q diff --git a/src/main/java/duke/command/FindCommand.class b/src/main/java/duke/command/FindCommand.class index 259b81d9d09fa509a75db483d9bd2bbbcc4c6e72..61da9ee3ba09fc1da83b737ae93cfeaed32ecea8 100644 GIT binary patch delta 40 scmZqSY2(>&fk~P@F(oA=u{fKNL0H2lr8GNLzXZtB2MKL{$t2AT00&YH6aWAK delta 38 tcmZqUY2n#$fk~1%F(rkOK~%#hE3qt5KPNFSUEe<`D>b=f^J^w)W&q?v3@ZQt diff --git a/src/main/java/duke/command/SortCommand.class b/src/main/java/duke/command/SortCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..d69d7232aeb470502aec1f3fca36190354b33a8f GIT binary patch literal 1156 zcmaJ>-A)rh6#k|y-Lfo#l>!1{fr9-()_;*2F02qtswNgS(W_-U!qDwbvoj^|CO(8W zCW;9cK7bEpJiA+^q{NFkXXgBV=bV}O_5186fXCP{k-^k33{0E2j+v0mW=VC^L>>zU z77Z*h41E&ZYcgc(ht82>dycX}4aiH@huvYe%*0T_Sa%bTyWBweak>qW{#;GH~{JHH>a<9lN}v zh4hty0>Ke#>sV-pWU=&t)D77UT)r*BgyRhv=$dS|9lyC2mSSN9%NB-V8d$M#3zmf< zN@V#=O09I@bY60OAe(9|jdBJR3#+(oV9kOJi(xuK?Zy%9zUT}S7gW8Z40Dl~|HW)S zr?UT55P_zevXRk+W>6ayfoI5Q8MmHN6ib60H*p7d8D@8Q!1F@o^#RX^p1hg&sHqz! zGa07ZPK(#1?>hRu&fXiBOb~QjnU((5Ia@} zQT9nLIPRWw_$B5a`|Mxu9dcJ!`y1Q~QFA=6AvCWVc*3weP~T?XxLN)IR<3+U;%j7mh3FNs1#(DXl6LCmVS8D?ru__su6Ud3${3lbFP?XD#umfkksm`2GgZy6bnK>YeAV7{>`Ix)g6R->&O_E6yJV~|LR`SEtyId)Nzdsl+GX3hD`75qn)82=7F%kA zH{Guk$QDi8W$RIWCuddH&0L8Qb<1+r-F~~1snc8%A_T0oH!Uhemz?mhqIH*qPNp-C z>C|fv^J2zMI{D(7x$9o2Vo^eP$E+5Yn*+*8(Vympo|L_*1J>)hS*l6sN~R0-qGdQ{ zt!S*%ETkw%(5ZNek}FfGSM%1YErtmR#H5g2LmUYW=MmG;B}_MZH1wiRg8b*>d)I!@ zFp4`WC~RaiQF|eNLx~!{TuEzpk8|5r-qCOcgBnu8+`|$}j`t;@+byvxM#iezX32i% z3EakX*mF<&8a;YlyHG|00G)w z!uv=PM}#C@jK-Oja1nz|N^wd=`t`5yeLgA=xWN(HOJ_pmlhAQOFJp*SG}_LpoP^F2 z#ML#SGdx8DQ8wV;LogQDhd-u@BA+{n*UDWCGor$$Evx)%OSp8!99%7lj+H>*F#UCr!)}SgR1O9 zkw3A<8zJUyZG-E0%D$h$z=k`HAHK;YF+Lx0^RhKwFNR6Q!s<_SWMy$_CadTTXql|o ilAOr~#BB}!k-sC-QrEjB$9I*dz82@rkxF;F82bm^NBfun delta 505 zcmZus$w~u36s(?^q?2)?F(&Ss#4IM`5|_jU5fr=##>)tji!h1=H6)_Zt7nfg7Z3h} z3o0V$2YB@l1P}g%STlkrX{gs-RM)F|*FWXT+xPP;fLYAy2qGOs2pJc$E)2Vn3m_kW z8Ni6ds7_)`$2bZ)1~4HpDKT}iemxhe?l!Ha-8?y7-D%VXqPhIqzI|#JYIeO^u$o7E z_3DB^h?<>)vVFK=Z`XDurk#dJJ9i?T>O|Z?8^Q+KU5KE=Kol_n_2bI%@X`@VHr$Io ziK2ld`V5pX;}n%e=Umw=g_vKU6&eqHSW0uPyh%52(vZ_fT_?JT-A+t3MUS(jCMAtM z=1WbS^-$&K3tZDrlu(Ri$;JYMh`Tb9Lr^@4-_#!9yCoywe$>eWIj+f*N&KT%|Irty zpP-(-u=Ts3>?H;Ak$`+bu%epxP^^k(K0>!DKE70|;^)vF(PBNpxcSQvVR>MV_2=oh MfDG?~iNS2CAE;75*#H0l diff --git a/src/main/java/duke/task/TaskList.class b/src/main/java/duke/task/TaskList.class index 734713d3e8113cb33b0e49c2a9989007143d4bf9..2e95f2d595a660647615cda6b23b47aa4bd0e95a 100644 GIT binary patch literal 3600 zcmcIm*>@XP8UI~N_9)}AW0W{cy&xw}ZOMw&q)jMsBH|?>Dz+19laQ7rV`*$pJepCZ zQHaA*+LV1MOMw_D6bhKOp_ENd({q3WZyf##I6U)APigtxnX$E4^zg!*GxvVqz4zOf zd;jw0-QNRv7w)JS!TVGsFs)!Ff>{+IoR|0ox$}Mn56gK@MFjIIPT~U*T$J;r2tF9W z

^$lF=0vIu@c3xDrK+974Df!J=fe)Q&WkvHr=#9XgGdRAUx^h41t}~rftlY z^9x3CUSF`dqUgEYyk1%n*fl(zE3X(SmsmOU z#V;!O6y+}KrKxhkGPAmCloUKJ5OE#U_;yOkkD63Do?p0XWZf|`v-JEzP9Ky~ z2k#d+xXsi?{o|Pis-q3~kp}!efgN+^lC8VtBJDiot5J4MD>Ys$>Z{Xc$vxR9B|YXJ zGo93&Q8abSydk4Pjnz4)T+AA0O&OyO84bx`RNAKDFh(_;0#)kuB4%ucBsIkVZUsmn z`L|oI#?GI=FgGwT5R*(|x>Ypv+-l6YPIjf3X~*1UBW6k7lJA&?PvZ#<$1pC?S)UFX zi(_2FgHrgDxXB>q7#a;v;R%8EoKeaaO)oLH!A=@J&1;6{2VMRMWsunu+q_qEXcFE!>p$9oO(4oTiv>NAMjDx3H$+yZD|o zl3U-$X${Zf2O54Tq37iABm7vw^K$to0?~Tk$l$OLJel<|XRdmy4IvijYE+O+tMnPy zDC(|LWR0;v8!9EpYgwKVmdUbT+bnb@ZJY5}S-03Heu|$74AmA`K(@U=;u+an*4YfQ zPQIYa{N1-%V4gLT-m=t(so7oCa?-IZR+!%m;(;uWLOLW!?nVxAcFP2QE{7N7@FJ}+ zx6IvBCwS8h6syqES>rn0OhajT*!Gb6POw$+;gWg7Q1KFO^Q0IRs=(g7zG6%|HXF(% z)1}kwlB?S;+t|=>rp76oeQ5g5F`O+S=PB z;5?~Y)*SPdejeQB96x-1lAYaj&#nKz)j`@kTH~e7CQ-B0Xn}$afkWGjXciHH{lp z6V7cw`6D8)aJg2K0b*?a%?WliAxQG*gLrp9kO(AnRwY!RR?SsC!;YcD6LA7#zR9AW zbYZIU=aHF~bh3i>mx%Dw`G?nz-F$=d35@>pWzI>Y4nE2GB91?Og7dj#RI8w44XIFi z9f@SL)58YB#Cns_ogTKUl~`vo+T~%bZRx%jNs3uH@RM%r=bzwzoc~1PF5Us$L3ABQ z2=5BuLxgt+@P5MG0qlopj|`DC){o98+6kw5v!CY0Jb`D}TApR2c@F3B0v^I`OyhS{ z;SMg~Pk7jiUN_qRjRzE*6dfHMYJWSwe_=;mJo)AcyscA^^x9COg1s}zSFulE4fhb( zFThyMjvTJwo;9?FZ?C`g_fR!&_Mnwyk76G_gcv@I1NbNo;fkk$hR_>mRgms|o$Q5t zAOzx8DNKqx`WkvJZ=iRYV*5^o(|x_qqj#h)(N{r#1@F8|mZ)Ih(o-R^{?UMTQi- zR+>-@kz%L`#TioYHflmKOp4(O;*DC3Gc51*Tzn20Z+-|e4OQ~^B~$Db>}RmSmeI<9 WhZyjWFyKCv-GXvkkU_{HZQ(!T$5E;P delta 845 zcmZuvOHUI~6#nkaw09V$4_*R&VOt*URIFBkmh!NOk3t(4ni$;;(5OI!*v3RRUFZ+c z+>P!uEZn%z%{0MCT)SZJ5AaX8K+heTkkn?9^WA&Scjlb)o%<&8-F*1-`496_T97q1`@tT-n1#!R< zlfJtRdvm91@87dGc54hnsdBoqZ9liOyY|yZ**hECwarFRl$0Ic00vDIFmGZManYv^ z=wZZ7L@+3h)$nW)3o;Ti5yKcmaAj|=QExo6_p7zW7s4OD2|a%|r<+Cc+4b zX>C=!*J44f{^TXqS5xV-f$LZmzdWyWjvJC+7CC)N3OZf zFd;tjVRHDzSkHJfNa8R^1$08{n(PqWqJ)glW3|A((t+U|S+DCf$PQzKtfa=E&_^*V z<3Rb`!R;p&4cg`=p}O2&E39p`pf-O%`_hpSAubKuJ;T!_VUnm3w`19k)h^+0m!Jd( z-m?)5w}C8txCGXe`nM~+ptqpW4|3nYAGDxXEC)S{+EO%ffJi24MI9IpdJka&4t)1t ztL)R?-!!vdPN2B@BuGXePqsh>=1I;X>9l|(;S}AcX+h_S;e&F507sKE_6N~mi6)M> y`#94x>>$vojzL^{Qr)=5e_Wa;;r5oqxQi3GO(^$w6KlAIz$mG3y8FxI%>4s^nQBS^ diff --git a/src/main/java/duke/util/Parser.class b/src/main/java/duke/util/Parser.class index c32e42b7cdd755bf89ae548db314f35193560c51..e04bdcf2f9f2de7ae5cada8a5dc7c57b6639c942 100644 GIT binary patch literal 4636 zcmbtXYjjlA75+{#Gxz3ZLXzPb9&&j|UXu(42#`Q95+bPy!6s+}we4i)CK)o1ICBS* zS|8A&(yGNGiijd@H56?dp-q4&*q5!^{^(zScJ+7vxmH&fXuossOlBqolhw|ed(ND5 z&)NGsdw+ZHGoO5M?K*(X_*laOIH+P!!@~$Gh-h%gaa2J}gCc(p$yblcCaxl(!c>t| zaY)5s6~ihNovUyB4-;>SbvUx(mlPaFlumnd6I6kW2`x=(xpoSmdn1ZKOJfq-Q z4Xbcm#SazyNW)qjmx`W~&GWK(LB)?%oKWzhf}d#c;)sT7oK*3Wic>0HmV#f=up6fp zysF}ig4ZQy3BYe+TU2&9!w4zzCbJz@kfKcopw*PMO~&pFxcTAvVS%rJ0v*NXq z6K?FqgLH52h~dU%{6=6&j<IjSTH7_1`U6Z$Oy%095SL5>FBfU<4EuTZuDTk8;{^yZhRZxaU+1B8wUEwV+)&+ z=7_I_#F}D^K;u77U)4K1_javXwMuU*kLVN^AMxtFNmFmr38viC2cxmW`r!e;shhHi z82)HNZ>Xt|hPdj+9(3}6RR1on4@1=PZ#+b9~v7&22ZX*k}afJxA;EC6XtB4$sN&@ zxasF(hR&ecWk;Ad8%JC8kUty>W|L96D2q8x8IZcbnhej|qCsQ0Gii4A-4{zngNZCl z&CYd8+?}|dmGhY9a)HheH!?|NLCsA^St(GU#4J<2W~HaoXza*9*D;d+a)tQGOY44&st`I zmDQQW*LXDP4<`f`W)~h?ePbo7vokRi4iQOt_WN|zoe_#U;7<(LMVuAAZJOxxR#y7b z4Cc0|Y4pomglZL24)3sy;v5xi@}A%d8_|Aqfb}bp>`hqL0J*2FawhXQ_?{MCP%-1% z`4#r{!A>DGRHIa|cBT{C!lw+#8^+x;EStVciYv~Xc4wG(A%R8AI-$4`oXY>atC&f? zpxO5G?$^o-D3Av$l>jA6WaZ$D$~4M~%J%CVtzgg03TM>>#C!Z9(8bneO)f(LQ_wyN z;ZkuH`MkqI)Kq!$#*zOj3Mb*{nSgVw%Hv8;D4b9^Q7{fIzplNyBd^Ijj>2~+^E@AA ztnZlo-3i~CqwJgE`}`{VXRzt>H`t#-{Xi@GN1PwU&#)i4%kkMa*bjO=ZcD}f{H9Ut z^LmP`QM-eq`@Nod)~LzJ(N?dg*cz>Oaa8T~lvtzH3P&rvo>FVHK;@{|>+x74SBa}> z#YJiXO=N#u?5g>!=d+1V1D_pyTKKe8UBUb@HVb64Ft=GGhl|H1v82aSHi4x#xFOFn zX#?i*cR5X3fl^dqDHW_nEn6QQaF1|egV3-^6l1ekfUTkojp8nB7i*~aA?{oOPie^) zcu>K^{E8y$Q&{b=Kaf^(&}&PmfVUIdXL!Z-8MfOVX}^SJXHZ&w-FZ%WZ#kW{;zo6T z-JWVk-4)!meH8QdSkQF|eG;pBmQP^y7=r-)4YCJy1X@gp(N=Dc#*UOb6flw+G)u{*jFNgPDJz)3W?Rjc+th6RDm4vrRnwSKvrVe8Fl?7w z>7Re$7Qh z70j^Oo`OsZ8*ideLGQoe`Cse6%rik6nJkeoU`(E4Q%{|o< zxNpoV8byru9Vv4!f|Gl%q6qJE_8RlvBm?gQ%LH!Z?NzXY*??!r(at|ow`*srPK8xQ z`%YVXi`2gBPTD`F_PDt(0ot&B1(>jj(&p>gE!jXR&%OB&q{P*FqVR%Uh#?`Dd9 zsfn7mj8e0s)HxJ0+EdQ-)~ioF)I-yZFHJK}gWB5Pu_>pfbRYIwto5zE)_7yLg|0k=}+r5*iSftaMAaa}HHH(3)ws@UwiZ@I`+ZAtG3}J`KTZ)jyFm~t&J2iP* zlXjC`Cc71T6nialX|))`K9l_>2TTrX&+k}Fhv< z8*AEX3OCm@tS_A2++5exQop5PR#Vd!N!F(}m$~8`@HWO*aMhs5X^c;I!Ya|p_7x<3 zMwiVsKDP;T-C5zQ_f&Ahx$WC!&SaKNHQmml_+_H}!nqpXk(M^Mp{-_feQkD2P4lMg z`i92V7U#Aa?2I$h;=isZptcIH+jB+u914fG3!hBkZ(j)yF>%9e;Y)qrHgyW$ zI@o(>x$w35emjEaBvqdBE@tQZlU%9HD^f|mKiQQEeIn)N`}?`l(0Gxu^8G2Ul%_;V z&iAKALfVbbEFW}P{K|!5%O`A<>^#{;vM0zcl|41L2Y*;dnkM}pC(nd?Ne}u5M9H`% zwsGhLOe9I@2uZ+5Qpu589xVl%C%=4tq=3-R65uYy{3;cAPt5OAV#G`<&s*F>R#{hwBDNV zTOgM6q|xTfB^J8SQ}FbWsaQNuv7`^ncnq(U`y;%erv>~c-k~wP!!+LE|A%*_;9V_v zYXt8a!CNPI*9zWR#*SzG69AUh)PS8|k}}nZ2qPnma*~pFhH~6;N^&zeI)-RWu$SCm zKt;)mk{=%HA1m)rY6eXG1~JP5Z5c2<#p0$^1(g5qZVL6s8x#dhul^okTxmiV{You2 z$g_V186OOUR3IVBgjk%3|A;f`zv7fUX`IP&86BonhjBqXr;kcL?uNK8{atJZjvED>FiPk&rgO@uB6QkV$~mK!ixU34QO^aVnM=lAaj*O5 zD5(!+Bq_Il7RS0s5!Af|{rcGh`$!kzcT(=ljFMt~NEQkIVjWY#LPc>OiHeu*;g>U^ zr#|#p8_2BJ(^8NYNZZB<_vgw?!txeZ_cA3Y1ymLmt>KOm%eA;6?cOa-xKdBrCGO#w za#*iH{_+S@J5k;)yq<0Xy-W-Gr$>3do1*Jt5PP1OpA1q6xLNWMXHPRE$SbbNsy_h4 C;(|y3 diff --git a/src/main/java/duke/util/Ui.class b/src/main/java/duke/util/Ui.class index a4c15be5b8ac3991a6a5e4cc6df355a7dd1c6e31..d74af3434eafb2d8d1bce1b2e33ad6d0f28cbd30 100644 GIT binary patch delta 44 zcmZn{Y!lod$}VZbz|6qJz`!7)rKP=%fp04V|0V_jtt|}vll9pp8HG1{vfD8N0J!l8 APyhe` delta 45 xcmZn@Y!}=h$}VNfz|6qJz`!7?rKP=%fp04V|0V_jFmtjVyCkE?W)F5dMgYM%2z~$n diff --git a/src/main/java/task/Task.java b/src/main/java/task/Task.java index 1466de3728..f6e2382f78 100644 --- a/src/main/java/task/Task.java +++ b/src/main/java/task/Task.java @@ -26,8 +26,37 @@ public Task(String type, String description, Date date) { this.isDone = false; } + /** + * Returns String containing type of task. + * + * @return String of type. + */ + public String getType() { + return this.type; + } + + /** + * Returns String containing description of task. + * + * @return String containing description. + */ + public String getDescription() { + return this.description; + } + + /** + * Returns Date containing date of task. + * + * @return Date containing date. + */ + public Date getDate() { + return this.date; + } + /** * Returns String containing status of task. + * + * @return String containing status. */ public String getStatusIcon() { return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols @@ -47,11 +76,24 @@ public void markAsUnDone() { this.isDone = false; } + /** + * Returns true if Tasks have the same values in all fields, else false. + * + * @param task Task to be compared to this Task. + * @return True if Tasks are the same. + */ + public boolean equals(Task task) { + return this.type.equals(task.type) + && this.description.equals(task.description) + && this.date.equals(task.date); + } + /** * Returns String containing information about the task. * * @return String containing status, description and date of task. */ + @Override public String toString() { return String.format("[%s][%s] %s %s", this.type, this.getStatusIcon(), diff --git a/src/main/java/task/TaskList.java b/src/main/java/task/TaskList.java index b5a2b86af3..7705eeeb07 100644 --- a/src/main/java/task/TaskList.java +++ b/src/main/java/task/TaskList.java @@ -1,8 +1,10 @@ package duke.task; +import duke.exception.DukeException; import duke.task.Task; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; /** * TaskList class contains Tasks to be done. @@ -14,7 +16,10 @@ public class TaskList extends ArrayList implements Serializable { * @param task Task to be added to TaskList. * @return Boolean if Task is successfully added. */ - public boolean addTask(Task task) { + public boolean addTask(Task task) throws DukeException { + if (this.hasDuplicates(task)) { + throw new DukeException("☹ OOPS!!! Task already exists in the list."); + } return this.add(task); } @@ -34,6 +39,7 @@ public Task get(int itemId) { * @param itemId Id of the Task to be removed. * @return Task which has been removed from TaskList. */ + @Override public Task remove(int itemId) { return super.remove(itemId - 1); } @@ -47,6 +53,49 @@ public void markAsDone(int itemId) { super.get(itemId - 1).markAsDone(); } + /** + * Sorts Tasks in TaskList by field specified. + * + * @param field Field to sort Tasks by. + */ + public void sort(String field) throws DukeException { + switch (field) { + case "date": + Collections.sort(this, + (task1, task2) -> task1.getDate().compareTo(task2.getDate())); + break; + case "description": + Collections.sort(this, + (task1, task2) -> task1.getDescription().compareTo(task2.getDescription())); + break; + case "type": + Collections.sort(this, + (task1, task2) -> task1.getType().compareTo(task2.getType())); + break; + case "done": + Collections.sort(this, + (task1, task2) -> task1.getStatusIcon().compareTo(task2.getStatusIcon())); + break; + default: + throw new DukeException("☹ OOPS!!! Field not found to sort."); + } + } + + /** + * Returns true if there are duplicate Tasks in TaskList, else false. + * + * @param task1 Task to be checked against. + * @return True if there are duplicate Tasks, else false. + */ + public boolean hasDuplicates(Task task1) { + for (Task task2 : this) { + if (task1.equals(task2)) { + return true; + } + } + return false; + } + /** * Returns String of Tasks contained in TaskList. * diff --git a/src/main/java/util/Parser.java b/src/main/java/util/Parser.java index f25ed4c07e..2cb60b028a 100644 --- a/src/main/java/util/Parser.java +++ b/src/main/java/util/Parser.java @@ -7,12 +7,15 @@ import duke.command.ExitCommand; import duke.command.FindCommand; import duke.command.ListCommand; +import duke.command.SortCommand; + import duke.task.Task; import duke.task.Todo; import duke.task.Deadline; import duke.task.Event; + import duke.exception.DukeException; -import java.util.HashMap; + import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; @@ -54,6 +57,8 @@ public static Command parse(String input) throws DukeException { return parseTask(input); case "find": return parseFind(input); + case "sort": + return parseSort(input); default: throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } @@ -64,7 +69,7 @@ public static Command parse(String input) throws DukeException { * If input cannot be parsed, throws DukeException. * * @param input Input entered by user. - * @return itemId for object to be marked done. + * @return DoneCommand to execute done action. * @throws DukeException If input has incorrect format. */ public static DoneCommand parseDone(String input) throws DukeException { @@ -77,7 +82,7 @@ public static DoneCommand parseDone(String input) throws DukeException { } catch (AssertionError | NumberFormatException e) { throw new DukeException("☹ OOPS!!! Incorrect format for done command."); } - + return new DoneCommand(itemId); } @@ -86,7 +91,7 @@ public static DoneCommand parseDone(String input) throws DukeException { * If input cannot be parsed, throws DukeException. * * @param input Input entered by user. - * @return itemId for object to be marked done. + * @return DeleteCommand to execute deletion of Task. * @throws DukeException If input has incorrect format. */ public static DeleteCommand parseDelete(String input) throws DukeException { @@ -108,7 +113,7 @@ public static DeleteCommand parseDelete(String input) throws DukeException { * If input cannot be parsed, throws DukeException. * * @param input Input entered by user. - * @return Task to be added. + * @return AddCommand to execute addition of Task. * @throws DukeException If input has incorrect format. */ public static AddCommand parseTask(String input) throws DukeException { @@ -164,7 +169,7 @@ public static AddCommand parseTask(String input) throws DukeException { return new AddCommand(new Event(description, date)); default: - throw new DukeException("Invalid task input."); + throw new DukeException("☹ OOPS!!! Invalid format for task command."); } } @@ -172,10 +177,31 @@ public static AddCommand parseTask(String input) throws DukeException { * Returns query to match to Tasks. * * @param input Input entered by user. - * @return String containing query. + * @return FindCommand to execute find. */ - public static FindCommand parseFind(String input) { - String query = input.split("find")[1]; + public static FindCommand parseFind(String input) throws DukeException { + String query; + try { + query = input.substring("find ".length()).trim(); + } catch (IndexOutOfBoundsException e) { + throw new DukeException("☹ OOPS!!! Incorrect format for find command."); + } return new FindCommand(query); } + + /** + * Returns field to sort Tasks by. + * + * @param input Input entered by user. + * @return SortCommand to execute sort. + */ + public static SortCommand parseSort(String input) throws DukeException { + String field; + try { + field = input.substring("sort".length()).trim(); + } catch (IndexOutOfBoundsException e) { + throw new DukeException("☹ OOPS!!! Incorrect format for sort command."); + } + return new SortCommand(field); + } } \ No newline at end of file diff --git a/src/main/java/util/Ui.java b/src/main/java/util/Ui.java index 7156a94dd2..b8ad0f4c36 100644 --- a/src/main/java/util/Ui.java +++ b/src/main/java/util/Ui.java @@ -30,7 +30,7 @@ String indent(String output) { */ public void printResponse(String output) { this.buffer = format(output); - System.out.println(format(output)); + System.out.println(this.buffer); } public String getOutput() { diff --git a/src/test/java/duke/TaskListTest.java b/src/test/java/duke/TaskListTest.java index e11e7d82ae..4434bcc0f9 100644 --- a/src/test/java/duke/TaskListTest.java +++ b/src/test/java/duke/TaskListTest.java @@ -1,6 +1,6 @@ -import duke.TaskList; +import duke.task.TaskList; import duke.task.Todo; -import duke.DukeException; +import duke.exception.DukeException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -10,7 +10,7 @@ public class TaskListTest { @Test void addTaskTest() { TaskList taskList = new TaskList(); - taskList.add(new Todo("description")); + taskList.addTask(new Todo("description")); assertEquals(1, taskList.size()); taskList.remove(1); } @@ -18,7 +18,7 @@ void addTaskTest() { @Test void deleteTaskTest() { TaskList taskList = new TaskList(); - taskList.add(new Todo("description")); + taskList.addTask(new Todo("description")); taskList.remove(1); assertEquals(0, taskList.size()); }