From 646f4dc077daf6ade06b674815eea95115678f68 Mon Sep 17 00:00:00 2001 From: Emanuele Slusarz Date: Tue, 12 May 2026 14:55:17 +0200 Subject: [PATCH] sur->mac --- .metadata/.lock_info | 4 +- .metadata/.log | 179 + .../gradle/versions.json | 82 +- .../0/506478077c4d001117ad98d4e911bb97 | 296 ++ .../0/f08464e1364d0011135ca7e1c9885acd | 98 - .../1/20722979fd4d00111282df97d7c4d0e2 | 414 ++ .../11/40104dac754d001117ad98d4e911bb97 | 225 ++ .../11/a0a17875a94c0011135ca7e1c9885acd | 9 - .../12/4056f154794d001117ad98d4e911bb97 | 273 ++ .../13/1008b20d5b4d001117ad98d4e911bb97 | 195 + .../13/2024ff882f4d0011135ca7e1c9885acd | 51 - .../13/40a97f1b364d0011135ca7e1c9885acd | 96 - .../13/c0b854a3354d0011135ca7e1c9885acd | 85 - .../14/20c737b9324d0011135ca7e1c9885acd | 73 - .../14/50a33ded784d001117ad98d4e911bb97 | 273 ++ .../14/d04502475b4d001117ad98d4e911bb97 | 202 + .../15/0009df8d764d001117ad98d4e911bb97 | 237 ++ .../15/e0b9f10afb4d00111282df97d7c4d0e2 | 393 ++ .../16/40767bf61e4d0011135ca7e1c9885acd | 28 - .../16/9011665d874d001117ad98d4e911bb97 | 386 ++ .../19/20b9c8ddfd4d00111282df97d7c4d0e2 | 424 ++ .../19/40b22efa764d001117ad98d4e911bb97 | 248 ++ .../1b/3063929c394d0011135ca7e1c9885acd | 134 - .../1b/80da122b594d001117ad98d4e911bb97 | 203 + .../1c/90aa9917384d0011135ca7e1c9885acd | 115 - .../1c/e0b0cc478e4c0011135ca7e1c9885acd | 0 .../1d/00b82720fb4d00111282df97d7c4d0e2 | 399 ++ .../1d/90e90f4b814d001117ad98d4e911bb97 | 367 ++ .../1e/406f9e107f4d001117ad98d4e911bb97 | 340 ++ .../1e/5076a02b1e4d0011135ca7e1c9885acd | 12 - .../1f/d009d1e07e4d001117ad98d4e911bb97 | 334 ++ .../2/a0f255c8594d001117ad98d4e911bb97 | 212 + .../20/e0591369594d001117ad98d4e911bb97 | 210 + .../21/9096dee0fb4d00111282df97d7c4d0e2 | 408 ++ .../22/302633ba764d001117ad98d4e911bb97 | 239 ++ .../22/804feb72374d0011135ca7e1c9885acd | 113 - .../23/50874d9b5e4d001117ad98d4e911bb97 | 238 ++ .../24/a07c963e784d001117ad98d4e911bb97 | 263 ++ .../25/7093adeb364d0011135ca7e1c9885acd | 99 - .../25/8073d745314d0011135ca7e1c9885acd | 59 - .../26/0069b83a814d001117ad98d4e911bb97 | 368 ++ .../26/40665d03aa4c0011135ca7e1c9885acd | 22 - .../26/b09ad2cf594d001117ad98d4e911bb97 | 212 + .../27/60ac05aa354d0011135ca7e1c9885acd | 88 - .../27/90bc5f635a4d001117ad98d4e911bb97 | 219 ++ .../27/a0fa92045b4d001117ad98d4e911bb97 | 195 + .../27/d0b5b782314d0011135ca7e1c9885acd | 60 - .../29/306179641e4d0011135ca7e1c9885acd | 20 - .../29/40140044594d001117ad98d4e911bb97 | 207 + .../2a/4078db2e7a4d001117ad98d4e911bb97 | 287 ++ .../2a/9081abb57e4d001117ad98d4e911bb97 | 329 ++ .../2b/009d006b2f4d0011135ca7e1c9885acd | 48 - .../2b/a0823937594d001117ad98d4e911bb97 | 206 + .../2b/f0bf9dca7e4d001117ad98d4e911bb97 | 330 ++ .../2c/908c974b334d0011135ca7e1c9885acd | 76 - .../2d/401ce2e9784d001117ad98d4e911bb97 | 271 ++ .../2d/502ec652784d001117ad98d4e911bb97 | 268 ++ .../2d/a00f7051354d0011135ca7e1c9885acd | 83 - .../2d/b0b57503594d001117ad98d4e911bb97 | 201 + .../2e/604ff500384d0011135ca7e1c9885acd | 114 - .../2f/20c41a307c4d001117ad98d4e911bb97 | 300 ++ .../2f/40e6fba1874d001117ad98d4e911bb97 | 391 ++ .../2f/e0fb2b165b4d001117ad98d4e911bb97 | 197 + .../2f/f0f735ee764d001117ad98d4e911bb97 | 244 ++ .../3/706178ea7b4d001117ad98d4e911bb97 | 294 ++ .../3/a0dd3419304d0011135ca7e1c9885acd | 59 - .../3/d00b22df324d0011135ca7e1c9885acd | 77 - .../30/f081edd52f4d0011135ca7e1c9885acd | 54 - .../31/3019efdd764d001117ad98d4e911bb97 | 243 ++ .../31/5021a0f7384d0011135ca7e1c9885acd | 126 - .../31/a079cbd0594d001117ad98d4e911bb97 | 213 + .../31/e0852927aa4c0011135ca7e1c9885acd | 24 - .../31/e09a142e2f4d0011135ca7e1c9885acd | 37 - .../31/f0b898c0764d001117ad98d4e911bb97 | 239 ++ .../32/b0a924c5764d001117ad98d4e911bb97 | 240 ++ .../33/9006da815e4d001117ad98d4e911bb97 | 235 ++ .../33/b0ecb5b67e4d001117ad98d4e911bb97 | 329 ++ .../33/d0662990794d001117ad98d4e911bb97 | 281 ++ .../34/208a9ecdfd4d00111282df97d7c4d0e2 | 423 ++ .../34/40483466794d001117ad98d4e911bb97 | 276 ++ .../34/702de21dfe4d00111282df97d7c4d0e2 | 428 ++ .../34/f09218291e4d0011135ca7e1c9885acd | 12 - .../35/600e04139f4c0011135ca7e1c9885acd | 5 - .../35/90392959374d0011135ca7e1c9885acd | 107 - .../35/a0048f3b5a4d001117ad98d4e911bb97 | 218 ++ .../36/705091945b4d001117ad98d4e911bb97 | 211 + .../36/908d1035a84c0011135ca7e1c9885acd | 5 - .../36/c082b4c4764d001117ad98d4e911bb97 | 239 ++ .../37/30fe89b7814d001117ad98d4e911bb97 | 372 ++ .../37/b0a1ebe6fe4d00111282df97d7c4d0e2 | 432 +++ .../38/2003b3e4774d001117ad98d4e911bb97 | 256 ++ .../38/30df62ef764d001117ad98d4e911bb97 | 243 ++ .../38/505233b7374d0011135ca7e1c9885acd | 114 - .../38/6015615c1e4d0011135ca7e1c9885acd | 20 - .../39/0068e6885b4d001117ad98d4e911bb97 | 211 + .../39/80bbd1b35d4d001117ad98d4e911bb97 | 227 ++ .../39/90f4027a814d001117ad98d4e911bb97 | 369 ++ .../39/d01a358c7c4d001117ad98d4e911bb97 | 301 ++ .../3a/00c71b815b4d001117ad98d4e911bb97 | 209 + .../3a/403df5a8764d001117ad98d4e911bb97 | 238 ++ .../3a/406036f4764d001117ad98d4e911bb97 | 244 ++ .../3a/905aa1cbfd4d00111282df97d7c4d0e2 | 421 ++ .../3b/30736f9f804d001117ad98d4e911bb97 | 354 ++ .../3b/609f941d5e4d001117ad98d4e911bb97 | 231 ++ .../3b/805ee151764d001117ad98d4e911bb97 | 232 ++ .../3b/d023eb9c344d0011135ca7e1c9885acd | 78 - .../3c/10dd6882324d0011135ca7e1c9885acd | 68 - .../3c/206bbf40fc4d00111282df97d7c4d0e2 | 411 ++ .../3c/309060ab2f4d0011135ca7e1c9885acd | 52 - .../3c/709479b22f4d0011135ca7e1c9885acd | 54 - .../3c/805f50da324d0011135ca7e1c9885acd | 77 - .../3e/90898c119f4c0011135ca7e1c9885acd | 0 .../3e/a0183c26aa4c0011135ca7e1c9885acd | 24 - .../3f/90badac87b4d001117ad98d4e911bb97 | 290 ++ .../40/b034c1e3a94c0011135ca7e1c9885acd | 20 - .../40/c0d0bd0c1e4d0011135ca7e1c9885acd | 7 - .../42/50cddb2d8f4c0011135ca7e1c9885acd | 16 - .../50ef654f574d001117ad98d4e911bb97} | 51 +- .../42/6029c9127d4d001117ad98d4e911bb97 | 313 ++ .../42/60a9a477a94c0011135ca7e1c9885acd | 13 - .../42/801890d5574d001117ad98d4e911bb97 | 191 + .../42/80d89bf3774d001117ad98d4e911bb97 | 260 ++ .../42/d0b42ef87c4d001117ad98d4e911bb97 | 307 ++ .../42/e0cbea023a4d0011135ca7e1c9885acd | 136 - .../43/10b441b1584d001117ad98d4e911bb97 | 193 + .../44/a04603031e4d0011135ca7e1c9885acd | 5 - .../44/f0005c81324d0011135ca7e1c9885acd | 67 - .../45/e05f32507f4d001117ad98d4e911bb97 | 347 ++ .../45/e08b33a77d4d001117ad98d4e911bb97 | 319 ++ .../46/80b1c7d6804d001117ad98d4e911bb97 | 359 ++ .../46/9009d050fa4d00111282df97d7c4d0e2 | 393 ++ .../47/c011bffa7e4d001117ad98d4e911bb97 | 337 ++ .../48/0075ba535a4d001117ad98d4e911bb97 | 219 ++ .../48/30deeb827e4d001117ad98d4e911bb97 | 324 ++ .../48/5019b48d324d0011135ca7e1c9885acd | 69 - .../49/30ac4aba7e4d001117ad98d4e911bb97 | 330 ++ .../49/70bda109ff4d00111282df97d7c4d0e2 | 437 +++ .../49/d05f54f2344d0011135ca7e1c9885acd | 80 - .../49/f06a35857c4d001117ad98d4e911bb97 | 300 ++ .../4a/801f58a5594d001117ad98d4e911bb97 | 212 + .../4a/90995109aa4c0011135ca7e1c9885acd | 24 - .../4a/a09dc134814d001117ad98d4e911bb97 | 367 ++ .../4a/b0fad96dfe4d00111282df97d7c4d0e2 | 431 +++ .../4b/00ef1087fb4d00111282df97d7c4d0e2 | 405 ++ .../4b/4096a4f5764d001117ad98d4e911bb97 | 244 ++ .../4b/70645260794d001117ad98d4e911bb97 | 275 ++ .../4b/801e556f394d0011135ca7e1c9885acd | 132 - .../4b/8045cd9a374d0011135ca7e1c9885acd | 113 - .../4b/c0dc092bfc4d00111282df97d7c4d0e2 | 410 ++ .../4c/d0bc35095d4d001117ad98d4e911bb97 | 222 ++ .../4d/c0880dc5354d0011135ca7e1c9885acd | 90 - .../4f/0006cd1a814d001117ad98d4e911bb97 | 366 ++ .../4f/10000be77b4d001117ad98d4e911bb97 | 294 ++ .../4f/506489f1584d001117ad98d4e911bb97 | 201 + .../4f/60f31582384d0011135ca7e1c9885acd | 117 - .../4f/903e85f25a4d001117ad98d4e911bb97 | 193 + .../4f/9083c736304d0011135ca7e1c9885acd | 59 - .../4f/d0ccc04afd4d00111282df97d7c4d0e2 | 412 ++ .../4f/e088d0d9794d001117ad98d4e911bb97 | 283 ++ .../4f/f05965a1374d0011135ca7e1c9885acd | 114 - .../5/10efa127fb4d00111282df97d7c4d0e2 | 401 ++ .../5/30338771594d001117ad98d4e911bb97 | 210 + .../5/307a86ee7c4d001117ad98d4e911bb97 | 303 ++ .../5/504e5a3b814d001117ad98d4e911bb97 | 367 ++ .../5/d00d46ae384d0011135ca7e1c9885acd | 119 - .../5/e0a2e6bc754d001117ad98d4e911bb97 | 227 ++ .../50/60160ff55d4d001117ad98d4e911bb97 | 227 ++ .../50/60c2b7b97b4d001117ad98d4e911bb97 | 287 ++ .../50/703706531e4d0011135ca7e1c9885acd | 17 - .../52/20cb337d1e4d0011135ca7e1c9885acd | 26 - .../54/009c5fde7b4d001117ad98d4e911bb97 | 294 ++ .../54/109ff16f594d001117ad98d4e911bb97 | 209 + .../54/a0de835e7c4d001117ad98d4e911bb97 | 300 ++ .../54/d03231a7394d0011135ca7e1c9885acd | 134 - .../55/a069e620364d0011135ca7e1c9885acd | 96 - .../55/d0ac5eeefe4d00111282df97d7c4d0e2 | 436 +++ .../56/00ccfe8f874d001117ad98d4e911bb97 | 388 ++ .../56/506ddabe594d001117ad98d4e911bb97 | 212 + .../56/70d4e419774d001117ad98d4e911bb97 | 247 ++ .../56/b0e86572804d001117ad98d4e911bb97 | 350 ++ .../56/f0c2aadb804d001117ad98d4e911bb97 | 362 ++ .../57/10a5470e1e4d0011135ca7e1c9885acd | 9 - .../57/207d929e324d0011135ca7e1c9885acd | 71 - .../57/70762361814d001117ad98d4e911bb97 | 367 ++ .../57/b0f539ae814d001117ad98d4e911bb97 | 371 ++ .../5a/00dcb9c1584d001117ad98d4e911bb97 | 196 + .../5a/603b700d1f4d0011135ca7e1c9885acd | 30 - .../5c/e09d79f1fd4d00111282df97d7c4d0e2 | 426 ++ .../5d/40636b107d4d001117ad98d4e911bb97 | 311 ++ .../5e/e02bd5b0324d0011135ca7e1c9885acd | 73 - .../5f/a0b241097c4d001117ad98d4e911bb97 | 297 ++ .../6/70690d547a4d001117ad98d4e911bb97 | 288 ++ .../6/f03c9e905e4d001117ad98d4e911bb97 | 236 ++ .../60/10fddfda794d001117ad98d4e911bb97 | 283 ++ .../60/40d39f327a4d001117ad98d4e911bb97 | 288 ++ .../60/80cc47ab394d0011135ca7e1c9885acd | 134 - .../60/a064d590814d001117ad98d4e911bb97 | 370 ++ .../60/f0b27634764d001117ad98d4e911bb97 | 232 ++ .../61/a0b004fb5a4d001117ad98d4e911bb97 | 193 + .../62/30a390b9fb4d00111282df97d7c4d0e2 | 406 ++ .../62/d08425b4314d0011135ca7e1c9885acd | 61 - .../63/10a2818c594d001117ad98d4e911bb97 | 210 + .../63/40d1df262f4d0011135ca7e1c9885acd | 34 - .../63/501b8f83374d0011135ca7e1c9885acd | 113 - .../63/80b84ffa5a4d001117ad98d4e911bb97 | 193 + .../64/20e64bf5fe4d00111282df97d7c4d0e2 | 436 +++ .../64/30067cc7814d001117ad98d4e911bb97 | 372 ++ .../64/7099dc457a4d001117ad98d4e911bb97 | 288 ++ .../64/e0b91ffd854d001117ad98d4e911bb97 | 374 ++ .../64/f02cfc58754d001117ad98d4e911bb97 | 238 ++ .../64/f0c0e5057d4d001117ad98d4e911bb97 | 311 ++ .../65/7043ca16764d001117ad98d4e911bb97 | 228 ++ .../66/a06067fe7b4d001117ad98d4e911bb97 | 296 ++ .../67/e009c3f5a94c0011135ca7e1c9885acd | 22 - .../69/a0785a011e4d0011135ca7e1c9885acd | 0 .../69/d0f50675324d0011135ca7e1c9885acd | 67 - .../6a/60be6d1b774d001117ad98d4e911bb97 | 249 ++ .../6a/90be0379354d0011135ca7e1c9885acd | 85 - .../6a/e0fa43622f4d0011135ca7e1c9885acd | 44 - .../6b/50a69a65374d0011135ca7e1c9885acd | 108 - .../6d/002d3cdb5c4d001117ad98d4e911bb97 | 217 ++ .../6d/204cb9d82f4d0011135ca7e1c9885acd | 55 - .../6d/40a0f22eaa4c0011135ca7e1c9885acd | 25 - .../6d/b02166c3324d0011135ca7e1c9885acd | 74 - .../6e/704812b5764d001117ad98d4e911bb97 | 239 ++ .../7/501f12b3fd4d00111282df97d7c4d0e2 | 417 ++ .../7/80076b54324d0011135ca7e1c9885acd | 67 - .../7/b0c15931594d001117ad98d4e911bb97 | 204 + .../70/80c01fca354d0011135ca7e1c9885acd | 91 - .../70/f0fb338d764d001117ad98d4e911bb97 | 237 ++ .../71/306d19e8574d001117ad98d4e911bb97 | 192 + .../71/70cdbd08fc4d00111282df97d7c4d0e2 | 408 ++ .../72/80ef576ffb4d00111282df97d7c4d0e2 | 402 ++ .../72/e04cece2774d001117ad98d4e911bb97 | 255 ++ .../73/70ae0a0b5e4d001117ad98d4e911bb97 | 230 ++ .../73/9018c15f874d001117ad98d4e911bb97 | 388 ++ .../73/b087ba94794d001117ad98d4e911bb97 | 281 ++ .../74/902a2127304d0011135ca7e1c9885acd | 59 - .../75/902a41b3794d001117ad98d4e911bb97 | 281 ++ .../76/3007bc09864d001117ad98d4e911bb97 | 374 ++ .../76/3023489d7c4d001117ad98d4e911bb97 | 302 ++ .../76/304f2e47a84c0011135ca7e1c9885acd | 7 - .../76/308d5f11ff4d00111282df97d7c4d0e2 | 437 +++ .../76/90a15fc1a94c0011135ca7e1c9885acd | 14 - .../76/f0155bbd7d4d001117ad98d4e911bb97 | 319 ++ .../77/606dad7c7c4d001117ad98d4e911bb97 | 300 ++ .../77/b06e0bee384d0011135ca7e1c9885acd | 126 - .../78/10c52150324d0011135ca7e1c9885acd | 63 - .../78/901da8f7a94c0011135ca7e1c9885acd | 22 - .../78/d0591155574d001117ad98d4e911bb97 | 186 + .../79/1093f429764d001117ad98d4e911bb97 | 232 ++ .../79/201843157f4d001117ad98d4e911bb97 | 345 ++ .../79/c0797d61334d0011135ca7e1c9885acd | 77 - .../7a/700c6bca584d001117ad98d4e911bb97 | 196 + .../7a/e0aef600fc4d00111282df97d7c4d0e2 | 408 ++ .../7a/e0c9c2fe354d0011135ca7e1c9885acd | 92 - .../7b/908dc6ef774d001117ad98d4e911bb97 | 256 ++ .../7b/c01006151f4d0011135ca7e1c9885acd | 32 - .../7d/10d3ddbe354d0011135ca7e1c9885acd | 90 - .../8/202e0ae85b4d001117ad98d4e911bb97 | 213 + .../8/704d8dd0804d001117ad98d4e911bb97 | 358 ++ .../8/8021abdda94c0011135ca7e1c9885acd | 18 - .../8/a07d29e9574d001117ad98d4e911bb97 | 192 + .../80/40df10af354d0011135ca7e1c9885acd | 88 - .../81/50996eb9584d001117ad98d4e911bb97 | 196 + .../82/30a092198f4c0011135ca7e1c9885acd | 11 - .../82/30d8d284324d0011135ca7e1c9885acd | 69 - .../82/b06d14245a4d001117ad98d4e911bb97 | 218 ++ .../82/c0cc9810394d0011135ca7e1c9885acd | 130 - .../82/d0a1113b5b4d001117ad98d4e911bb97 | 200 + .../83/301f3bfb344d0011135ca7e1c9885acd | 82 - .../83/3082c0757c4d001117ad98d4e911bb97 | 300 ++ .../84/6078c653594d001117ad98d4e911bb97 | 210 + .../86/90914b937d4d001117ad98d4e911bb97 | 318 ++ .../86/c04515591e4d0011135ca7e1c9885acd | 19 - .../87/f003fd11764d001117ad98d4e911bb97 | 228 ++ .../88/a0bdef22774d001117ad98d4e911bb97 | 251 ++ .../89/7039b5ae2f4d0011135ca7e1c9885acd | 54 - .../8a/a059850e874d001117ad98d4e911bb97 | 385 ++ .../8a/e0acef47784d001117ad98d4e911bb97 | 265 ++ .../8b/202f8972334d0011135ca7e1c9885acd | 77 - .../8b/20435a372f4d0011135ca7e1c9885acd | 36 - .../8b/d057f7a57c4d001117ad98d4e911bb97 | 302 ++ .../8c/5059e604304d0011135ca7e1c9885acd | 55 - .../a038bd36574d001117ad98d4e911bb97} | 46 +- .../8d/10b4acbefd4d00111282df97d7c4d0e2 | 421 ++ .../8d/20777285804d001117ad98d4e911bb97 | 354 ++ .../8d/b0caf323784d001117ad98d4e911bb97 | 261 ++ .../8e/c0278903874d001117ad98d4e911bb97 | 385 ++ .../8e/c0fb04fb7b4d001117ad98d4e911bb97 | 296 ++ .../d0f40741574d001117ad98d4e911bb97} | 51 +- .../9/a0eb0f94804d001117ad98d4e911bb97 | 354 ++ .../9/b07c5d4d794d001117ad98d4e911bb97 | 273 ++ .../9/b0adb98f7c4d001117ad98d4e911bb97 | 301 ++ .../9/f09fe899394d0011135ca7e1c9885acd | 134 - .../90/301ef4e2fd4d00111282df97d7c4d0e2 | 426 ++ .../90/604506b6764d001117ad98d4e911bb97 | 239 ++ .../91/400ac96f1e4d0011135ca7e1c9885acd | 24 - .../91/509455cd7b4d001117ad98d4e911bb97 | 292 ++ .../91/b0cc65f27b4d001117ad98d4e911bb97 | 295 ++ .../91/b0d32432764d001117ad98d4e911bb97 | 232 ++ .../92/60198f872f4d0011135ca7e1c9885acd | 48 - .../93/20801486574d001117ad98d4e911bb97 | 187 + .../93/f02274affb4d00111282df97d7c4d0e2 | 405 ++ .../94/70730e55324d0011135ca7e1c9885acd | 67 - .../94/c09467597c4d001117ad98d4e911bb97 | 300 ++ .../95/005505615e4d001117ad98d4e911bb97 | 235 ++ .../95/40f5b996394d0011135ca7e1c9885acd | 133 - .../95/60026996764d001117ad98d4e911bb97 | 238 ++ .../95/d04dec0a5a4d001117ad98d4e911bb97 | 216 ++ .../96/1067edbb7b4d001117ad98d4e911bb97 | 289 ++ .../96/509f2670394d0011135ca7e1c9885acd | 132 - .../97/906ae3e1864d001117ad98d4e911bb97 | 381 ++ .../97/f0cfaa937a4d001117ad98d4e911bb97 | 288 ++ .../98/c0e24a91814d001117ad98d4e911bb97 | 370 ++ .../98/d0fab725764d001117ad98d4e911bb97 | 231 ++ .../99/00d747a7584d001117ad98d4e911bb97 | 192 + .../9a/f04ca058574d001117ad98d4e911bb97 | 187 + .../9b/608ec5a8fd4d00111282df97d7c4d0e2 | 415 ++ .../9b/809e7b322f4d0011135ca7e1c9885acd | 37 - .../9c/8024b776fb4d00111282df97d7c4d0e2 | 402 ++ .../9c/a0af664f784d001117ad98d4e911bb97 | 267 ++ .../9c/d0063f717e4d001117ad98d4e911bb97 | 325 ++ .../9d/30b44c62814d001117ad98d4e911bb97 | 367 ++ .../9d/60b5b235764d001117ad98d4e911bb97 | 232 ++ .../9e/a0672cfb804d001117ad98d4e911bb97 | 366 ++ .../9e/a0afe3437a4d001117ad98d4e911bb97 | 288 ++ .../a0/107553371e4d0011135ca7e1c9885acd | 16 - .../a0/70a76b77fb4d00111282df97d7c4d0e2 | 402 ++ .../a0/a0ee9f5d794d001117ad98d4e911bb97 | 275 ++ .../a1/b0b7f7e8354d0011135ca7e1c9885acd | 91 - .../a1/d033c4cb584d001117ad98d4e911bb97 | 197 + .../a2/d0a7910ffb4d00111282df97d7c4d0e2 | 397 ++ .../4062f45e514d001117ad98d4e911bb97} | 45 +- .../a4/d06318c5a94c0011135ca7e1c9885acd | 16 - .../a5/5059fde2764d001117ad98d4e911bb97 | 241 ++ .../a5/508416ad814d001117ad98d4e911bb97 | 371 ++ .../a5/603da8ee584d001117ad98d4e911bb97 | 197 + .../a5/80cdd584764d001117ad98d4e911bb97 | 237 ++ .../a6/f082faba784d001117ad98d4e911bb97 | 270 ++ .../a7/a01417d4794d001117ad98d4e911bb97 | 283 ++ .../a7/b05fc276a94c0011135ca7e1c9885acd | 12 - .../a8/30e19efa1e4d0011135ca7e1c9885acd | 30 - .../a8/a014b2c37b4d001117ad98d4e911bb97 | 289 ++ .../a8/e08a5293874d001117ad98d4e911bb97 | 388 ++ .../a9/105caa031e4d0011135ca7e1c9885acd | 5 - .../a9/502e6960594d001117ad98d4e911bb97 | 210 + .../aa/c05006351e4d0011135ca7e1c9885acd | 14 - .../aa/c068bd71354d0011135ca7e1c9885acd | 85 - .../ac/d0db81781e4d0011135ca7e1c9885acd | 26 - .../ac/f01b6fc6324d0011135ca7e1c9885acd | 78 - .../ad/700a24cc814d001117ad98d4e911bb97 | 373 ++ .../ae/20bcc8d9364d0011135ca7e1c9885acd | 98 - .../ae/a0c7558e1e4d0011135ca7e1c9885acd | 28 - .../ae/c0df257e804d001117ad98d4e911bb97 | 353 ++ .../af/307c879a324d0011135ca7e1c9885acd | 71 - .../b/9091056f7e4d001117ad98d4e911bb97 | 324 ++ .../b/d027169ffd4d00111282df97d7c4d0e2 | 414 ++ .../b0/a0154147314d0011135ca7e1c9885acd | 59 - .../b0/a032422b7f4d001117ad98d4e911bb97 | 345 ++ .../b1/006d098e794d001117ad98d4e911bb97 | 281 ++ .../b2/40ccf410354d0011135ca7e1c9885acd | 81 - .../b2/60dbd5067f4d001117ad98d4e911bb97 | 340 ++ .../b2/f03ebcd07b4d001117ad98d4e911bb97 | 292 ++ .../b3/8026f497874d001117ad98d4e911bb97 | 390 ++ .../b3/90de2ed2774d001117ad98d4e911bb97 | 253 ++ .../b3/e088ddff5a4d001117ad98d4e911bb97 | 195 + .../b4/2004e3a3374d0011135ca7e1c9885acd | 114 - .../b4/30129ddc804d001117ad98d4e911bb97 | 363 ++ .../b5/70084afa344d0011135ca7e1c9885acd | 81 - .../b5/e0d76a61fe4d00111282df97d7c4d0e2 | 431 +++ .../b6/f0bb64f85b4d001117ad98d4e911bb97 | 218 ++ .../b7/30cb4ab9384d0011135ca7e1c9885acd | 121 - .../b8/6052de592f4d0011135ca7e1c9885acd | 40 - .../b8/70bf12691e4d0011135ca7e1c9885acd | 21 - .../b9/406d42d37e4d001117ad98d4e911bb97 | 331 ++ .../b9/b0ce8fb82f4d0011135ca7e1c9885acd | 54 - .../ba/4080dec77b4d001117ad98d4e911bb97 | 290 ++ .../ba/9040418b5e4d001117ad98d4e911bb97 | 235 ++ .../ba/e028bda0804d001117ad98d4e911bb97 | 355 ++ .../bb/007503241e4d0011135ca7e1c9885acd | 10 - .../bb/60487d22594d001117ad98d4e911bb97 | 201 + .../bc/203da234314d0011135ca7e1c9885acd | 59 - .../bc/60c48dc5794d001117ad98d4e911bb97 | 282 ++ .../bc/a0eea647794d001117ad98d4e911bb97 | 273 ++ .../bc/b0fb6ef6354d0011135ca7e1c9885acd | 92 - .../bd/20eadfba384d0011135ca7e1c9885acd | 122 - .../be/30d58f43784d001117ad98d4e911bb97 | 265 ++ .../be/8004ad075e4d001117ad98d4e911bb97 | 230 ++ .../bf/706659f75b4d001117ad98d4e911bb97 | 216 ++ .../bf/d0001202764d001117ad98d4e911bb97 | 228 ++ .../c0/5009faf9584d001117ad98d4e911bb97 | 201 + .../c0/505e349c314d0011135ca7e1c9885acd | 60 - .../c0/6085b9c7764d001117ad98d4e911bb97 | 241 ++ .../c0/90cca37b2f4d0011135ca7e1c9885acd | 48 - .../c0/f0531afb384d0011135ca7e1c9885acd | 128 - .../c1/501c44aa324d0011135ca7e1c9885acd | 72 - .../c1/600c34831e4d0011135ca7e1c9885acd | 26 - .../c1/b0f50722774d001117ad98d4e911bb97 | 251 ++ .../c2/a0e545d9384d0011135ca7e1c9885acd | 124 - .../c3/50ce1dbca94c0011135ca7e1c9885acd | 14 - .../c3/603cb0c2784d001117ad98d4e911bb97 | 271 ++ .../c3/80a71e2afe4d00111282df97d7c4d0e2 | 429 +++ .../c3/80b938f9764d001117ad98d4e911bb97 | 246 ++ .../c4/9051f9251e4d0011135ca7e1c9885acd | 12 - .../c5/103f63c3804d001117ad98d4e911bb97 | 356 ++ .../c6/00fab5c27e4d001117ad98d4e911bb97 | 330 ++ .../c8/90af0ff8864d001117ad98d4e911bb97 | 382 ++ .../c8/c098b1e7594d001117ad98d4e911bb97 | 214 + .../c9/0046b2b6384d0011135ca7e1c9885acd | 121 - .../c9/f0440658594d001117ad98d4e911bb97 | 210 + .../ca/50f3ed82794d001117ad98d4e911bb97 | 277 ++ .../ca/60fbbc12304d0011135ca7e1c9885acd | 59 - .../ca/c08488a2594d001117ad98d4e911bb97 | 210 + .../ca/d08127f97e4d001117ad98d4e911bb97 | 335 ++ .../cb/e02a8003364d0011135ca7e1c9885acd | 92 - .../cb/e05b733c334d0011135ca7e1c9885acd | 76 - .../cc/70f59fc0354d0011135ca7e1c9885acd | 90 - .../cc/f01161f7374d0011135ca7e1c9885acd | 114 - .../cd/20b02cd2814d001117ad98d4e911bb97 | 373 ++ .../cd/f08de8e1764d001117ad98d4e911bb97 | 241 ++ .../ce/00b59c4a374d0011135ca7e1c9885acd | 107 - .../ce/7014cfdd7e4d001117ad98d4e911bb97 | 334 ++ .../ce/a020f2c4794d001117ad98d4e911bb97 | 282 ++ .../ce/c0ed5a49594d001117ad98d4e911bb97 | 210 + .../cf/301dffd87b4d001117ad98d4e911bb97 | 293 ++ .../cf/90ba5a017d4d001117ad98d4e911bb97 | 307 ++ .../cf/a01fd7d8774d001117ad98d4e911bb97 | 255 ++ .../d/30fd20defb4d00111282df97d7c4d0e2 | 406 ++ .../d/606e191d7e4d001117ad98d4e911bb97 | 322 ++ .../d0/a0deb2a4344d0011135ca7e1c9885acd | 80 - .../d1/401839a5794d001117ad98d4e911bb97 | 281 ++ .../d1/60cbf7405b4d001117ad98d4e911bb97 | 202 + .../d2/00c04c0a3a4d0011135ca7e1c9885acd | 137 - .../d2/40b810ea764d001117ad98d4e911bb97 | 243 ++ .../d2/5021b4c4394d0011135ca7e1c9885acd | 134 - .../d3/1086319c5b4d001117ad98d4e911bb97 | 212 + .../d3/e0040337ff4d00111282df97d7c4d0e2 | 438 +++ .../d4/002684402f4d0011135ca7e1c9885acd | 36 - .../d4/20fc4e7bfb4d00111282df97d7c4d0e2 | 403 ++ .../d5/00259d007f4d001117ad98d4e911bb97 | 338 ++ .../d5/404e44ab324d0011135ca7e1c9885acd | 72 - .../d5/c030968e864d001117ad98d4e911bb97 | 377 ++ .../d5/c04b8a237e4d001117ad98d4e911bb97 | 323 ++ .../d5/c09ebc84fb4d00111282df97d7c4d0e2 | 405 ++ .../d7/10c828e95c4d001117ad98d4e911bb97 | 221 ++ .../d7/30fc1da4354d0011135ca7e1c9885acd | 86 - .../d8/80ed6fd52f4d0011135ca7e1c9885acd | 54 - .../d9/30fb53fd834d001117ad98d4e911bb97 | 374 ++ .../d9/9074038c5d4d001117ad98d4e911bb97 | 225 ++ .../d9/e0b72a69a84c0011135ca7e1c9885acd | 7 - .../da/10811de0a94c0011135ca7e1c9885acd | 18 - .../da/908b1c2eaa4c0011135ca7e1c9885acd | 24 - .../da/90fd1cfafb4d00111282df97d7c4d0e2 | 408 ++ .../da/c017ad9e374d0011135ca7e1c9885acd | 114 - .../db/a096ef26594d001117ad98d4e911bb97 | 203 + .../dc/50fce311374d0011135ca7e1c9885acd | 101 - .../de/90bc596a594d001117ad98d4e911bb97 | 210 + .../de/d0d81ce2804d001117ad98d4e911bb97 | 364 ++ .../de/e0f7a0da2f4d0011135ca7e1c9885acd | 55 - .../df/0040967f7d4d001117ad98d4e911bb97 | 315 ++ .../df/20c27ace754d001117ad98d4e911bb97 | 228 ++ .../df/70f187997d4d001117ad98d4e911bb97 | 318 ++ .../df/80ab8c475b4d001117ad98d4e911bb97 | 202 + .../e/507ab028764d001117ad98d4e911bb97 | 231 ++ .../e/f01b0ddc384d0011135ca7e1c9885acd | 126 - .../e/f0675cc2344d0011135ca7e1c9885acd | 81 - .../e0/808f90b0374d0011135ca7e1c9885acd | 113 - .../e0/b02052d1574d001117ad98d4e911bb97 | 193 + .../e1/302c0c891e4d0011135ca7e1c9885acd | 27 - .../e1/3045076b5a4d001117ad98d4e911bb97 | 220 ++ .../e1/e02939a4784d001117ad98d4e911bb97 | 268 ++ .../e2/603ac3da864d001117ad98d4e911bb97 | 380 ++ .../e3/609cff06304d0011135ca7e1c9885acd | 57 - .../e3/a0ea685f804d001117ad98d4e911bb97 | 350 ++ .../e4/205450e8354d0011135ca7e1c9885acd | 91 - .../e6/00af1de57b4d001117ad98d4e911bb97 | 294 ++ .../e7/3013d1131f4d0011135ca7e1c9885acd | 31 - .../e8/a049ab1c864d001117ad98d4e911bb97 | 374 ++ .../e9/00e6be175d4d001117ad98d4e911bb97 | 223 ++ .../e9/300b1d78fd4d00111282df97d7c4d0e2 | 414 ++ .../e9/309be5ff864d001117ad98d4e911bb97 | 384 ++ .../e9/a02e45213a4d0011135ca7e1c9885acd | 140 - .../ea/e07c0cdc7e4d001117ad98d4e911bb97 | 333 ++ .../ea/f096c870814d001117ad98d4e911bb97 | 368 ++ .../eb/20c46eea314d0011135ca7e1c9885acd | 62 - .../eb/30d88b7f5b4d001117ad98d4e911bb97 | 203 + .../eb/507c0e3f374d0011135ca7e1c9885acd | 103 - .../eb/70e27a56374d0011135ca7e1c9885acd | 107 - .../eb/a07c186e354d0011135ca7e1c9885acd | 85 - .../ec/009a9879814d001117ad98d4e911bb97 | 368 ++ .../ed/00c5c70e334d0011135ca7e1c9885acd | 76 - .../ee/204e902f1e4d0011135ca7e1c9885acd | 12 - .../ee/4089760ffc4d00111282df97d7c4d0e2 | 409 ++ .../ef/503adbbcfb4d00111282df97d7c4d0e2 | 406 ++ .../ef/903f2035594d001117ad98d4e911bb97 | 205 + .../f/2005b9768e4c0011135ca7e1c9885acd | 5 - .../f1/d02671bdfd4d00111282df97d7c4d0e2 | 419 ++ .../f2/90903d197a4d001117ad98d4e911bb97 | 285 ++ .../f2/a0e404d4574d001117ad98d4e911bb97 | 191 + .../f2/b08e7deb764d001117ad98d4e911bb97 | 243 ++ .../f2/e087f723ff4d00111282df97d7c4d0e2 | 438 +++ .../f3/107ecf8a814d001117ad98d4e911bb97 | 369 ++ .../f3/c0601a52324d0011135ca7e1c9885acd | 67 - .../f4/20ff08f2594d001117ad98d4e911bb97 | 215 ++ .../f5/50cfaf89574d001117ad98d4e911bb97 | 191 + .../f6/30d4ee8d394d0011135ca7e1c9885acd | 133 - .../f6/8088a1e67e4d001117ad98d4e911bb97 | 334 ++ .../f6/a0dcbb267e4d001117ad98d4e911bb97 | 323 ++ .../f8/306865ce2f4d0011135ca7e1c9885acd | 54 - .../f8/609ab05b7c4d001117ad98d4e911bb97 | 300 ++ .../f9/50697e5a374d0011135ca7e1c9885acd | 108 - .../f9/b0f2ebff584d001117ad98d4e911bb97 | 201 + .../f9/f0cf52385b4d001117ad98d4e911bb97 | 200 + .../fa/802595e85a4d001117ad98d4e911bb97 | 221 ++ .../fa/c0e9e8207a4d001117ad98d4e911bb97 | 285 ++ .../fb/0056d117304d0011135ca7e1c9885acd | 59 - .../fb/00e45c525e4d001117ad98d4e911bb97 | 235 ++ .../fc/70397e4f2f4d0011135ca7e1c9885acd | 40 - .../fc/b08ee6f47c4d001117ad98d4e911bb97 | 307 ++ .../fd/b09e96bb324d0011135ca7e1c9885acd | 74 - .../fe/c09ab21d764d001117ad98d4e911bb97 | 228 ++ .../ff/a0c1cb17394d0011135ca7e1c9885acd | 132 - .../ff/f091830aff4d00111282df97d7c4d0e2 | 437 +++ .../asdl/.indexes/e4/96/d8/history.index | Bin 3848 -> 3224 bytes .../asdl/.indexes/e4/9e/1d/history.index | Bin 5137 -> 1249 bytes .../.projects/asdl/.markers | Bin 510 -> 6051 bytes .../.projects/asdl/.markers.snap | Bin 144602 -> 211420 bytes .../.root/.markers.snap | Bin 587 -> 560 bytes .../org.eclipse.core.resources/.root/2.tree | Bin 5433 -> 0 bytes .../org.eclipse.core.resources/.root/3.tree | Bin 0 -> 6275 bytes .../.safetable/org.eclipse.core.resources | Bin 1345 -> 1756 bytes .../org.eclipse.core.resources/2.snap | Bin 12752 -> 0 bytes .../org.eclipse.core.resources/3.snap | Bin 0 -> 18047 bytes .../.settings/org.eclipse.jdt.ui.prefs | 2 + .../org.eclipse.e4.workbench/workbench.xmi | 3428 ++++++++--------- .../org.eclipse.jdt.core/1865797976.index | Bin 2872783 -> 2873062 bytes .../org.eclipse.jdt.core/2876837992.index | Bin 32007 -> 34294 bytes .../org.eclipse.jdt.ui/dialog_settings.xml | 14 + .../org.eclipse.jdt.ui/jdt-images/0.png | Bin 703 -> 1238 bytes .../org.eclipse.jdt.ui/jdt-images/1.png | Bin 857 -> 291 bytes .../org.eclipse.jdt.ui/jdt-images/10.png | Bin 418 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/2.png | Bin 1238 -> 548 bytes .../org.eclipse.jdt.ui/jdt-images/3.png | Bin 708 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/4.png | Bin 1195 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/5.png | Bin 291 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/6.png | Bin 1429 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/7.png | Bin 548 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/8.png | Bin 992 -> 0 bytes .../org.eclipse.jdt.ui/jdt-images/9.png | Bin 1265 -> 0 bytes .../.plugins/org.eclipse.m2e.logback/0.log | 2 + .../EBWebView/Crashpad/settings.dat | Bin 288 -> 288 bytes .../EBWebView/Default/BrowsingTopicsState | 2 +- .../EBWebView/Default/Cache/Cache_Data/data_0 | Bin 45056 -> 45056 bytes .../EBWebView/Default/Cache/Cache_Data/data_1 | Bin 270336 -> 270336 bytes .../EBWebView/Default/Cache/Cache_Data/data_3 | Bin 4202496 -> 4202496 bytes .../Cache/Cache_Data/{f_000004 => f_000006} | 2 +- .../Code Cache/js/index-dir/the-real-index | Bin 72 -> 72 bytes .../org.eclipse.swt/EBWebView/Default/DIPS | Bin 36864 -> 36864 bytes .../EBWebView/Default/DIPS-wal | Bin 32 -> 74192 bytes .../Default/DawnGraphiteCache/data_1 | Bin 270336 -> 270336 bytes .../EBWebView/Default/DawnWebGPUCache/data_1 | Bin 270336 -> 270336 bytes .../EBWebView/Default/Extension State/LOG.old | 6 +- .../EBWebView/Default/GPUCache/data_1 | Bin 270336 -> 270336 bytes .../org.eclipse.swt/EBWebView/Default/History | Bin 327680 -> 393216 bytes .../Default/Local Storage/leveldb/000003.log | Bin 87 -> 106 bytes .../Default/Local Storage/leveldb/LOG | 3 - .../Default/Local Storage/leveldb/LOG.old | 6 +- .../Default/Network/TransportSecurity | 2 +- .../EBWebView/Default/Preferences | 2 +- .../EBWebView/Default/Secure Preferences | 2 +- .../Default/Session Storage/000003.log | Bin 1682 -> 2502 bytes .../EBWebView/Default/Session Storage/LOG | 3 - .../EBWebView/Default/Session Storage/LOG.old | 6 +- .../Site Characteristics Database/000003.log | Bin 112 -> 184 bytes .../Site Characteristics Database/LOG.old | 6 +- .../Default/Sync Data/LevelDB/LOG.old | 6 +- .../EBWebView/Default/Top Sites | Bin 20480 -> 20480 bytes .../Default/favorites_diagnostic.log | 2 + .../Default/shared_proto_db/000003.log | Bin 4453 -> 4719 bytes .../EBWebView/Default/shared_proto_db/LOG.old | 6 +- .../shared_proto_db/metadata/000003.log | Bin 852 -> 920 bytes .../Default/shared_proto_db/metadata/LOG.old | 6 +- .../EBWebView/GrShaderCache/data_0 | Bin 45056 -> 45056 bytes .../EBWebView/GrShaderCache/data_1 | Bin 270336 -> 270336 bytes .../EBWebView/GrShaderCache/data_3 | Bin 4202496 -> 4202496 bytes .../EBWebView/GraphiteDawnCache/data_1 | Bin 270336 -> 270336 bytes .../org.eclipse.swt/EBWebView/Local State | 2 +- .../EBWebView/ShaderCache/data_1 | Bin 270336 -> 270336 bytes .../EBWebView/SmartScreen/local/uriCache_ | 2 +- .../org.eclipse.swt/EBWebView/Variations | 2 +- .metadata/version.ini | 2 +- .../MyLinkedList$MyLinkedListIterator.class | Bin 0 -> 3777 bytes .../list/mylinkedlist/MyLinkedList$Node.class | Bin 967 -> 967 bytes asdl/bin/list/mylinkedlist/MyLinkedList.class | Bin 6738 -> 8465 bytes asdl/src/list/mylinkedlist/MyLinkedList.java | 322 ++ 596 files changed, 100235 insertions(+), 13951 deletions(-) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/506478077c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/f08464e1364d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1/20722979fd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/11/40104dac754d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/11/a0a17875a94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/12/4056f154794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/1008b20d5b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/2024ff882f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/40a97f1b364d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/13/c0b854a3354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/20c737b9324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/50a33ded784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/d04502475b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/15/0009df8d764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/15/e0b9f10afb4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/16/40767bf61e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/16/9011665d874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/20b9c8ddfd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/40b22efa764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1b/3063929c394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1b/80da122b594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/90aa9917384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1c/e0b0cc478e4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1d/00b82720fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1d/90e90f4b814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1e/406f9e107f4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1e/5076a02b1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/1f/d009d1e07e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2/a0f255c8594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/20/e0591369594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/21/9096dee0fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/22/302633ba764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/22/804feb72374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/23/50874d9b5e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/24/a07c963e784d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/25/7093adeb364d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/25/8073d745314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/0069b83a814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/40665d03aa4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/26/b09ad2cf594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/60ac05aa354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/90bc5f635a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/a0fa92045b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/d0b5b782314d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/29/306179641e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/29/40140044594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2a/4078db2e7a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2a/9081abb57e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2b/009d006b2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2b/a0823937594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2b/f0bf9dca7e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2c/908c974b334d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/401ce2e9784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/502ec652784d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/a00f7051354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2d/b0b57503594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2e/604ff500384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/20c41a307c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/40e6fba1874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/e0fb2b165b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2f/f0f735ee764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/706178ea7b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/a0dd3419304d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3/d00b22df324d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/30/f081edd52f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/3019efdd764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/5021a0f7384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/a079cbd0594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/e0852927aa4c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/e09a142e2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/31/f0b898c0764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/32/b0a924c5764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/33/9006da815e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/33/b0ecb5b67e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/33/d0662990794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/208a9ecdfd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/40483466794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/702de21dfe4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/34/f09218291e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/600e04139f4c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/90392959374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/35/a0048f3b5a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/36/705091945b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/36/908d1035a84c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/36/c082b4c4764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/37/30fe89b7814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/37/b0a1ebe6fe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/2003b3e4774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/30df62ef764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/505233b7374d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/38/6015615c1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/0068e6885b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/80bbd1b35d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/90f4027a814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/d01a358c7c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/00c71b815b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/403df5a8764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/406036f4764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3a/905aa1cbfd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3b/30736f9f804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3b/609f941d5e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3b/805ee151764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3b/d023eb9c344d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/10dd6882324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/206bbf40fc4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/309060ab2f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/709479b22f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3c/805f50da324d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3e/90898c119f4c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3e/a0183c26aa4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/3f/90badac87b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/b034c1e3a94c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/40/c0d0bd0c1e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/50cddb2d8f4c0011135ca7e1c9885acd rename .metadata/.plugins/org.eclipse.core.resources/.history/{1c/504dba233a4d0011135ca7e1c9885acd => 42/50ef654f574d001117ad98d4e911bb97} (70%) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/6029c9127d4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/60a9a477a94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/801890d5574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/80d89bf3774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/d0b42ef87c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/42/e0cbea023a4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/43/10b441b1584d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/44/a04603031e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/44/f0005c81324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/45/e05f32507f4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/45/e08b33a77d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/46/80b1c7d6804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/46/9009d050fa4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/47/c011bffa7e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/0075ba535a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/30deeb827e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/48/5019b48d324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/49/30ac4aba7e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/49/70bda109ff4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/49/d05f54f2344d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/49/f06a35857c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4a/801f58a5594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4a/90995109aa4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4a/a09dc134814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4a/b0fad96dfe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/00ef1087fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/4096a4f5764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/70645260794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/801e556f394d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/8045cd9a374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4b/c0dc092bfc4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4c/d0bc35095d4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4d/c0880dc5354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/0006cd1a814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/10000be77b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/506489f1584d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/60f31582384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/903e85f25a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/9083c736304d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/d0ccc04afd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/e088d0d9794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/4f/f05965a1374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/10efa127fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/30338771594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/307a86ee7c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/504e5a3b814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/d00d46ae384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5/e0a2e6bc754d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/50/60160ff55d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/50/60c2b7b97b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/50/703706531e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/52/20cb337d1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/54/009c5fde7b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/54/109ff16f594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/54/a0de835e7c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/54/d03231a7394d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/a069e620364d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/55/d0ac5eeefe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/00ccfe8f874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/506ddabe594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/70d4e419774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/b0e86572804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/56/f0c2aadb804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/10a5470e1e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/207d929e324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/70762361814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/57/b0f539ae814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5a/00dcb9c1584d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5a/603b700d1f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5c/e09d79f1fd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/40636b107d4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5e/e02bd5b0324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5f/a0b241097c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/70690d547a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/f03c9e905e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/10fddfda794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/40d39f327a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/80cc47ab394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/a064d590814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/f0b27634764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/61/a0b004fb5a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/30a390b9fb4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/d08425b4314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/63/10a2818c594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/63/40d1df262f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/63/501b8f83374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/63/80b84ffa5a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/20e64bf5fe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/30067cc7814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/7099dc457a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/e0b91ffd854d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/f02cfc58754d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/f0c0e5057d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/65/7043ca16764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/66/a06067fe7b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/67/e009c3f5a94c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/69/a0785a011e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/69/d0f50675324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6a/60be6d1b774d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6a/90be0379354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6a/e0fa43622f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6b/50a69a65374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/002d3cdb5c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/204cb9d82f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/40a0f22eaa4c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6d/b02166c3324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/704812b5764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7/501f12b3fd4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7/80076b54324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7/b0c15931594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/70/80c01fca354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/70/f0fb338d764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/71/306d19e8574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/71/70cdbd08fc4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/72/80ef576ffb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/72/e04cece2774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/70ae0a0b5e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/9018c15f874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/b087ba94794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/74/902a2127304d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/75/902a41b3794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/3007bc09864d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/3023489d7c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/304f2e47a84c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/308d5f11ff4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/90a15fc1a94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/76/f0155bbd7d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/77/606dad7c7c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/77/b06e0bee384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/78/10c52150324d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/78/901da8f7a94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/78/d0591155574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/1093f429764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/201843157f4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/79/c0797d61334d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/700c6bca584d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/e0aef600fc4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7a/e0c9c2fe354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7b/908dc6ef774d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7b/c01006151f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/7d/10d3ddbe354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8/202e0ae85b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8/704d8dd0804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8/8021abdda94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8/a07d29e9574d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/80/40df10af354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/81/50996eb9584d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/30a092198f4c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/30d8d284324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/b06d14245a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/c0cc9810394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/82/d0a1113b5b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/301f3bfb344d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/3082c0757c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/84/6078c653594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/86/90914b937d4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/86/c04515591e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/87/f003fd11764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/88/a0bdef22774d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/89/7039b5ae2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8a/a059850e874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8a/e0acef47784d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/202f8972334d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/20435a372f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/d057f7a57c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8c/5059e604304d0011135ca7e1c9885acd rename .metadata/.plugins/org.eclipse.core.resources/.history/{2e/600dc8273a4d0011135ca7e1c9885acd => 8c/a038bd36574d001117ad98d4e911bb97} (72%) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/10b4acbefd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/20777285804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/b0caf323784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8e/c0278903874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8e/c0fb04fb7b4d001117ad98d4e911bb97 rename .metadata/.plugins/org.eclipse.core.resources/.history/{41/e092d7263a4d0011135ca7e1c9885acd => 8e/d0f40741574d001117ad98d4e911bb97} (70%) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/a0eb0f94804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/b07c5d4d794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/b0adb98f7c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/f09fe899394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/90/301ef4e2fd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/90/604506b6764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/400ac96f1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/509455cd7b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/b0cc65f27b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/91/b0d32432764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/92/60198f872f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/93/20801486574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/93/f02274affb4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/94/70730e55324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/94/c09467597c4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/005505615e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/40f5b996394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/60026996764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/d04dec0a5a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/96/1067edbb7b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/96/509f2670394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/906ae3e1864d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/f0cfaa937a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/98/c0e24a91814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/98/d0fab725764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/99/00d747a7584d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9a/f04ca058574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/608ec5a8fd4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/809e7b322f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9c/8024b776fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9c/a0af664f784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9c/d0063f717e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9d/30b44c62814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9d/60b5b235764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/a0672cfb804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9e/a0afe3437a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a0/107553371e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a0/70a76b77fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a0/a0ee9f5d794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a1/b0b7f7e8354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a1/d033c4cb584d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a2/d0a7910ffb4d00111282df97d7c4d0e2 rename .metadata/.plugins/org.eclipse.core.resources/.history/{15/d05528283a4d0011135ca7e1c9885acd => a3/4062f45e514d001117ad98d4e911bb97} (72%) delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a4/d06318c5a94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a5/5059fde2764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a5/508416ad814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a5/603da8ee584d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a5/80cdd584764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a6/f082faba784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a7/a01417d4794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a7/b05fc276a94c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a8/30e19efa1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a8/a014b2c37b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a8/e08a5293874d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a9/105caa031e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a9/502e6960594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/aa/c05006351e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/aa/c068bd71354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ac/d0db81781e4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ac/f01b6fc6324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/700a24cc814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/20bcc8d9364d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/a0c7558e1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ae/c0df257e804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/af/307c879a324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b/9091056f7e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b/d027169ffd4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b0/a0154147314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b0/a032422b7f4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b1/006d098e794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/40ccf410354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/60dbd5067f4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b2/f03ebcd07b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/8026f497874d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/90de2ed2774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/e088ddff5a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b4/2004e3a3374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b4/30129ddc804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b5/70084afa344d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b5/e0d76a61fe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b6/f0bb64f85b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b7/30cb4ab9384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b8/6052de592f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b8/70bf12691e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b9/406d42d37e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b9/b0ce8fb82f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ba/4080dec77b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ba/9040418b5e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ba/e028bda0804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bb/007503241e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bb/60487d22594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/203da234314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/60c48dc5794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/a0eea647794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bc/b0fb6ef6354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bd/20eadfba384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/be/30d58f43784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/be/8004ad075e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bf/706659f75b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/bf/d0001202764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/5009faf9584d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/505e349c314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/6085b9c7764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/90cca37b2f4d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c0/f0531afb384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/501c44aa324d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/600c34831e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c1/b0f50722774d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c2/a0e545d9384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/50ce1dbca94c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/603cb0c2784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/80a71e2afe4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c3/80b938f9764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c4/9051f9251e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c5/103f63c3804d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c6/00fab5c27e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c8/90af0ff8864d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c8/c098b1e7594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c9/0046b2b6384d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c9/f0440658594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/50f3ed82794d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/60fbbc12304d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/c08488a2594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ca/d08127f97e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cb/e02a8003364d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cb/e05b733c334d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cc/70f59fc0354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cc/f01161f7374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cd/20b02cd2814d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cd/f08de8e1764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/00b59c4a374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/7014cfdd7e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/a020f2c4794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ed5a49594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cf/301dffd87b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cf/90ba5a017d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cf/a01fd7d8774d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d/30fd20defb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d/606e191d7e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d0/a0deb2a4344d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d1/401839a5794d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d1/60cbf7405b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d2/00c04c0a3a4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d2/40b810ea764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d2/5021b4c4394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d3/1086319c5b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d3/e0040337ff4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d4/002684402f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d4/20fc4e7bfb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/00259d007f4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/404e44ab324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/c030968e864d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/c04b8a237e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d5/c09ebc84fb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d7/10c828e95c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d7/30fc1da4354d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d8/80ed6fd52f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d9/30fb53fd834d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d9/9074038c5d4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d9/e0b72a69a84c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/10811de0a94c0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/908b1c2eaa4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/90fd1cfafb4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/da/c017ad9e374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/db/a096ef26594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/dc/50fce311374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/de/90bc596a594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/de/d0d81ce2804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/de/e0f7a0da2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/0040967f7d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/20c27ace754d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/70f187997d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/df/80ab8c475b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e/507ab028764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e/f01b0ddc384d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e/f0675cc2344d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e0/808f90b0374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e0/b02052d1574d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e1/302c0c891e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e1/3045076b5a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e1/e02939a4784d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e2/603ac3da864d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e3/609cff06304d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e3/a0ea685f804d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e4/205450e8354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e6/00af1de57b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e7/3013d1131f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e8/a049ab1c864d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/00e6be175d4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/300b1d78fd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/309be5ff864d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/e9/a02e45213a4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ea/e07c0cdc7e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ea/f096c870814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/20c46eea314d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/30d88b7f5b4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/507c0e3f374d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/70e27a56374d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/eb/a07c186e354d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ec/009a9879814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ed/00c5c70e334d0011135ca7e1c9885acd delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/204e902f1e4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ee/4089760ffc4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/503adbbcfb4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ef/903f2035594d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f/2005b9768e4c0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/d02671bdfd4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f2/90903d197a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f2/a0e404d4574d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f2/b08e7deb764d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f2/e087f723ff4d00111282df97d7c4d0e2 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f3/107ecf8a814d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f3/c0601a52324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f4/20ff08f2594d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f5/50cfaf89574d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f6/30d4ee8d394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f6/8088a1e67e4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f6/a0dcbb267e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f8/306865ce2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f8/609ab05b7c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f9/50697e5a374d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f9/b0f2ebff584d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f9/f0cf52385b4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fa/802595e85a4d001117ad98d4e911bb97 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fa/c0e9e8207a4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fb/0056d117304d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fb/00e45c525e4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fc/70397e4f2f4d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fc/b08ee6f47c4d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fd/b09e96bb324d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/fe/c09ab21d764d001117ad98d4e911bb97 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/a0c1cb17394d0011135ca7e1c9885acd create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/f091830aff4d00111282df97d7c4d0e2 delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/2.tree create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/3.tree delete mode 100644 .metadata/.plugins/org.eclipse.core.resources/2.snap create mode 100644 .metadata/.plugins/org.eclipse.core.resources/3.snap delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/5.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/7.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png delete mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png rename .metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/{f_000004 => f_000006} (85%) create mode 100644 asdl/bin/list/mylinkedlist/MyLinkedList$MyLinkedListIterator.class diff --git a/.metadata/.lock_info b/.metadata/.lock_info index 694992f..0482fcb 100644 --- a/.metadata/.lock_info +++ b/.metadata/.lock_info @@ -1,4 +1,4 @@ -#Sun May 10 18:29:39 CEST 2026 +#Tue May 12 13:59:16 CEST 2026 host=DESKTOP-ALBQHEK -process-id=13748 +process-id=5624 user=eslusarz diff --git a/.metadata/.log b/.metadata/.log index d965545..0c4da35 100644 --- a/.metadata/.log +++ b/.metadata/.log @@ -712,3 +712,182 @@ user global configuration and to define the default location to store repositori not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and EGit might behave differently since they see different configuration options. This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. +!SESSION 2026-05-11 17:50:40.634 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.10 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-05-11 17:51:16.095 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY ch.qos.logback.classic 1 0 2026-05-11 17:51:21.877 +!MESSAGE Logback config file: C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.m2e.logback\logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2026-05-11 17:51:24.468 +!MESSAGE Unable to load class 'org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler' from bundle '147' +!STACK 0 +java.lang.ClassNotFoundException: org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler cannot be found by org.eclipse.e4.ui.workbench.renderers.swt_0.17.0.v20260131-0926 + at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:570) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:564) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:439) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:195) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:663) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:88) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:59) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:37) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:276) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:603) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + +!ENTRY org.eclipse.egit.ui 2 0 2026-05-11 17:51:48.540 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'C:\Users\eslusarz'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. + +!ENTRY org.eclipse.jdt.ui 4 2 2026-05-11 22:27:29.855 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jdt.ui". +!STACK 0 +java.lang.NullPointerException: Cannot invoke "org.eclipse.jdt.core.dom.CompilationUnit.getModule()" because "astRoot" is null + at org.eclipse.jdt.internal.ui.text.correction.proposals.AddModuleRequiresCorrectionProposalCore.createAddRequiresChange(AddModuleRequiresCorrectionProposalCore.java:87) + at org.eclipse.jdt.internal.ui.text.correction.proposals.AddModuleRequiresCorrectionProposalCore.createChange(AddModuleRequiresCorrectionProposalCore.java:73) + at org.eclipse.jdt.core.manipulation.ChangeCorrectionProposalCore.getChange(ChangeCorrectionProposalCore.java:153) + at org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsBaseSubProcessor.getCompositeChangeProposal(UnresolvedElementsBaseSubProcessor.java:1080) + at org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsBaseSubProcessor.getCompositeChangeProposal(UnresolvedElementsBaseSubProcessor.java:1072) + at org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsBaseSubProcessor.addSimilarTypeProposals(UnresolvedElementsBaseSubProcessor.java:1037) + at org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsBaseSubProcessor.collectTypeProposals(UnresolvedElementsBaseSubProcessor.java:791) + at org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsSubProcessor.getTypeProposals(UnresolvedElementsSubProcessor.java:143) + at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.process(QuickFixProcessor.java:450) + at org.eclipse.jdt.internal.ui.text.correction.QuickFixProcessor.getCorrections(QuickFixProcessor.java:370) + at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionCollector.safeRun(JavaCorrectionProcessor.java:381) + at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionProcessorAccess.run(JavaCorrectionProcessor.java:341) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:47) + at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor$SafeCorrectionProcessorAccess.process(JavaCorrectionProcessor.java:336) + at org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor.collectCorrections(JavaCorrectionProcessor.java:465) + at org.eclipse.jdt.internal.ui.text.java.hover.ProblemHover$ProblemInfo.getJavaAnnotationFixes(ProblemHover.java:115) + at org.eclipse.jdt.internal.ui.text.java.hover.ProblemHover$ProblemInfo.computeCompletionProposals(ProblemHover.java:89) + at org.eclipse.jdt.internal.ui.text.java.hover.ProblemHover$ProblemInfo.(ProblemHover.java:74) + at org.eclipse.jdt.internal.ui.text.java.hover.ProblemHover.createAnnotationInfo(ProblemHover.java:178) + at org.eclipse.jdt.internal.ui.text.java.hover.AbstractAnnotationHover.getHoverInfo2(AbstractAnnotationHover.java:957) + at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:165) + at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:131) + at org.eclipse.jdt.internal.ui.text.java.hover.JavaEditorTextHoverProxy.getHoverInfo2(JavaEditorTextHoverProxy.java:89) + at org.eclipse.jface.text.TextViewerHoverManager$1.run(TextViewerHoverManager.java:155) + +!ENTRY org.eclipse.jdt.ui 4 10001 2026-05-11 22:30:29.246 +!MESSAGE Internal Error +!STACK 1 +Java Model Exception: Error in Java Model (code 969): MyLinkedListIterator [in [Working copy] MyLinkedList.java [in list.mylinkedlist [in src [in asdl]]]] does not exist + at org.eclipse.jdt.internal.core.JavaElement.newNotPresentException(JavaElement.java:548) + at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:591) + at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:294) + at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:280) + at org.eclipse.jdt.internal.core.SourceRefElement.getSourceRange(SourceRefElement.java:258) + at org.eclipse.jdt.internal.core.Member.getJavadocRange(Member.java:322) + at org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess.getHTMLContentFromSource(CoreJavadocAccess.java:359) + at org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess.getHTMLContent(CoreJavadocAccess.java:229) + at org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2.getHTMLContent(JavadocContentAccess2.java:49) + at org.eclipse.jdt.internal.ui.text.java.hover.AbstractAnnotationHover$AnnotationInformationControl.createJavadocProposal(AbstractAnnotationHover.java:365) + at org.eclipse.jdt.internal.ui.text.java.hover.AbstractAnnotationHover$AnnotationInformationControl.deferredCreateContent(AbstractAnnotationHover.java:336) + at org.eclipse.jdt.internal.ui.text.java.hover.AbstractAnnotationHover$AnnotationInformationControl.setInput(AbstractAnnotationHover.java:204) + at org.eclipse.jface.text.AbstractInformationControlManager.internalShowInformationControl(AbstractInformationControlManager.java:1178) + at org.eclipse.jface.text.AbstractInformationControlManager.presentInformation(AbstractInformationControlManager.java:1147) + at org.eclipse.jface.text.AbstractHoverInformationControlManager.presentInformation(AbstractHoverInformationControlManager.java:903) + at org.eclipse.jface.text.TextViewerHoverManager.doPresentInformation(TextViewerHoverManager.java:242) + at org.eclipse.jface.text.TextViewerHoverManager.lambda$3(TextViewerHoverManager.java:232) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:132) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4122) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3738) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1051) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:684) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) +!SUBENTRY 1 org.eclipse.jdt.core 4 969 2026-05-11 22:30:29.248 +!MESSAGE MyLinkedListIterator [in [Working copy] MyLinkedList.java [in list.mylinkedlist [in src [in asdl]]]] does not exist +!SESSION 2026-05-12 13:58:49.453 ----------------------------------------------- +eclipse.buildId=4.39.0.20260305-0817 +java.version=21.0.10 +java.vendor=Eclipse Adoptium +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY ch.qos.logback.classic 1 0 2026-05-12 13:59:13.439 +!MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. + +!ENTRY org.eclipse.core.resources 2 10035 2026-05-12 13:59:16.479 +!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes. + +!ENTRY ch.qos.logback.classic 1 0 2026-05-12 13:59:17.756 +!MESSAGE Logback config file: C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.m2e.logback\logback.2.7.101.20251017-1242.xml + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2026-05-12 13:59:19.267 +!MESSAGE Unable to load class 'org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler' from bundle '147' +!STACK 0 +java.lang.ClassNotFoundException: org.eclipse.e4.ui.workbench.renderers.swt.cocoa.CocoaUIHandler cannot be found by org.eclipse.e4.ui.workbench.renderers.swt_0.17.0.v20260131-0926 + at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:570) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:564) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:439) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:195) + at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:663) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:88) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:59) + at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:37) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:276) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:603) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:583) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:173) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:185) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:219) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:149) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:115) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:467) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:298) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:615) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:563) + at org.eclipse.equinox.launcher.Main.run(Main.java:1415) + +!ENTRY org.eclipse.egit.ui 2 0 2026-05-12 13:59:35.401 +!MESSAGE Warning: The environment variable HOME is not set. The following directory will be used to store the Git +user global configuration and to define the default location to store repositories: 'C:\Users\eslusarz'. If this is +not correct please set the HOME environment variable and restart Eclipse. Otherwise Git for Windows and +EGit might behave differently since they see different configuration options. +This warning can be switched off on the Team > Git > Confirmations and Warnings preference page. diff --git a/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json index 4be6b3d..786b7e2 100644 --- a/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json +++ b/.metadata/.plugins/org.eclipse.buildship.core/gradle/versions.json @@ -1,7 +1,7 @@ [ { - "version" : "9.6.0-20260502004807+0000", - "buildTime" : "20260502004807+0000", - "commitId" : "b6e68b2bcae07ceceb366b4d0a900e4e93ba4c1d", + "version" : "9.6.0-20260511004857+0000", + "buildTime" : "20260511004857+0000", + "commitId" : "d21d434e616b55c833aa59b433adf393010f40d8", "current" : false, "snapshot" : true, "nightly" : true, @@ -10,11 +10,62 @@ "rcFor" : "", "milestoneFor" : "", "broken" : false, - "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260502004807+0000-bin.zip", - "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260502004807+0000-bin.zip.sha256", - "checksum" : "85e34aa0a33686cfac1fb2e0ca79c6e4929be140ec8dae7956fb6b84241270b5", - "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260502004807+0000-wrapper.jar.sha256", + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260511004857+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260511004857+0000-bin.zip.sha256", + "checksum" : "6c9696b888885a574308bdead2ef69761b6fac15b21ad5f0d58d26088fda1a9c", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.6.0-20260511004857+0000-wrapper.jar.sha256", "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" +}, { + "version" : "9.6.0-milestone-2", + "buildTime" : "20260510110612+0000", + "commitId" : "62000451ad7b25de53fa89a155ef8ecb401621bb", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "9.6.0", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-9.6.0-milestone-2-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-9.6.0-milestone-2-bin.zip.sha256", + "checksum" : "a67385a5e8acaed7840b5114feb76e455f6e3567e02d4414726f6fd1179753a9", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-9.6.0-milestone-2-wrapper.jar.sha256", + "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" +}, { + "version" : "9.5.1-20260510022507+0000", + "buildTime" : "20260510022507+0000", + "commitId" : "fd78213f09782e62ca4957f9cfd3d90c6c3f1767", + "current" : false, + "snapshot" : true, + "nightly" : false, + "releaseNightly" : true, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.1-20260510022507+0000-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.1-20260510022507+0000-bin.zip.sha256", + "checksum" : "31ee63072850e69db0372d24655dbef7680aee3afaec2442d6395fc7ca672fd2", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.1-20260510022507+0000-wrapper.jar.sha256", + "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" +}, { + "version" : "8.14.5", + "buildTime" : "20260507110329+0000", + "commitId" : "62345becae08b13e793521816d585102fea66398", + "current" : false, + "snapshot" : false, + "nightly" : false, + "releaseNightly" : false, + "activeRc" : false, + "rcFor" : "", + "milestoneFor" : "", + "broken" : false, + "downloadUrl" : "https://services.gradle.org/distributions/gradle-8.14.5-bin.zip", + "checksumUrl" : "https://services.gradle.org/distributions/gradle-8.14.5-bin.zip.sha256", + "checksum" : "6f74b601422d6d6fc4e1f9a1ab6522f642c2fdcbc15ae33ebd30ba3d7198e854", + "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-8.14.5-wrapper.jar.sha256", + "wrapperChecksum" : "7d3a4ac4de1c32b59bc6a4eb8ecb8e612ccd0cf1ae1e99f66902da64df296172" }, { "version" : "9.5.0", "buildTime" : "20260428120530+0000", @@ -32,23 +83,6 @@ "checksum" : "553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746", "wrapperChecksumUrl" : "https://services.gradle.org/distributions/gradle-9.5.0-wrapper.jar.sha256", "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" -}, { - "version" : "9.5.0-20260428014943+0000", - "buildTime" : "20260428014943+0000", - "commitId" : "3fe117d68f3907790f3809f121aa36303a9151f8", - "current" : false, - "snapshot" : true, - "nightly" : false, - "releaseNightly" : true, - "activeRc" : false, - "rcFor" : "", - "milestoneFor" : "", - "broken" : false, - "downloadUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260428014943+0000-bin.zip", - "checksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260428014943+0000-bin.zip.sha256", - "checksum" : "95be4dddffc251cf96cb85e6b7d5b1cf9ac7aa407c12c0b1ef212d8592c98ad0", - "wrapperChecksumUrl" : "https://services.gradle.org/distributions-snapshots/gradle-9.5.0-20260428014943+0000-wrapper.jar.sha256", - "wrapperChecksum" : "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" }, { "version" : "9.5.0-rc-4", "buildTime" : "20260423134125+0000", diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/506478077c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/0/506478077c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..305cd82 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/506478077c4d001117ad98d4e911bb97 @@ -0,0 +1,296 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/f08464e1364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/0/f08464e1364d0011135ca7e1c9885acd deleted file mode 100644 index 5f51121..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/0/f08464e1364d0011135ca7e1c9885acd +++ /dev/null @@ -1,98 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/20722979fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/20722979fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..08edfdc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/20722979fd4d00111282df97d7c4d0e2 @@ -0,0 +1,414 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/40104dac754d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/11/40104dac754d001117ad98d4e911bb97 new file mode 100644 index 0000000..e9d80c9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/40104dac754d001117ad98d4e911bb97 @@ -0,0 +1,225 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0a17875a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0a17875a94c0011135ca7e1c9885acd deleted file mode 100644 index 4cf2dc5..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0a17875a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,9 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - */ -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/12/4056f154794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/12/4056f154794d001117ad98d4e911bb97 new file mode 100644 index 0000000..7601bcb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/12/4056f154794d001117ad98d4e911bb97 @@ -0,0 +1,273 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/1008b20d5b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/13/1008b20d5b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b9e99b3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/1008b20d5b4d001117ad98d4e911bb97 @@ -0,0 +1,195 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if () + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/2024ff882f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/13/2024ff882f4d0011135ca7e1c9885acd deleted file mode 100644 index ffdd3d5..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/13/2024ff882f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,51 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/40a97f1b364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/13/40a97f1b364d0011135ca7e1c9885acd deleted file mode 100644 index ca68c64..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/13/40a97f1b364d0011135ca7e1c9885acd +++ /dev/null @@ -1,96 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/c0b854a3354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/13/c0b854a3354d0011135ca7e1c9885acd deleted file mode 100644 index bb22b37..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/13/c0b854a3354d0011135ca7e1c9885acd +++ /dev/null @@ -1,85 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/20c737b9324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/14/20c737b9324d0011135ca7e1c9885acd deleted file mode 100644 index 0d66c16..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/14/20c737b9324d0011135ca7e1c9885acd +++ /dev/null @@ -1,73 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - E tmp = head.data; - head = tail = null; - return tmp; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/50a33ded784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/50a33ded784d001117ad98d4e911bb97 new file mode 100644 index 0000000..a7ff156 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/50a33ded784d001117ad98d4e911bb97 @@ -0,0 +1,273 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext = 0; + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/d04502475b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/d04502475b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..a3b6656 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/d04502475b4d001117ad98d4e911bb97 @@ -0,0 +1,202 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(object); + } + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/15/0009df8d764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/15/0009df8d764d001117ad98d4e911bb97 new file mode 100644 index 0000000..e74a440 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/15/0009df8d764d001117ad98d4e911bb97 @@ -0,0 +1,237 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/15/e0b9f10afb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/15/e0b9f10afb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..2f97781 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/15/e0b9f10afb4d00111282df97d7c4d0e2 @@ -0,0 +1,393 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/40767bf61e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/16/40767bf61e4d0011135ca7e1c9885acd deleted file mode 100644 index 648d536..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/16/40767bf61e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,28 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/9011665d874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/9011665d874d001117ad98d4e911bb97 new file mode 100644 index 0000000..8bd005b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/9011665d874d001117ad98d4e911bb97 @@ -0,0 +1,386 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + size--; + nextNode = nNode; + prevNode = pNode; + posNext--; + lastReturned = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/20b9c8ddfd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/20b9c8ddfd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..46f9cea --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/20b9c8ddfd4d00111282df97d7c4d0e2 @@ -0,0 +1,424 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/40b22efa764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/40b22efa764d001117ad98d4e911bb97 new file mode 100644 index 0000000..f03eb7d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/40b22efa764d001117ad98d4e911bb97 @@ -0,0 +1,248 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + + return array; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1b/3063929c394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/1b/3063929c394d0011135ca7e1c9885acd deleted file mode 100644 index dccb934..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/1b/3063929c394d0011135ca7e1c9885acd +++ /dev/null @@ -1,134 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1b/80da122b594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/1b/80da122b594d001117ad98d4e911bb97 new file mode 100644 index 0000000..a7c4c15 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1b/80da122b594d001117ad98d4e911bb97 @@ -0,0 +1,203 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + } + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/90aa9917384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/90aa9917384d0011135ca7e1c9885acd deleted file mode 100644 index 5829839..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/90aa9917384d0011135ca7e1c9885acd +++ /dev/null @@ -1,115 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/e0b0cc478e4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/1c/e0b0cc478e4c0011135ca7e1c9885acd deleted file mode 100644 index e69de29..0000000 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00b82720fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00b82720fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..1a4f737 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00b82720fb4d00111282df97d7c4d0e2 @@ -0,0 +1,399 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/90e90f4b814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/90e90f4b814d001117ad98d4e911bb97 new file mode 100644 index 0000000..7d6afac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/90e90f4b814d001117ad98d4e911bb97 @@ -0,0 +1,367 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/406f9e107f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/406f9e107f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..35e7ab5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/406f9e107f4d001117ad98d4e911bb97 @@ -0,0 +1,340 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/5076a02b1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/5076a02b1e4d0011135ca7e1c9885acd deleted file mode 100644 index d9a928f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/5076a02b1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,12 +0,0 @@ -package list.mylinkedlist; - -import java.array.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d009d1e07e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d009d1e07e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..062ef6e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d009d1e07e4d001117ad98d4e911bb97 @@ -0,0 +1,334 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0f255c8594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0f255c8594d001117ad98d4e911bb97 new file mode 100644 index 0000000..9d6c65f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2/a0f255c8594d001117ad98d4e911bb97 @@ -0,0 +1,212 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/20/e0591369594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/20/e0591369594d001117ad98d4e911bb97 new file mode 100644 index 0000000..ac86a36 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/20/e0591369594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/9096dee0fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/21/9096dee0fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..1b879f5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/9096dee0fb4d00111282df97d7c4d0e2 @@ -0,0 +1,408 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(data, null, null); + size++; + prevNode = + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/22/302633ba764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/22/302633ba764d001117ad98d4e911bb97 new file mode 100644 index 0000000..bc74ea1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/22/302633ba764d001117ad98d4e911bb97 @@ -0,0 +1,239 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[]; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/22/804feb72374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/22/804feb72374d0011135ca7e1c9885acd deleted file mode 100644 index bfde662..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/22/804feb72374d0011135ca7e1c9885acd +++ /dev/null @@ -1,113 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - - } else { - - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/23/50874d9b5e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/23/50874d9b5e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..2a31686 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/23/50874d9b5e4d001117ad98d4e911bb97 @@ -0,0 +1,238 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(head.next, object); + } + + private boolean removeRec(Node current, E object) { + if (current == null) return false; + if (current.data.equals(object)) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/24/a07c963e784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/24/a07c963e784d001117ad98d4e911bb97 new file mode 100644 index 0000000..af7abb7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/24/a07c963e784d001117ad98d4e911bb97 @@ -0,0 +1,263 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/7093adeb364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/25/7093adeb364d0011135ca7e1c9885acd deleted file mode 100644 index 77fc35f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/25/7093adeb364d0011135ca7e1c9885acd +++ /dev/null @@ -1,99 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/8073d745314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/25/8073d745314d0011135ca7e1c9885acd deleted file mode 100644 index 730b57d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/25/8073d745314d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/0069b83a814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/26/0069b83a814d001117ad98d4e911bb97 new file mode 100644 index 0000000..2d2c4fd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/0069b83a814d001117ad98d4e911bb97 @@ -0,0 +1,368 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + Node removingNode = head; + Node nextingNode = removingNode.next; + + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/40665d03aa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/26/40665d03aa4c0011135ca7e1c9885acd deleted file mode 100644 index d97c883..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/26/40665d03aa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,22 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/b09ad2cf594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/26/b09ad2cf594d001117ad98d4e911bb97 new file mode 100644 index 0000000..a135ffc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/b09ad2cf594d001117ad98d4e911bb97 @@ -0,0 +1,212 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/60ac05aa354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/27/60ac05aa354d0011135ca7e1c9885acd deleted file mode 100644 index a3adcbe..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/27/60ac05aa354d0011135ca7e1c9885acd +++ /dev/null @@ -1,88 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/90bc5f635a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/90bc5f635a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..c61e800 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/90bc5f635a4d001117ad98d4e911bb97 @@ -0,0 +1,219 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + size--; + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/a0fa92045b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/a0fa92045b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..79d4c9a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/a0fa92045b4d001117ad98d4e911bb97 @@ -0,0 +1,195 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/d0b5b782314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/27/d0b5b782314d0011135ca7e1c9885acd deleted file mode 100644 index c9da833..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/27/d0b5b782314d0011135ca7e1c9885acd +++ /dev/null @@ -1,60 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/29/306179641e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/29/306179641e4d0011135ca7e1c9885acd deleted file mode 100644 index 8551566..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/29/306179641e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,20 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/29/40140044594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/29/40140044594d001117ad98d4e911bb97 new file mode 100644 index 0000000..095875b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/29/40140044594d001117ad98d4e911bb97 @@ -0,0 +1,207 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if () + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/4078db2e7a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/4078db2e7a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..e3d497f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/4078db2e7a4d001117ad98d4e911bb97 @@ -0,0 +1,287 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + lastReturned = null; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9081abb57e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9081abb57e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..605c225 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9081abb57e4d001117ad98d4e911bb97 @@ -0,0 +1,329 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/009d006b2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/009d006b2f4d0011135ca7e1c9885acd deleted file mode 100644 index 0ec4c01..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/009d006b2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,48 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/a0823937594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/a0823937594d001117ad98d4e911bb97 new file mode 100644 index 0000000..33195f7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/a0823937594d001117ad98d4e911bb97 @@ -0,0 +1,206 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/f0bf9dca7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/f0bf9dca7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6f10ec2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/f0bf9dca7e4d001117ad98d4e911bb97 @@ -0,0 +1,330 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/908c974b334d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/908c974b334d0011135ca7e1c9885acd deleted file mode 100644 index 56a77e7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/908c974b334d0011135ca7e1c9885acd +++ /dev/null @@ -1,76 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - head.next.prev = null; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/401ce2e9784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/401ce2e9784d001117ad98d4e911bb97 new file mode 100644 index 0000000..af27345 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/401ce2e9784d001117ad98d4e911bb97 @@ -0,0 +1,271 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/502ec652784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/502ec652784d001117ad98d4e911bb97 new file mode 100644 index 0000000..46e0c9a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/502ec652784d001117ad98d4e911bb97 @@ -0,0 +1,268 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Metodi adoperati + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/a00f7051354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/a00f7051354d0011135ca7e1c9885acd deleted file mode 100644 index 2f01896..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/a00f7051354d0011135ca7e1c9885acd +++ /dev/null @@ -1,83 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2d/b0b57503594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/b0b57503594d001117ad98d4e911bb97 new file mode 100644 index 0000000..818c84c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2d/b0b57503594d001117ad98d4e911bb97 @@ -0,0 +1,201 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/604ff500384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/604ff500384d0011135ca7e1c9885acd deleted file mode 100644 index fd6552f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/604ff500384d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/20c41a307c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/20c41a307c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ff4537a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/20c41a307c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + int i = 0; + while () { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/40e6fba1874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/40e6fba1874d001117ad98d4e911bb97 new file mode 100644 index 0000000..449e45f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/40e6fba1874d001117ad98d4e911bb97 @@ -0,0 +1,391 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + @Override + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0fb2b165b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0fb2b165b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..2cb1870 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/e0fb2b165b4d001117ad98d4e911bb97 @@ -0,0 +1,197 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/f0f735ee764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/f0f735ee764d001117ad98d4e911bb97 new file mode 100644 index 0000000..666a84c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/f0f735ee764d001117ad98d4e911bb97 @@ -0,0 +1,244 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i] = currentNode; + i++; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/706178ea7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/706178ea7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f22296f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/706178ea7b4d001117ad98d4e911bb97 @@ -0,0 +1,294 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0dd3419304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0dd3419304d0011135ca7e1c9885acd deleted file mode 100644 index eb1f9b3..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3/a0dd3419304d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/d00b22df324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3/d00b22df324d0011135ca7e1c9885acd deleted file mode 100644 index 9802d36..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3/d00b22df324d0011135ca7e1c9885acd +++ /dev/null @@ -1,77 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - tmp = head.data; - head = tail = null; - } else { - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/f081edd52f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/30/f081edd52f4d0011135ca7e1c9885acd deleted file mode 100644 index 630179b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/30/f081edd52f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/3019efdd764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/3019efdd764d001117ad98d4e911bb97 new file mode 100644 index 0000000..8acfa09 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/3019efdd764d001117ad98d4e911bb97 @@ -0,0 +1,243 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + for () { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/5021a0f7384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/31/5021a0f7384d0011135ca7e1c9885acd deleted file mode 100644 index 70987af..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/31/5021a0f7384d0011135ca7e1c9885acd +++ /dev/null @@ -1,126 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/a079cbd0594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/a079cbd0594d001117ad98d4e911bb97 new file mode 100644 index 0000000..e0fcc2a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/a079cbd0594d001117ad98d4e911bb97 @@ -0,0 +1,213 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/e0852927aa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/31/e0852927aa4c0011135ca7e1c9885acd deleted file mode 100644 index 1150f55..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/31/e0852927aa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,24 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static Map ContaDuplicati(BinaryNode node, HashMap ) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/e09a142e2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/31/e09a142e2f4d0011135ca7e1c9885acd deleted file mode 100644 index a835c46..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/31/e09a142e2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,37 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MuLinkedList() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/f0b898c0764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/f0b898c0764d001117ad98d4e911bb97 new file mode 100644 index 0000000..2fdd02e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/f0b898c0764d001117ad98d4e911bb97 @@ -0,0 +1,239 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/b0a924c5764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/32/b0a924c5764d001117ad98d4e911bb97 new file mode 100644 index 0000000..e1c94f8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/b0a924c5764d001117ad98d4e911bb97 @@ -0,0 +1,240 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/33/9006da815e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/33/9006da815e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..54bbacf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/33/9006da815e4d001117ad98d4e911bb97 @@ -0,0 +1,235 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(head.next, object); + } + + private boolean removeRec(Node cur, E object) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/33/b0ecb5b67e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/33/b0ecb5b67e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b747358 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/33/b0ecb5b67e4d001117ad98d4e911bb97 @@ -0,0 +1,329 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/33/d0662990794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/33/d0662990794d001117ad98d4e911bb97 new file mode 100644 index 0000000..053fa58 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/33/d0662990794d001117ad98d4e911bb97 @@ -0,0 +1,281 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0)) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/208a9ecdfd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/34/208a9ecdfd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..1b1b3fe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/208a9ecdfd4d00111282df97d7c4d0e2 @@ -0,0 +1,423 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/40483466794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/34/40483466794d001117ad98d4e911bb97 new file mode 100644 index 0000000..bb6dd02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/40483466794d001117ad98d4e911bb97 @@ -0,0 +1,276 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/702de21dfe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/34/702de21dfe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..851934f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/702de21dfe4d00111282df97d7c4d0e2 @@ -0,0 +1,428 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = nextNode; + newNode.next = prevNode; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/f09218291e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/34/f09218291e4d0011135ca7e1c9885acd deleted file mode 100644 index 3656c5b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/34/f09218291e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,12 +0,0 @@ -package list.mylinkedlist; - -implements java.array.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/600e04139f4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/35/600e04139f4c0011135ca7e1c9885acd deleted file mode 100644 index abe4ec4..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/35/600e04139f4c0011135ca7e1c9885acd +++ /dev/null @@ -1,5 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/90392959374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/35/90392959374d0011135ca7e1c9885acd deleted file mode 100644 index 56f0f0a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/35/90392959374d0011135ca7e1c9885acd +++ /dev/null @@ -1,107 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/a0048f3b5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/35/a0048f3b5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..c2c5dee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/a0048f3b5a4d001117ad98d4e911bb97 @@ -0,0 +1,218 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/36/705091945b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/36/705091945b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..8813f46 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/36/705091945b4d001117ad98d4e911bb97 @@ -0,0 +1,211 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/36/908d1035a84c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/36/908d1035a84c0011135ca7e1c9885acd deleted file mode 100644 index be5bea9..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/36/908d1035a84c0011135ca7e1c9885acd +++ /dev/null @@ -1,5 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/36/c082b4c4764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/36/c082b4c4764d001117ad98d4e911bb97 new file mode 100644 index 0000000..2fdd02e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/36/c082b4c4764d001117ad98d4e911bb97 @@ -0,0 +1,239 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/37/30fe89b7814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/37/30fe89b7814d001117ad98d4e911bb97 new file mode 100644 index 0000000..6ccd5f5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/37/30fe89b7814d001117ad98d4e911bb97 @@ -0,0 +1,372 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/37/b0a1ebe6fe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/37/b0a1ebe6fe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..670d19b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/37/b0a1ebe6fe4d00111282df97d7c4d0e2 @@ -0,0 +1,432 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/2003b3e4774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/2003b3e4774d001117ad98d4e911bb97 new file mode 100644 index 0000000..cc6ce14 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/2003b3e4774d001117ad98d4e911bb97 @@ -0,0 +1,256 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/30df62ef764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/30df62ef764d001117ad98d4e911bb97 new file mode 100644 index 0000000..c11cfc3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/30df62ef764d001117ad98d4e911bb97 @@ -0,0 +1,243 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/505233b7374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/38/505233b7374d0011135ca7e1c9885acd deleted file mode 100644 index b82113c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/38/505233b7374d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/6015615c1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/38/6015615c1e4d0011135ca7e1c9885acd deleted file mode 100644 index 8551566..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/38/6015615c1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,20 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/0068e6885b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/0068e6885b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..109cf22 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/0068e6885b4d001117ad98d4e911bb97 @@ -0,0 +1,211 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/80bbd1b35d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/80bbd1b35d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ada9438 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/80bbd1b35d4d001117ad98d4e911bb97 @@ -0,0 +1,227 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/90f4027a814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/90f4027a814d001117ad98d4e911bb97 new file mode 100644 index 0000000..0d68f63 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/90f4027a814d001117ad98d4e911bb97 @@ -0,0 +1,369 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0 + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/d01a358c7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/d01a358c7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..09f9cb3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/d01a358c7c4d001117ad98d4e911bb97 @@ -0,0 +1,301 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/00c71b815b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/00c71b815b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..52a7593 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/00c71b815b4d001117ad98d4e911bb97 @@ -0,0 +1,209 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/403df5a8764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/403df5a8764d001117ad98d4e911bb97 new file mode 100644 index 0000000..f43bc6b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/403df5a8764d001117ad98d4e911bb97 @@ -0,0 +1,238 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/406036f4764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/406036f4764d001117ad98d4e911bb97 new file mode 100644 index 0000000..e895c7a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/406036f4764d001117ad98d4e911bb97 @@ -0,0 +1,244 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/905aa1cbfd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/905aa1cbfd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..ab26fcf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/905aa1cbfd4d00111282df97d7c4d0e2 @@ -0,0 +1,421 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/30736f9f804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/30736f9f804d001117ad98d4e911bb97 new file mode 100644 index 0000000..bbe9fe3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/30736f9f804d001117ad98d4e911bb97 @@ -0,0 +1,354 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/609f941d5e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/609f941d5e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..67d4cc2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/609f941d5e4d001117ad98d4e911bb97 @@ -0,0 +1,231 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/805ee151764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/805ee151764d001117ad98d4e911bb97 new file mode 100644 index 0000000..54d56f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/805ee151764d001117ad98d4e911bb97 @@ -0,0 +1,232 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/d023eb9c344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/d023eb9c344d0011135ca7e1c9885acd deleted file mode 100644 index 2102fe4..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/d023eb9c344d0011135ca7e1c9885acd +++ /dev/null @@ -1,78 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - head.next.prev = null; - head = head.next; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/10dd6882324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/10dd6882324d0011135ca7e1c9885acd deleted file mode 100644 index d57eb7d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/10dd6882324d0011135ca7e1c9885acd +++ /dev/null @@ -1,68 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/206bbf40fc4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/206bbf40fc4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..c0af408 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/206bbf40fc4d00111282df97d7c4d0e2 @@ -0,0 +1,411 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/309060ab2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/309060ab2f4d0011135ca7e1c9885acd deleted file mode 100644 index ae4af8a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/309060ab2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,52 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/709479b22f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/709479b22f4d0011135ca7e1c9885acd deleted file mode 100644 index 1864f09..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/709479b22f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/805f50da324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/805f50da324d0011135ca7e1c9885acd deleted file mode 100644 index 8a3c574..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/805f50da324d0011135ca7e1c9885acd +++ /dev/null @@ -1,77 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp; - if (size == 1) { - tmp = head.data; - head = tail = null; - } else { - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/90898c119f4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/90898c119f4c0011135ca7e1c9885acd deleted file mode 100644 index e69de29..0000000 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/a0183c26aa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/a0183c26aa4c0011135ca7e1c9885acd deleted file mode 100644 index 0c9e335..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/a0183c26aa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,24 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static Map ContaDuplicati(BinaryNode node, ) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/90badac87b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/90badac87b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..bc8113e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/90badac87b4d001117ad98d4e911bb97 @@ -0,0 +1,290 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if (index == size) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/b034c1e3a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/40/b034c1e3a94c0011135ca7e1c9885acd deleted file mode 100644 index 060f81e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/40/b034c1e3a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,20 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/c0d0bd0c1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/40/c0d0bd0c1e4d0011135ca7e1c9885acd deleted file mode 100644 index 5ef1a74..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/40/c0d0bd0c1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,7 +0,0 @@ -package list.mylinkedlist; - -public class MyLinkedList { - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/50cddb2d8f4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/42/50cddb2d8f4c0011135ca7e1c9885acd deleted file mode 100644 index 900cc71..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/42/50cddb2d8f4c0011135ca7e1c9885acd +++ /dev/null @@ -1,16 +0,0 @@ -package jcf_map.exercise; - -public class Dispari { - - /* - * Esercizio 1 - Esame del 5 settembre 2017 - * - * Una lista si dice dispari se ciascuno dei suoi oggetti appare un numero dispari di volte. - * Ad esempio, la lista di interi [20, 5, 5, 20, 20] non è dispari, mentre lo è [5, 20, 5 , 5]. - * Si assuma una classe Dispari con una sola variabile di instanza private LinkedList myList. - * Si implementi un metodo public boolean ordinaDispari() {} interno alla classe, - * che restituisce false se myLisy non è dispari, mentre ordina in modo crescente la lista - * e restituisce true se myList è dispari; - */ - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/504dba233a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/42/50ef654f574d001117ad98d4e911bb97 similarity index 70% rename from .metadata/.plugins/org.eclipse.core.resources/.history/1c/504dba233a4d0011135ca7e1c9885acd rename to .metadata/.plugins/org.eclipse.core.resources/.history/42/50ef654f574d001117ad98d4e911bb97 index d80a225..c03bada 100644 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/1c/504dba233a4d0011135ca7e1c9885acd +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/50ef654f574d001117ad98d4e911bb97 @@ -4,7 +4,7 @@ import java.util.List; import java.util.NoSuchElementException; public class MyLinkedList implements List { - + /* * Classe Nodo */ @@ -128,15 +128,58 @@ public class MyLinkedList implements List { public void add(int index, E item) { if (item == null) throw new NullPointerException(); if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - + // Se l'inserimento è richiesto nella prima posizione if (index == 0) { addFirst(item); return; } - + // Se l'inserimento è richiesto nell'ultima posizione if (index == size) { - + addLast(item); + return; } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); } } diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/6029c9127d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/6029c9127d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..64e02e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/6029c9127d4d001117ad98d4e911bb97 @@ -0,0 +1,313 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/60a9a477a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/42/60a9a477a94c0011135ca7e1c9885acd deleted file mode 100644 index e62b7dd..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/42/60a9a477a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,13 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/801890d5574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/801890d5574d001117ad98d4e911bb97 new file mode 100644 index 0000000..1f57ab1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/801890d5574d001117ad98d4e911bb97 @@ -0,0 +1,191 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/80d89bf3774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/80d89bf3774d001117ad98d4e911bb97 new file mode 100644 index 0000000..47b3166 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/80d89bf3774d001117ad98d4e911bb97 @@ -0,0 +1,260 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/d0b42ef87c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/d0b42ef87c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..3fd542b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/d0b42ef87c4d001117ad98d4e911bb97 @@ -0,0 +1,307 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + public boolean hasNext() { + return next != null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/e0cbea023a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/42/e0cbea023a4d0011135ca7e1c9885acd deleted file mode 100644 index b66d5ae..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/42/e0cbea023a4d0011135ca7e1c9885acd +++ /dev/null @@ -1,136 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - if (index == 0) { - addFirst(item); - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/43/10b441b1584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/43/10b441b1584d001117ad98d4e911bb97 new file mode 100644 index 0000000..ab20a0b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/43/10b441b1584d001117ad98d4e911bb97 @@ -0,0 +1,193 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/a04603031e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/44/a04603031e4d0011135ca7e1c9885acd deleted file mode 100644 index b2ee34c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/44/a04603031e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,5 +0,0 @@ -package list.mylinkedlist; - -public class MyLinkedList { - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/f0005c81324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/44/f0005c81324d0011135ca7e1c9885acd deleted file mode 100644 index f975633..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/44/f0005c81324d0011135ca7e1c9885acd +++ /dev/null @@ -1,67 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/45/e05f32507f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/45/e05f32507f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b21b7d3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/45/e05f32507f4d001117ad98d4e911bb97 @@ -0,0 +1,347 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/45/e08b33a77d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/45/e08b33a77d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7b81a67 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/45/e08b33a77d4d001117ad98d4e911bb97 @@ -0,0 +1,319 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/46/80b1c7d6804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/46/80b1c7d6804d001117ad98d4e911bb97 new file mode 100644 index 0000000..5bc478d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/46/80b1c7d6804d001117ad98d4e911bb97 @@ -0,0 +1,359 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + } + // Se l'ultimo elemento ad essere stato restituito è la coda + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/46/9009d050fa4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/46/9009d050fa4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..ba7cf43 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/46/9009d050fa4d00111282df97d7c4d0e2 @@ -0,0 +1,393 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + @Override + public void add(E data) { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/47/c011bffa7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/47/c011bffa7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ea254e6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/47/c011bffa7e4d001117ad98d4e911bb97 @@ -0,0 +1,337 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/0075ba535a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/48/0075ba535a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..64a07e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/48/0075ba535a4d001117ad98d4e911bb97 @@ -0,0 +1,219 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + } + } + size--; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/30deeb827e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/48/30deeb827e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7e73493 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/48/30deeb827e4d001117ad98d4e911bb97 @@ -0,0 +1,324 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/48/5019b48d324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/48/5019b48d324d0011135ca7e1c9885acd deleted file mode 100644 index 45c9aeb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/48/5019b48d324d0011135ca7e1c9885acd +++ /dev/null @@ -1,69 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/49/30ac4aba7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/49/30ac4aba7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..89a2f30 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/49/30ac4aba7e4d001117ad98d4e911bb97 @@ -0,0 +1,330 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/49/70bda109ff4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/49/70bda109ff4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..c16cbf0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/49/70bda109ff4d00111282df97d7c4d0e2 @@ -0,0 +1,437 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (e == null) + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/49/d05f54f2344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/49/d05f54f2344d0011135ca7e1c9885acd deleted file mode 100644 index 99167aa..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/49/d05f54f2344d0011135ca7e1c9885acd +++ /dev/null @@ -1,80 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/49/f06a35857c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/49/f06a35857c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..fcce37b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/49/f06a35857c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + posNext = 0; + while (posNext < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/801f58a5594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/801f58a5594d001117ad98d4e911bb97 new file mode 100644 index 0000000..9d6c65f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/801f58a5594d001117ad98d4e911bb97 @@ -0,0 +1,212 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/90995109aa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/90995109aa4c0011135ca7e1c9885acd deleted file mode 100644 index 76c327d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/90995109aa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,24 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static Map ContaDuplicati() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/a09dc134814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/a09dc134814d001117ad98d4e911bb97 new file mode 100644 index 0000000..681c762 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/a09dc134814d001117ad98d4e911bb97 @@ -0,0 +1,367 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + Node removingNode = head; + Node nextingNode = removingNode.next; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/b0fad96dfe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/b0fad96dfe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..0dda5c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/b0fad96dfe4d00111282df97d7c4d0e2 @@ -0,0 +1,431 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + lastReturned = null; + posNext++; + size++; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/00ef1087fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/00ef1087fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..3beba8a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/00ef1087fb4d00111282df97d7c4d0e2 @@ -0,0 +1,405 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/4096a4f5764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/4096a4f5764d001117ad98d4e911bb97 new file mode 100644 index 0000000..9288d07 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/4096a4f5764d001117ad98d4e911bb97 @@ -0,0 +1,244 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/70645260794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/70645260794d001117ad98d4e911bb97 new file mode 100644 index 0000000..12be8e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/70645260794d001117ad98d4e911bb97 @@ -0,0 +1,275 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/801e556f394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/801e556f394d0011135ca7e1c9885acd deleted file mode 100644 index abc5aff..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/801e556f394d0011135ca7e1c9885acd +++ /dev/null @@ -1,132 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/8045cd9a374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/8045cd9a374d0011135ca7e1c9885acd deleted file mode 100644 index a18c0b0..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/8045cd9a374d0011135ca7e1c9885acd +++ /dev/null @@ -1,113 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/c0dc092bfc4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/c0dc092bfc4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..e12ba5c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/c0dc092bfc4d00111282df97d7c4d0e2 @@ -0,0 +1,410 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0bc35095d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0bc35095d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6cb4a9e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0bc35095d4d001117ad98d4e911bb97 @@ -0,0 +1,222 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + } + return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c0880dc5354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c0880dc5354d0011135ca7e1c9885acd deleted file mode 100644 index d963519..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/c0880dc5354d0011135ca7e1c9885acd +++ /dev/null @@ -1,90 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) return new NoSuchElementException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/0006cd1a814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/0006cd1a814d001117ad98d4e911bb97 new file mode 100644 index 0000000..5deb1e0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/0006cd1a814d001117ad98d4e911bb97 @@ -0,0 +1,366 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + Node rmNode = head; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/10000be77b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/10000be77b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1c183a4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/10000be77b4d001117ad98d4e911bb97 @@ -0,0 +1,294 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = head; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/506489f1584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/506489f1584d001117ad98d4e911bb97 new file mode 100644 index 0000000..ff69d10 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/506489f1584d001117ad98d4e911bb97 @@ -0,0 +1,201 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + + if () + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/60f31582384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/60f31582384d0011135ca7e1c9885acd deleted file mode 100644 index 902662c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/60f31582384d0011135ca7e1c9885acd +++ /dev/null @@ -1,117 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/903e85f25a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/903e85f25a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..9ea642c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/903e85f25a4d001117ad98d4e911bb97 @@ -0,0 +1,193 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + while () + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/9083c736304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/9083c736304d0011135ca7e1c9885acd deleted file mode 100644 index abb3deb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/9083c736304d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(null, null, item); - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/d0ccc04afd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/d0ccc04afd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..65741dd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/d0ccc04afd4d00111282df97d7c4d0e2 @@ -0,0 +1,412 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e088d0d9794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e088d0d9794d001117ad98d4e911bb97 new file mode 100644 index 0000000..d007832 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e088d0d9794d001117ad98d4e911bb97 @@ -0,0 +1,283 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + nextNode = head; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/f05965a1374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/f05965a1374d0011135ca7e1c9885acd deleted file mode 100644 index 6a1d0da..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/f05965a1374d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/10efa127fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/10efa127fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..df668a8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/10efa127fb4d00111282df97d7c4d0e2 @@ -0,0 +1,401 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/30338771594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/30338771594d001117ad98d4e911bb97 new file mode 100644 index 0000000..c0f6439 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/30338771594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/307a86ee7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/307a86ee7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..a4083b9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/307a86ee7c4d001117ad98d4e911bb97 @@ -0,0 +1,303 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/504e5a3b814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/504e5a3b814d001117ad98d4e911bb97 new file mode 100644 index 0000000..ad2e3ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/504e5a3b814d001117ad98d4e911bb97 @@ -0,0 +1,367 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst() + + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/d00d46ae384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/5/d00d46ae384d0011135ca7e1c9885acd deleted file mode 100644 index 655dc1d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/5/d00d46ae384d0011135ca7e1c9885acd +++ /dev/null @@ -1,119 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0a2e6bc754d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0a2e6bc754d001117ad98d4e911bb97 new file mode 100644 index 0000000..42b7f7a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/e0a2e6bc754d001117ad98d4e911bb97 @@ -0,0 +1,227 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/60160ff55d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/50/60160ff55d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..a1000e6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/50/60160ff55d4d001117ad98d4e911bb97 @@ -0,0 +1,227 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/60c2b7b97b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/50/60c2b7b97b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b18256e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/50/60c2b7b97b4d001117ad98d4e911bb97 @@ -0,0 +1,287 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/703706531e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/50/703706531e4d0011135ca7e1c9885acd deleted file mode 100644 index 227720a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/50/703706531e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,17 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/20cb337d1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/52/20cb337d1e4d0011135ca7e1c9885acd deleted file mode 100644 index 29d369d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/52/20cb337d1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,26 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/54/009c5fde7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/54/009c5fde7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..5ff9a92 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/54/009c5fde7b4d001117ad98d4e911bb97 @@ -0,0 +1,294 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/54/109ff16f594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/54/109ff16f594d001117ad98d4e911bb97 new file mode 100644 index 0000000..80e862a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/54/109ff16f594d001117ad98d4e911bb97 @@ -0,0 +1,209 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0de835e7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0de835e7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b7b8ca4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/54/a0de835e7c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + posNext = 0; + while (i < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/54/d03231a7394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/54/d03231a7394d0011135ca7e1c9885acd deleted file mode 100644 index 5a9410b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/54/d03231a7394d0011135ca7e1c9885acd +++ /dev/null @@ -1,134 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/a069e620364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/55/a069e620364d0011135ca7e1c9885acd deleted file mode 100644 index eff3716..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/55/a069e620364d0011135ca7e1c9885acd +++ /dev/null @@ -1,96 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/d0ac5eeefe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/55/d0ac5eeefe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..7827fc4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/d0ac5eeefe4d00111282df97d7c4d0e2 @@ -0,0 +1,436 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastNode == null) throw new NoSuchElementException(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/00ccfe8f874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/00ccfe8f874d001117ad98d4e911bb97 new file mode 100644 index 0000000..af7958a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/00ccfe8f874d001117ad98d4e911bb97 @@ -0,0 +1,388 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) size--; + + nextNode = nNode; + prevNode = pNode; + posNext--; + lastReturned = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/506ddabe594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/506ddabe594d001117ad98d4e911bb97 new file mode 100644 index 0000000..9d6c65f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/506ddabe594d001117ad98d4e911bb97 @@ -0,0 +1,212 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/70d4e419774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/70d4e419774d001117ad98d4e911bb97 new file mode 100644 index 0000000..ae5bf7d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/70d4e419774d001117ad98d4e911bb97 @@ -0,0 +1,247 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/b0e86572804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/b0e86572804d001117ad98d4e911bb97 new file mode 100644 index 0000000..8edf9bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/b0e86572804d001117ad98d4e911bb97 @@ -0,0 +1,350 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + @Override + public void remove() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/f0c2aadb804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/f0c2aadb804d001117ad98d4e911bb97 new file mode 100644 index 0000000..00aac72 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/f0c2aadb804d001117ad98d4e911bb97 @@ -0,0 +1,362 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/10a5470e1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/57/10a5470e1e4d0011135ca7e1c9885acd deleted file mode 100644 index 847ef07..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/57/10a5470e1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,9 +0,0 @@ -package list.mylinkedlist; - -public class MyLinkedList { - - /* - * Classe Nodo - */ - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/207d929e324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/57/207d929e324d0011135ca7e1c9885acd deleted file mode 100644 index 8197988..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/57/207d929e324d0011135ca7e1c9885acd +++ /dev/null @@ -1,71 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - Node tmp = head; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/70762361814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/70762361814d001117ad98d4e911bb97 new file mode 100644 index 0000000..8b1cfdb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/70762361814d001117ad98d4e911bb97 @@ -0,0 +1,367 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0f539ae814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0f539ae814d001117ad98d4e911bb97 new file mode 100644 index 0000000..024ccfa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/b0f539ae814d001117ad98d4e911bb97 @@ -0,0 +1,371 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/00dcb9c1584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/00dcb9c1584d001117ad98d4e911bb97 new file mode 100644 index 0000000..cad6e71 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/00dcb9c1584d001117ad98d4e911bb97 @@ -0,0 +1,196 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + while (currentNode.next != null) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/603b700d1f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/603b700d1f4d0011135ca7e1c9885acd deleted file mode 100644 index e83a01e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/603b700d1f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,30 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e09d79f1fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e09d79f1fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..cf00280 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e09d79f1fd4d00111282df97d7c4d0e2 @@ -0,0 +1,426 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/40636b107d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/40636b107d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ebdc6a1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/40636b107d4d001117ad98d4e911bb97 @@ -0,0 +1,311 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + public boolean hasNext() { + return nextNode != null; + } + + public boolean hasPrevious() { + return prevNode != null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/e02bd5b0324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/e02bd5b0324d0011135ca7e1c9885acd deleted file mode 100644 index 53570c7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/e02bd5b0324d0011135ca7e1c9885acd +++ /dev/null @@ -1,73 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - E tmp = head.data; - head = tail = null; - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5f/a0b241097c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/a0b241097c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..5071d4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5f/a0b241097c4d001117ad98d4e911bb97 @@ -0,0 +1,297 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + int i = 0; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/70690d547a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/70690d547a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..2ada5b5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/70690d547a4d001117ad98d4e911bb97 @@ -0,0 +1,288 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + lastReturned = head; + posNext = 0; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/f03c9e905e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f03c9e905e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..32e01c9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f03c9e905e4d001117ad98d4e911bb97 @@ -0,0 +1,236 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(head.next, object); + } + + private boolean removeRec(Node current, E object) { + if (current == null) return false; + if (current.data.equals(object)) + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/10fddfda794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/10fddfda794d001117ad98d4e911bb97 new file mode 100644 index 0000000..17703b8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/10fddfda794d001117ad98d4e911bb97 @@ -0,0 +1,283 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/40d39f327a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/40d39f327a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..0484836 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/40d39f327a4d001117ad98d4e911bb97 @@ -0,0 +1,288 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + lastReturned = null; + posNext = 1; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/80cc47ab394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/60/80cc47ab394d0011135ca7e1c9885acd deleted file mode 100644 index 4863c28..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/60/80cc47ab394d0011135ca7e1c9885acd +++ /dev/null @@ -1,134 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - if (index ) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/a064d590814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/a064d590814d001117ad98d4e911bb97 new file mode 100644 index 0000000..016e649 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/a064d590814d001117ad98d4e911bb97 @@ -0,0 +1,370 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/f0b27634764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/f0b27634764d001117ad98d4e911bb97 new file mode 100644 index 0000000..e798f01 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/f0b27634764d001117ad98d4e911bb97 @@ -0,0 +1,232 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/a0b004fb5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/61/a0b004fb5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..44be72d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/a0b004fb5a4d001117ad98d4e911bb97 @@ -0,0 +1,193 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/30a390b9fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/62/30a390b9fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..22ce384 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/62/30a390b9fb4d00111282df97d7c4d0e2 @@ -0,0 +1,406 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(); + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/d08425b4314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/62/d08425b4314d0011135ca7e1c9885acd deleted file mode 100644 index f02d40f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/62/d08425b4314d0011135ca7e1c9885acd +++ /dev/null @@ -1,61 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - head = newNode; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/10a2818c594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/63/10a2818c594d001117ad98d4e911bb97 new file mode 100644 index 0000000..63af56e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/63/10a2818c594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if () + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/40d1df262f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/63/40d1df262f4d0011135ca7e1c9885acd deleted file mode 100644 index 439a6b7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/63/40d1df262f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,34 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/501b8f83374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/63/501b8f83374d0011135ca7e1c9885acd deleted file mode 100644 index 998fb4e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/63/501b8f83374d0011135ca7e1c9885acd +++ /dev/null @@ -1,113 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/80b84ffa5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/63/80b84ffa5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..0a99e80 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/63/80b84ffa5a4d001117ad98d4e911bb97 @@ -0,0 +1,193 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while () + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/20e64bf5fe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/20e64bf5fe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..0626c8c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/20e64bf5fe4d00111282df97d7c4d0e2 @@ -0,0 +1,436 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/30067cc7814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/30067cc7814d001117ad98d4e911bb97 new file mode 100644 index 0000000..506eb0b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/30067cc7814d001117ad98d4e911bb97 @@ -0,0 +1,372 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/7099dc457a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/7099dc457a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..0ef3b1b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/7099dc457a4d001117ad98d4e911bb97 @@ -0,0 +1,288 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + lastReturned = null; + posNext = 0; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/e0b91ffd854d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/e0b91ffd854d001117ad98d4e911bb97 new file mode 100644 index 0000000..dfac56b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/e0b91ffd854d001117ad98d4e911bb97 @@ -0,0 +1,374 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/f02cfc58754d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/f02cfc58754d001117ad98d4e911bb97 new file mode 100644 index 0000000..378218e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/f02cfc58754d001117ad98d4e911bb97 @@ -0,0 +1,238 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(head.next, object); + } + + private boolean removeRec(Node current, E object) { + if (current == null) return false; + if (current.data.equals(object)) { + if (current == tail) removeLast(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/f0c0e5057d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/f0c0e5057d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7dd6a81 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/f0c0e5057d4d001117ad98d4e911bb97 @@ -0,0 +1,311 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + public boolean hasNext() { + return nextNode != null; + } + + public boolean hasPrevious() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/7043ca16764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/65/7043ca16764d001117ad98d4e911bb97 new file mode 100644 index 0000000..2fd88b5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/65/7043ca16764d001117ad98d4e911bb97 @@ -0,0 +1,228 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/66/a06067fe7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/66/a06067fe7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6ed4bd0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/66/a06067fe7b4d001117ad98d4e911bb97 @@ -0,0 +1,296 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/67/e009c3f5a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/67/e009c3f5a94c0011135ca7e1c9885acd deleted file mode 100644 index 4ad9786..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/67/e009c3f5a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,22 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/a0785a011e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/69/a0785a011e4d0011135ca7e1c9885acd deleted file mode 100644 index e69de29..0000000 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f50675324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f50675324d0011135ca7e1c9885acd deleted file mode 100644 index e0d8fc3..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/69/d0f50675324d0011135ca7e1c9885acd +++ /dev/null @@ -1,67 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/60be6d1b774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/60be6d1b774d001117ad98d4e911bb97 new file mode 100644 index 0000000..2447bdc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/60be6d1b774d001117ad98d4e911bb97 @@ -0,0 +1,249 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/90be0379354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/90be0379354d0011135ca7e1c9885acd deleted file mode 100644 index 9dd4186..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/90be0379354d0011135ca7e1c9885acd +++ /dev/null @@ -1,85 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/e0fa43622f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/e0fa43622f4d0011135ca7e1c9885acd deleted file mode 100644 index fc1f2a8..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/e0fa43622f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,44 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6b/50a69a65374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6b/50a69a65374d0011135ca7e1c9885acd deleted file mode 100644 index c267135..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6b/50a69a65374d0011135ca7e1c9885acd +++ /dev/null @@ -1,108 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/002d3cdb5c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/002d3cdb5c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..2ce89bc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/002d3cdb5c4d001117ad98d4e911bb97 @@ -0,0 +1,217 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/204cb9d82f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/204cb9d82f4d0011135ca7e1c9885acd deleted file mode 100644 index aff4eee..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/204cb9d82f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,55 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/40a0f22eaa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/40a0f22eaa4c0011135ca7e1c9885acd deleted file mode 100644 index febf3d8..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/40a0f22eaa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,25 +0,0 @@ -package jcf_map.exercise; - -import java.util.HashMap; -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static Map ContaDuplicati(BinaryNode node, HashMap mappa) { - if (node == nukk) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/b02166c3324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/b02166c3324d0011135ca7e1c9885acd deleted file mode 100644 index 6d0a182..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/b02166c3324d0011135ca7e1c9885acd +++ /dev/null @@ -1,74 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp; - if (size == 1) { - tmp = head.data; - head = tail = null; - return tmp; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/704812b5764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/704812b5764d001117ad98d4e911bb97 new file mode 100644 index 0000000..4050741 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/704812b5764d001117ad98d4e911bb97 @@ -0,0 +1,239 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7/501f12b3fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/7/501f12b3fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..1960f2c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7/501f12b3fd4d00111282df97d7c4d0e2 @@ -0,0 +1,417 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7/80076b54324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/7/80076b54324d0011135ca7e1c9885acd deleted file mode 100644 index 3488c82..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/7/80076b54324d0011135ca7e1c9885acd +++ /dev/null @@ -1,67 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0c15931594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0c15931594d001117ad98d4e911bb97 new file mode 100644 index 0000000..5584397 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7/b0c15931594d001117ad98d4e911bb97 @@ -0,0 +1,204 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/70/80c01fca354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/70/80c01fca354d0011135ca7e1c9885acd deleted file mode 100644 index 1ec2256..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/70/80c01fca354d0011135ca7e1c9885acd +++ /dev/null @@ -1,91 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/70/f0fb338d764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/70/f0fb338d764d001117ad98d4e911bb97 new file mode 100644 index 0000000..ac71801 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/70/f0fb338d764d001117ad98d4e911bb97 @@ -0,0 +1,237 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/306d19e8574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/306d19e8574d001117ad98d4e911bb97 new file mode 100644 index 0000000..9e101d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/306d19e8574d001117ad98d4e911bb97 @@ -0,0 +1,192 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/70cdbd08fc4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70cdbd08fc4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..773b14a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/70cdbd08fc4d00111282df97d7c4d0e2 @@ -0,0 +1,408 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/72/80ef576ffb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/72/80ef576ffb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..e02ab4d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/72/80ef576ffb4d00111282df97d7c4d0e2 @@ -0,0 +1,402 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/72/e04cece2774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/72/e04cece2774d001117ad98d4e911bb97 new file mode 100644 index 0000000..1b661ee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/72/e04cece2774d001117ad98d4e911bb97 @@ -0,0 +1,255 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/70ae0a0b5e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/70ae0a0b5e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ca7c829 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/70ae0a0b5e4d001117ad98d4e911bb97 @@ -0,0 +1,230 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/9018c15f874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/9018c15f874d001117ad98d4e911bb97 new file mode 100644 index 0000000..42c8cf4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/9018c15f874d001117ad98d4e911bb97 @@ -0,0 +1,388 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) + + nextNode = nNode; + prevNode = pNode; + posNext--; + lastReturned = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/b087ba94794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/b087ba94794d001117ad98d4e911bb97 new file mode 100644 index 0000000..6db0c20 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/b087ba94794d001117ad98d4e911bb97 @@ -0,0 +1,281 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || ) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/74/902a2127304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/74/902a2127304d0011135ca7e1c9885acd deleted file mode 100644 index 4c6a117..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/74/902a2127304d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(); - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/902a41b3794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/902a41b3794d001117ad98d4e911bb97 new file mode 100644 index 0000000..fb1e832 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/902a41b3794d001117ad98d4e911bb97 @@ -0,0 +1,281 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsExcpetion(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/3007bc09864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/76/3007bc09864d001117ad98d4e911bb97 new file mode 100644 index 0000000..dfac56b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/3007bc09864d001117ad98d4e911bb97 @@ -0,0 +1,374 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/3023489d7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/76/3023489d7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..cc09deb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/3023489d7c4d001117ad98d4e911bb97 @@ -0,0 +1,302 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/304f2e47a84c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/76/304f2e47a84c0011135ca7e1c9885acd deleted file mode 100644 index 372bb1e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/76/304f2e47a84c0011135ca7e1c9885acd +++ /dev/null @@ -1,7 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * - */ -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/308d5f11ff4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/76/308d5f11ff4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..aa3442f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/308d5f11ff4d00111282df97d7c4d0e2 @@ -0,0 +1,437 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (data == null) throw new NullPointerException(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/90a15fc1a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/76/90a15fc1a94c0011135ca7e1c9885acd deleted file mode 100644 index 6f72c9e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/76/90a15fc1a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,14 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/76/f0155bbd7d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/76/f0155bbd7d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..5129181 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/76/f0155bbd7d4d001117ad98d4e911bb97 @@ -0,0 +1,319 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/77/606dad7c7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/77/606dad7c7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..acd4f4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/77/606dad7c7c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = + posNext = 0; + while (posNext < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/77/b06e0bee384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/77/b06e0bee384d0011135ca7e1c9885acd deleted file mode 100644 index 6701b51..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/77/b06e0bee384d0011135ca7e1c9885acd +++ /dev/null @@ -1,126 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/10c52150324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/78/10c52150324d0011135ca7e1c9885acd deleted file mode 100644 index f76b203..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/78/10c52150324d0011135ca7e1c9885acd +++ /dev/null @@ -1,63 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/901da8f7a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/78/901da8f7a94c0011135ca7e1c9885acd deleted file mode 100644 index d97c883..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/78/901da8f7a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,22 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/d0591155574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/78/d0591155574d001117ad98d4e911bb97 new file mode 100644 index 0000000..8d9bc11 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/78/d0591155574d001117ad98d4e911bb97 @@ -0,0 +1,186 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/1093f429764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/79/1093f429764d001117ad98d4e911bb97 new file mode 100644 index 0000000..e70db81 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/79/1093f429764d001117ad98d4e911bb97 @@ -0,0 +1,232 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/201843157f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/79/201843157f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..47753af --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/79/201843157f4d001117ad98d4e911bb97 @@ -0,0 +1,345 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/79/c0797d61334d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/79/c0797d61334d0011135ca7e1c9885acd deleted file mode 100644 index 2db59ff..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/79/c0797d61334d0011135ca7e1c9885acd +++ /dev/null @@ -1,77 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - head.next.prev = null; - head.next = null; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/700c6bca584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/700c6bca584d001117ad98d4e911bb97 new file mode 100644 index 0000000..562b2a2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/700c6bca584d001117ad98d4e911bb97 @@ -0,0 +1,196 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0aef600fc4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0aef600fc4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..d4e6c08 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0aef600fc4d00111282df97d7c4d0e2 @@ -0,0 +1,408 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + size++; + prevNode = newNode; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0c9c2fe354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0c9c2fe354d0011135ca7e1c9885acd deleted file mode 100644 index 454116e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/e0c9c2fe354d0011135ca7e1c9885acd +++ /dev/null @@ -1,92 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/908dc6ef774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/908dc6ef774d001117ad98d4e911bb97 new file mode 100644 index 0000000..87e77ab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/908dc6ef774d001117ad98d4e911bb97 @@ -0,0 +1,256 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + r + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c01006151f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c01006151f4d0011135ca7e1c9885acd deleted file mode 100644 index b91630b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c01006151f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,32 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/10d3ddbe354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/10d3ddbe354d0011135ca7e1c9885acd deleted file mode 100644 index b46308c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/10d3ddbe354d0011135ca7e1c9885acd +++ /dev/null @@ -1,90 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8/202e0ae85b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8/202e0ae85b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..77387a9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8/202e0ae85b4d001117ad98d4e911bb97 @@ -0,0 +1,213 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8/704d8dd0804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8/704d8dd0804d001117ad98d4e911bb97 new file mode 100644 index 0000000..202ca78 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8/704d8dd0804d001117ad98d4e911bb97 @@ -0,0 +1,358 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8/8021abdda94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8/8021abdda94c0011135ca7e1c9885acd deleted file mode 100644 index 236ab7b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/8/8021abdda94c0011135ca7e1c9885acd +++ /dev/null @@ -1,18 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8/a07d29e9574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8/a07d29e9574d001117ad98d4e911bb97 new file mode 100644 index 0000000..9e101d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8/a07d29e9574d001117ad98d4e911bb97 @@ -0,0 +1,192 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/40df10af354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/80/40df10af354d0011135ca7e1c9885acd deleted file mode 100644 index f023c98..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/80/40df10af354d0011135ca7e1c9885acd +++ /dev/null @@ -1,88 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/81/50996eb9584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/81/50996eb9584d001117ad98d4e911bb97 new file mode 100644 index 0000000..5594827 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/81/50996eb9584d001117ad98d4e911bb97 @@ -0,0 +1,196 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + while () { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/30a092198f4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/82/30a092198f4c0011135ca7e1c9885acd deleted file mode 100644 index e64547d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/82/30a092198f4c0011135ca7e1c9885acd +++ /dev/null @@ -1,11 +0,0 @@ -package jcf_map.exercise; - -public class Dispari { - - /* - * Esercizio 1 - Esame del 5 settembre 2017 - * - * - */ - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/30d8d284324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/82/30d8d284324d0011135ca7e1c9885acd deleted file mode 100644 index 45c9aeb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/82/30d8d284324d0011135ca7e1c9885acd +++ /dev/null @@ -1,69 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/b06d14245a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/82/b06d14245a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..bdadade --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/82/b06d14245a4d001117ad98d4e911bb97 @@ -0,0 +1,218 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/c0cc9810394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/82/c0cc9810394d0011135ca7e1c9885acd deleted file mode 100644 index 1b8c7d6..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/82/c0cc9810394d0011135ca7e1c9885acd +++ /dev/null @@ -1,130 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/d0a1113b5b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/82/d0a1113b5b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f76ca5b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/82/d0a1113b5b4d001117ad98d4e911bb97 @@ -0,0 +1,200 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == ) + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/301f3bfb344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/83/301f3bfb344d0011135ca7e1c9885acd deleted file mode 100644 index edbc633..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/83/301f3bfb344d0011135ca7e1c9885acd +++ /dev/null @@ -1,82 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/3082c0757c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/83/3082c0757c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..23973ee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/83/3082c0757c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + posNext = 0; + while (posNext < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/84/6078c653594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/84/6078c653594d001117ad98d4e911bb97 new file mode 100644 index 0000000..080a302 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/84/6078c653594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/86/90914b937d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/86/90914b937d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..5d5064c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/86/90914b937d4d001117ad98d4e911bb97 @@ -0,0 +1,318 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/86/c04515591e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/86/c04515591e4d0011135ca7e1c9885acd deleted file mode 100644 index 011eb11..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/86/c04515591e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,19 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/f003fd11764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/87/f003fd11764d001117ad98d4e911bb97 new file mode 100644 index 0000000..8a431ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/f003fd11764d001117ad98d4e911bb97 @@ -0,0 +1,228 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null) return false; + Node currentNode = + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/88/a0bdef22774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/88/a0bdef22774d001117ad98d4e911bb97 new file mode 100644 index 0000000..69fcd95 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/88/a0bdef22774d001117ad98d4e911bb97 @@ -0,0 +1,251 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/89/7039b5ae2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/89/7039b5ae2f4d0011135ca7e1c9885acd deleted file mode 100644 index 1864f09..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/89/7039b5ae2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a059850e874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a059850e874d001117ad98d4e911bb97 new file mode 100644 index 0000000..adba154 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a059850e874d001117ad98d4e911bb97 @@ -0,0 +1,385 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + size--; + nextNode = nNode; + prevNode = pNode; + posNext--; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8a/e0acef47784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/e0acef47784d001117ad98d4e911bb97 new file mode 100644 index 0000000..4b58581 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/e0acef47784d001117ad98d4e911bb97 @@ -0,0 +1,265 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/202f8972334d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/202f8972334d0011135ca7e1c9885acd deleted file mode 100644 index 8e41e06..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/202f8972334d0011135ca7e1c9885acd +++ /dev/null @@ -1,77 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - head.next.prev = null; - head = head.next; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/20435a372f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/20435a372f4d0011135ca7e1c9885acd deleted file mode 100644 index df92adb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/20435a372f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,36 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/d057f7a57c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/d057f7a57c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b62eff0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/d057f7a57c4d001117ad98d4e911bb97 @@ -0,0 +1,302 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8c/5059e604304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/5059e604304d0011135ca7e1c9885acd deleted file mode 100644 index d0acc3d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/8c/5059e604304d0011135ca7e1c9885acd +++ /dev/null @@ -1,55 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/600dc8273a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/a038bd36574d001117ad98d4e911bb97 similarity index 72% rename from .metadata/.plugins/org.eclipse.core.resources/.history/2e/600dc8273a4d0011135ca7e1c9885acd rename to .metadata/.plugins/org.eclipse.core.resources/.history/8c/a038bd36574d001117ad98d4e911bb97 index 8d5eb6d..f5bba55 100644 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/600dc8273a4d0011135ca7e1c9885acd +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/a038bd36574d001117ad98d4e911bb97 @@ -4,7 +4,7 @@ import java.util.List; import java.util.NoSuchElementException; public class MyLinkedList implements List { - + /* * Classe Nodo */ @@ -128,16 +128,56 @@ public class MyLinkedList implements List { public void add(int index, E item) { if (item == null) throw new NullPointerException(); if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - + // Se l'inserimento è richiesto nella prima posizione if (index == 0) { addFirst(item); return; } - + // Se l'inserimento è richiesto nell'ultima posizione if (index == size) { addLast(item); return; } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; } + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + + } diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/10b4acbefd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/10b4acbefd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..4c66a99 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/10b4acbefd4d00111282df97d7c4d0e2 @@ -0,0 +1,421 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/20777285804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/20777285804d001117ad98d4e911bb97 new file mode 100644 index 0000000..c230714 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/20777285804d001117ad98d4e911bb97 @@ -0,0 +1,354 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0caf323784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0caf323784d001117ad98d4e911bb97 new file mode 100644 index 0000000..37bc607 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/b0caf323784d001117ad98d4e911bb97 @@ -0,0 +1,261 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0278903874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0278903874d001117ad98d4e911bb97 new file mode 100644 index 0000000..09dfb1a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0278903874d001117ad98d4e911bb97 @@ -0,0 +1,385 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + size--; + nextNode = nNode; + prevNode = pNode; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0fb04fb7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0fb04fb7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1d39b1a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/c0fb04fb7b4d001117ad98d4e911bb97 @@ -0,0 +1,296 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/41/e092d7263a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/d0f40741574d001117ad98d4e911bb97 similarity index 70% rename from .metadata/.plugins/org.eclipse.core.resources/.history/41/e092d7263a4d0011135ca7e1c9885acd rename to .metadata/.plugins/org.eclipse.core.resources/.history/8e/d0f40741574d001117ad98d4e911bb97 index 0979822..f81f281 100644 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/41/e092d7263a4d0011135ca7e1c9885acd +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8e/d0f40741574d001117ad98d4e911bb97 @@ -4,7 +4,7 @@ import java.util.List; import java.util.NoSuchElementException; public class MyLinkedList implements List { - + /* * Classe Nodo */ @@ -128,15 +128,58 @@ public class MyLinkedList implements List { public void add(int index, E item) { if (item == null) throw new NullPointerException(); if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - + // Se l'inserimento è richiesto nella prima posizione if (index == 0) { addFirst(item); return; } - + // Se l'inserimento è richiesto nell'ultima posizione if (index == size) { - addLast(); + addLast(item); + return; } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + } } diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/a0eb0f94804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/a0eb0f94804d001117ad98d4e911bb97 new file mode 100644 index 0000000..afeed12 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/a0eb0f94804d001117ad98d4e911bb97 @@ -0,0 +1,354 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastNode == null) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/b07c5d4d794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/b07c5d4d794d001117ad98d4e911bb97 new file mode 100644 index 0000000..a7ff156 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/b07c5d4d794d001117ad98d4e911bb97 @@ -0,0 +1,273 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext = 0; + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/b0adb98f7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/b0adb98f7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..a3381f9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/b0adb98f7c4d001117ad98d4e911bb97 @@ -0,0 +1,301 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/f09fe899394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/9/f09fe899394d0011135ca7e1c9885acd deleted file mode 100644 index dccb934..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/9/f09fe899394d0011135ca7e1c9885acd +++ /dev/null @@ -1,134 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/90/301ef4e2fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/90/301ef4e2fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..cf00280 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/90/301ef4e2fd4d00111282df97d7c4d0e2 @@ -0,0 +1,426 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/90/604506b6764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/90/604506b6764d001117ad98d4e911bb97 new file mode 100644 index 0000000..8e2e8bd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/90/604506b6764d001117ad98d4e911bb97 @@ -0,0 +1,239 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object()[]; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/400ac96f1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/91/400ac96f1e4d0011135ca7e1c9885acd deleted file mode 100644 index 357845c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/91/400ac96f1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,24 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/509455cd7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/91/509455cd7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7fd1afb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/509455cd7b4d001117ad98d4e911bb97 @@ -0,0 +1,292 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0cc65f27b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0cc65f27b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6f68a15 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0cc65f27b4d001117ad98d4e911bb97 @@ -0,0 +1,295 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0d32432764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0d32432764d001117ad98d4e911bb97 new file mode 100644 index 0000000..fe5c34f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/b0d32432764d001117ad98d4e911bb97 @@ -0,0 +1,232 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if () + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/60198f872f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/92/60198f872f4d0011135ca7e1c9885acd deleted file mode 100644 index 08fe111..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/92/60198f872f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,48 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/93/20801486574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/93/20801486574d001117ad98d4e911bb97 new file mode 100644 index 0000000..9324c8e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/93/20801486574d001117ad98d4e911bb97 @@ -0,0 +1,187 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/93/f02274affb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/93/f02274affb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..7f1ead0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/93/f02274affb4d00111282df97d7c4d0e2 @@ -0,0 +1,405 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/94/70730e55324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/94/70730e55324d0011135ca7e1c9885acd deleted file mode 100644 index efde3f2..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/94/70730e55324d0011135ca7e1c9885acd +++ /dev/null @@ -1,67 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/94/c09467597c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/94/c09467597c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ab56193 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/94/c09467597c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + int i = 0; + while (i < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/005505615e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/95/005505615e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..62a3c94 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/005505615e4d001117ad98d4e911bb97 @@ -0,0 +1,235 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(); + } + + private boolean removeRec(Node cur, E object) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/40f5b996394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/95/40f5b996394d0011135ca7e1c9885acd deleted file mode 100644 index 065af6a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/95/40f5b996394d0011135ca7e1c9885acd +++ /dev/null @@ -1,133 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/60026996764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/95/60026996764d001117ad98d4e911bb97 new file mode 100644 index 0000000..0e059c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/60026996764d001117ad98d4e911bb97 @@ -0,0 +1,238 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/d04dec0a5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/95/d04dec0a5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1e440d1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/d04dec0a5a4d001117ad98d4e911bb97 @@ -0,0 +1,216 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/96/1067edbb7b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/96/1067edbb7b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..c65af8e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/96/1067edbb7b4d001117ad98d4e911bb97 @@ -0,0 +1,289 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + } + // Caso in cui sia l'ultimo + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/96/509f2670394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/96/509f2670394d0011135ca7e1c9885acd deleted file mode 100644 index c4922c4..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/96/509f2670394d0011135ca7e1c9885acd +++ /dev/null @@ -1,132 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/906ae3e1864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/906ae3e1864d001117ad98d4e911bb97 new file mode 100644 index 0000000..daa95b2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/906ae3e1864d001117ad98d4e911bb97 @@ -0,0 +1,381 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/f0cfaa937a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/f0cfaa937a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..4afa1e9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/f0cfaa937a4d001117ad98d4e911bb97 @@ -0,0 +1,288 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + lastReturned = head; + posNext = 1; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/98/c0e24a91814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/98/c0e24a91814d001117ad98d4e911bb97 new file mode 100644 index 0000000..75fde4d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/98/c0e24a91814d001117ad98d4e911bb97 @@ -0,0 +1,370 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0fab725764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0fab725764d001117ad98d4e911bb97 new file mode 100644 index 0000000..b235075 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/98/d0fab725764d001117ad98d4e911bb97 @@ -0,0 +1,231 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/99/00d747a7584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/99/00d747a7584d001117ad98d4e911bb97 new file mode 100644 index 0000000..9e101d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/99/00d747a7584d001117ad98d4e911bb97 @@ -0,0 +1,192 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f04ca058574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f04ca058574d001117ad98d4e911bb97 new file mode 100644 index 0000000..65703b6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/f04ca058574d001117ad98d4e911bb97 @@ -0,0 +1,187 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return resul.toString(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/608ec5a8fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/608ec5a8fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..57721c4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/608ec5a8fd4d00111282df97d7c4d0e2 @@ -0,0 +1,415 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/809e7b322f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/809e7b322f4d0011135ca7e1c9885acd deleted file mode 100644 index 9865ad7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/809e7b322f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,37 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8024b776fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8024b776fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..dfa8b3e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8024b776fb4d00111282df97d7c4d0e2 @@ -0,0 +1,402 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9c/a0af664f784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/a0af664f784d001117ad98d4e911bb97 new file mode 100644 index 0000000..016ff52 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/a0af664f784d001117ad98d4e911bb97 @@ -0,0 +1,267 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9c/d0063f717e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/d0063f717e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ef90512 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/d0063f717e4d001117ad98d4e911bb97 @@ -0,0 +1,325 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + return data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9d/30b44c62814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/30b44c62814d001117ad98d4e911bb97 new file mode 100644 index 0000000..7c55020 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/30b44c62814d001117ad98d4e911bb97 @@ -0,0 +1,367 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9d/60b5b235764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/60b5b235764d001117ad98d4e911bb97 new file mode 100644 index 0000000..89173c2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/60b5b235764d001117ad98d4e911bb97 @@ -0,0 +1,232 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0672cfb804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0672cfb804d001117ad98d4e911bb97 new file mode 100644 index 0000000..2a31dcb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0672cfb804d001117ad98d4e911bb97 @@ -0,0 +1,366 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0afe3437a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0afe3437a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..027add7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/a0afe3437a4d001117ad98d4e911bb97 @@ -0,0 +1,288 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + lastReturned = null; + posNext = 0; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/107553371e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/107553371e4d0011135ca7e1c9885acd deleted file mode 100644 index 62423f1..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/107553371e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,16 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/70a76b77fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/70a76b77fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..f1e8f18 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/70a76b77fb4d00111282df97d7c4d0e2 @@ -0,0 +1,402 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/a0ee9f5d794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/a0ee9f5d794d001117ad98d4e911bb97 new file mode 100644 index 0000000..6c260df --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/a0ee9f5d794d001117ad98d4e911bb97 @@ -0,0 +1,275 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/b0b7f7e8354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/b0b7f7e8354d0011135ca7e1c9885acd deleted file mode 100644 index da3bd30..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/b0b7f7e8354d0011135ca7e1c9885acd +++ /dev/null @@ -1,91 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/d033c4cb584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/d033c4cb584d001117ad98d4e911bb97 new file mode 100644 index 0000000..29fb7af --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/d033c4cb584d001117ad98d4e911bb97 @@ -0,0 +1,197 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a2/d0a7910ffb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/d0a7910ffb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..a90055e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a2/d0a7910ffb4d00111282df97d7c4d0e2 @@ -0,0 +1,397 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/15/d05528283a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/4062f45e514d001117ad98d4e911bb97 similarity index 72% rename from .metadata/.plugins/org.eclipse.core.resources/.history/15/d05528283a4d0011135ca7e1c9885acd rename to .metadata/.plugins/org.eclipse.core.resources/.history/a3/4062f45e514d001117ad98d4e911bb97 index 51cd951..3137bcb 100644 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/15/d05528283a4d0011135ca7e1c9885acd +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/4062f45e514d001117ad98d4e911bb97 @@ -4,7 +4,7 @@ import java.util.List; import java.util.NoSuchElementException; public class MyLinkedList implements List { - + /* * Classe Nodo */ @@ -128,17 +128,56 @@ public class MyLinkedList implements List { public void add(int index, E item) { if (item == null) throw new NullPointerException(); if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - + // Se l'inserimento è richiesto nella prima posizione if (index == 0) { addFirst(item); return; } - + // Se l'inserimento è richiesto nell'ultima posizione if (index == size) { addLast(item); return; } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; } + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + + } diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/d06318c5a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a4/d06318c5a94c0011135ca7e1c9885acd deleted file mode 100644 index 383ea19..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a4/d06318c5a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,16 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a5/5059fde2764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/5059fde2764d001117ad98d4e911bb97 new file mode 100644 index 0000000..a259db4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/5059fde2764d001117ad98d4e911bb97 @@ -0,0 +1,241 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a5/508416ad814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/508416ad814d001117ad98d4e911bb97 new file mode 100644 index 0000000..3388a3b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/508416ad814d001117ad98d4e911bb97 @@ -0,0 +1,371 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a5/603da8ee584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/603da8ee584d001117ad98d4e911bb97 new file mode 100644 index 0000000..03e6309 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/603da8ee584d001117ad98d4e911bb97 @@ -0,0 +1,197 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + if () + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a5/80cdd584764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/80cdd584764d001117ad98d4e911bb97 new file mode 100644 index 0000000..be7ada1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a5/80cdd584764d001117ad98d4e911bb97 @@ -0,0 +1,237 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f082faba784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f082faba784d001117ad98d4e911bb97 new file mode 100644 index 0000000..b2369a1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a6/f082faba784d001117ad98d4e911bb97 @@ -0,0 +1,270 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/a01417d4794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/a01417d4794d001117ad98d4e911bb97 new file mode 100644 index 0000000..65c2dda --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/a01417d4794d001117ad98d4e911bb97 @@ -0,0 +1,283 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/b05fc276a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/b05fc276a94c0011135ca7e1c9885acd deleted file mode 100644 index 623bca4..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/b05fc276a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,12 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/30e19efa1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/30e19efa1e4d0011135ca7e1c9885acd deleted file mode 100644 index 7a3a6fc..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/30e19efa1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,30 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/a014b2c37b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/a014b2c37b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..45fd79c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/a014b2c37b4d001117ad98d4e911bb97 @@ -0,0 +1,289 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + } + // Caso in cui sia l'ultimo + if () + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/e08a5293874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/e08a5293874d001117ad98d4e911bb97 new file mode 100644 index 0000000..929e1d2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/e08a5293874d001117ad98d4e911bb97 @@ -0,0 +1,388 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/105caa031e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/105caa031e4d0011135ca7e1c9885acd deleted file mode 100644 index 6adc77a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/105caa031e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,5 +0,0 @@ -package list.mylinkedlist; - -public class MyLinkedList { - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/502e6960594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/502e6960594d001117ad98d4e911bb97 new file mode 100644 index 0000000..76e80a7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/502e6960594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi in mezzo + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c05006351e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c05006351e4d0011135ca7e1c9885acd deleted file mode 100644 index ed24e75..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c05006351e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,14 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c068bd71354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c068bd71354d0011135ca7e1c9885acd deleted file mode 100644 index e745a33..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c068bd71354d0011135ca7e1c9885acd +++ /dev/null @@ -1,85 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/d0db81781e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/d0db81781e4d0011135ca7e1c9885acd deleted file mode 100644 index 7cae160..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/d0db81781e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,26 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node() { - - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/f01b6fc6324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/f01b6fc6324d0011135ca7e1c9885acd deleted file mode 100644 index 732351f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/f01b6fc6324d0011135ca7e1c9885acd +++ /dev/null @@ -1,78 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp; - if (size == 1) { - tmp = head.data; - head = tail = null; - return tmp; - } else { - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/700a24cc814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/700a24cc814d001117ad98d4e911bb97 new file mode 100644 index 0000000..a33981e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/700a24cc814d001117ad98d4e911bb97 @@ -0,0 +1,373 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20bcc8d9364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20bcc8d9364d0011135ca7e1c9885acd deleted file mode 100644 index 6133419..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/20bcc8d9364d0011135ca7e1c9885acd +++ /dev/null @@ -1,98 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/a0c7558e1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/a0c7558e1e4d0011135ca7e1c9885acd deleted file mode 100644 index f485d71..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/a0c7558e1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,28 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/c0df257e804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/c0df257e804d001117ad98d4e911bb97 new file mode 100644 index 0000000..eb1ab48 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/c0df257e804d001117ad98d4e911bb97 @@ -0,0 +1,353 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/af/307c879a324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/af/307c879a324d0011135ca7e1c9885acd deleted file mode 100644 index d02f5c2..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/af/307c879a324d0011135ca7e1c9885acd +++ /dev/null @@ -1,71 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b/9091056f7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b/9091056f7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..59b5bf4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b/9091056f7e4d001117ad98d4e911bb97 @@ -0,0 +1,324 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + return data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b/d027169ffd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/b/d027169ffd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..5e4d1e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b/d027169ffd4d00111282df97d7c4d0e2 @@ -0,0 +1,414 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a0154147314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a0154147314d0011135ca7e1c9885acd deleted file mode 100644 index 7605e40..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a0154147314d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a032422b7f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a032422b7f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..dad6301 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a032422b7f4d001117ad98d4e911bb97 @@ -0,0 +1,345 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b1/006d098e794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/006d098e794d001117ad98d4e911bb97 new file mode 100644 index 0000000..ec60700 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/006d098e794d001117ad98d4e911bb97 @@ -0,0 +1,281 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/40ccf410354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/40ccf410354d0011135ca7e1c9885acd deleted file mode 100644 index 9fa7f5d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/40ccf410354d0011135ca7e1c9885acd +++ /dev/null @@ -1,81 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60dbd5067f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60dbd5067f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..117a895 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/60dbd5067f4d001117ad98d4e911bb97 @@ -0,0 +1,340 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b2/f03ebcd07b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/f03ebcd07b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..312cbf5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b2/f03ebcd07b4d001117ad98d4e911bb97 @@ -0,0 +1,292 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8026f497874d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8026f497874d001117ad98d4e911bb97 new file mode 100644 index 0000000..884c86e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8026f497874d001117ad98d4e911bb97 @@ -0,0 +1,390 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/90de2ed2774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/90de2ed2774d001117ad98d4e911bb97 new file mode 100644 index 0000000..6fe4e21 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/90de2ed2774d001117ad98d4e911bb97 @@ -0,0 +1,253 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e088ddff5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e088ddff5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..79d4c9a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/e088ddff5a4d001117ad98d4e911bb97 @@ -0,0 +1,195 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/2004e3a3374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/2004e3a3374d0011135ca7e1c9885acd deleted file mode 100644 index 2b4ec16..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/2004e3a3374d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node newNode = newNode; - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/30129ddc804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/30129ddc804d001117ad98d4e911bb97 new file mode 100644 index 0000000..5504189 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/30129ddc804d001117ad98d4e911bb97 @@ -0,0 +1,363 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + } + // Se è un elemento generico + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/70084afa344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/70084afa344d0011135ca7e1c9885acd deleted file mode 100644 index ab2dc78..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/70084afa344d0011135ca7e1c9885acd +++ /dev/null @@ -1,81 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/e0d76a61fe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/e0d76a61fe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..956f8e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/e0d76a61fe4d00111282df97d7c4d0e2 @@ -0,0 +1,431 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = nextNode; + newNode.next = prevNode; + prevNode.next = newNode; + lastReturned = null; + posNext++; + size++; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f0bb64f85b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f0bb64f85b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1e9cf2e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b6/f0bb64f85b4d001117ad98d4e911bb97 @@ -0,0 +1,218 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30cb4ab9384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30cb4ab9384d0011135ca7e1c9885acd deleted file mode 100644 index 8d2fa0a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b7/30cb4ab9384d0011135ca7e1c9885acd +++ /dev/null @@ -1,121 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6052de592f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6052de592f4d0011135ca7e1c9885acd deleted file mode 100644 index 45c93d7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6052de592f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,40 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/70bf12691e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/70bf12691e4d0011135ca7e1c9885acd deleted file mode 100644 index 7eb4c8f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/70bf12691e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,21 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/406d42d37e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/406d42d37e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6f3f56d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/406d42d37e4d001117ad98d4e911bb97 @@ -0,0 +1,331 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/b0ce8fb82f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/b0ce8fb82f4d0011135ca7e1c9885acd deleted file mode 100644 index c7da99f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/b0ce8fb82f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ba/4080dec77b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/4080dec77b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..a2c2ec2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/4080dec77b4d001117ad98d4e911bb97 @@ -0,0 +1,290 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if () + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ba/9040418b5e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/9040418b5e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..8d91f69 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/9040418b5e4d001117ad98d4e911bb97 @@ -0,0 +1,235 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(head.next, object); + } + + private boolean removeRec(Node current, E object) { + if (current == null) return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ba/e028bda0804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/e028bda0804d001117ad98d4e911bb97 new file mode 100644 index 0000000..e9aa574 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ba/e028bda0804d001117ad98d4e911bb97 @@ -0,0 +1,355 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bb/007503241e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/bb/007503241e4d0011135ca7e1c9885acd deleted file mode 100644 index b868b49..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/bb/007503241e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,10 +0,0 @@ -package list.mylinkedlist; - -public class MyLinkedList { - - /* - * Classe Nodo - */ - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bb/60487d22594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/bb/60487d22594d001117ad98d4e911bb97 new file mode 100644 index 0000000..8f5ef50 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bb/60487d22594d001117ad98d4e911bb97 @@ -0,0 +1,201 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/203da234314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/203da234314d0011135ca7e1c9885acd deleted file mode 100644 index 30f3698..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/203da234314d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/60c48dc5794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/60c48dc5794d001117ad98d4e911bb97 new file mode 100644 index 0000000..b374d86 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/60c48dc5794d001117ad98d4e911bb97 @@ -0,0 +1,282 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a0eea647794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a0eea647794d001117ad98d4e911bb97 new file mode 100644 index 0000000..da2a87d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/a0eea647794d001117ad98d4e911bb97 @@ -0,0 +1,273 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode = null; + private Node lastReturned = null; + private int posNext = 0; + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/b0fb6ef6354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/b0fb6ef6354d0011135ca7e1c9885acd deleted file mode 100644 index 561147c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/b0fb6ef6354d0011135ca7e1c9885acd +++ /dev/null @@ -1,92 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20eadfba384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20eadfba384d0011135ca7e1c9885acd deleted file mode 100644 index befc509..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20eadfba384d0011135ca7e1c9885acd +++ /dev/null @@ -1,122 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/30d58f43784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/be/30d58f43784d001117ad98d4e911bb97 new file mode 100644 index 0000000..f9294ae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/30d58f43784d001117ad98d4e911bb97 @@ -0,0 +1,265 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/8004ad075e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/be/8004ad075e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..8850179 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/8004ad075e4d001117ad98d4e911bb97 @@ -0,0 +1,230 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/706659f75b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/706659f75b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f1e0667 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/706659f75b4d001117ad98d4e911bb97 @@ -0,0 +1,216 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/d0001202764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/d0001202764d001117ad98d4e911bb97 new file mode 100644 index 0000000..949a6a0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/d0001202764d001117ad98d4e911bb97 @@ -0,0 +1,228 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null) return false; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/5009faf9584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/5009faf9584d001117ad98d4e911bb97 new file mode 100644 index 0000000..fa62541 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/5009faf9584d001117ad98d4e911bb97 @@ -0,0 +1,201 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + node = head; + if () + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/505e349c314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/505e349c314d0011135ca7e1c9885acd deleted file mode 100644 index f7b6838..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/505e349c314d0011135ca7e1c9885acd +++ /dev/null @@ -1,60 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/6085b9c7764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/6085b9c7764d001117ad98d4e911bb97 new file mode 100644 index 0000000..65f3786 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/6085b9c7764d001117ad98d4e911bb97 @@ -0,0 +1,241 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90cca37b2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90cca37b2f4d0011135ca7e1c9885acd deleted file mode 100644 index fa7ea8b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90cca37b2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,48 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/f0531afb384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/f0531afb384d0011135ca7e1c9885acd deleted file mode 100644 index 51e7a60..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/f0531afb384d0011135ca7e1c9885acd +++ /dev/null @@ -1,128 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/501c44aa324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/501c44aa324d0011135ca7e1c9885acd deleted file mode 100644 index 5938a4b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/501c44aa324d0011135ca7e1c9885acd +++ /dev/null @@ -1,72 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - Node tmp = head; - head = tail = null; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/600c34831e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/600c34831e4d0011135ca7e1c9885acd deleted file mode 100644 index 6955e86..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/600c34831e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,26 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b0f50722774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b0f50722774d001117ad98d4e911bb97 new file mode 100644 index 0000000..d68cfac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/b0f50722774d001117ad98d4e911bb97 @@ -0,0 +1,251 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c2/a0e545d9384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c2/a0e545d9384d0011135ca7e1c9885acd deleted file mode 100644 index 0e74232..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c2/a0e545d9384d0011135ca7e1c9885acd +++ /dev/null @@ -1,124 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/50ce1dbca94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/50ce1dbca94c0011135ca7e1c9885acd deleted file mode 100644 index ac046d0..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/50ce1dbca94c0011135ca7e1c9885acd +++ /dev/null @@ -1,14 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/603cb0c2784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/603cb0c2784d001117ad98d4e911bb97 new file mode 100644 index 0000000..23a5241 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/603cb0c2784d001117ad98d4e911bb97 @@ -0,0 +1,271 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80a71e2afe4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80a71e2afe4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..d3b1797 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80a71e2afe4d00111282df97d7c4d0e2 @@ -0,0 +1,429 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = nextNode; + newNode.next = prevNode; + prevNode.next = newNode; + lastReturned = null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80b938f9764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80b938f9764d001117ad98d4e911bb97 new file mode 100644 index 0000000..67f97e3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/80b938f9764d001117ad98d4e911bb97 @@ -0,0 +1,246 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/9051f9251e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c4/9051f9251e4d0011135ca7e1c9885acd deleted file mode 100644 index ea2f709..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c4/9051f9251e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,12 +0,0 @@ -package list.mylinkedlist; - -implements java.array:list; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c5/103f63c3804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/103f63c3804d001117ad98d4e911bb97 new file mode 100644 index 0000000..9895fae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/103f63c3804d001117ad98d4e911bb97 @@ -0,0 +1,356 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if () + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c6/00fab5c27e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c6/00fab5c27e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..b85bf30 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c6/00fab5c27e4d001117ad98d4e911bb97 @@ -0,0 +1,330 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/90af0ff8864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/90af0ff8864d001117ad98d4e911bb97 new file mode 100644 index 0000000..63b4218 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/90af0ff8864d001117ad98d4e911bb97 @@ -0,0 +1,382 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + size--; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/c098b1e7594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/c098b1e7594d001117ad98d4e911bb97 new file mode 100644 index 0000000..4bb7007 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/c098b1e7594d001117ad98d4e911bb97 @@ -0,0 +1,214 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c9/0046b2b6384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/0046b2b6384d0011135ca7e1c9885acd deleted file mode 100644 index 681e580..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/c9/0046b2b6384d0011135ca7e1c9885acd +++ /dev/null @@ -1,121 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c9/f0440658594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/f0440658594d001117ad98d4e911bb97 new file mode 100644 index 0000000..765c761 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c9/f0440658594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o il secondo + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/50f3ed82794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/50f3ed82794d001117ad98d4e911bb97 new file mode 100644 index 0000000..c034fcf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/50f3ed82794d001117ad98d4e911bb97 @@ -0,0 +1,277 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/60fbbc12304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/60fbbc12304d0011135ca7e1c9885acd deleted file mode 100644 index c3bfb72..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/60fbbc12304d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/c08488a2594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/c08488a2594d001117ad98d4e911bb97 new file mode 100644 index 0000000..e68e20c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/c08488a2594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.) + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d08127f97e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d08127f97e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..3c48e4b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/d08127f97e4d001117ad98d4e911bb97 @@ -0,0 +1,335 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e02a8003364d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e02a8003364d0011135ca7e1c9885acd deleted file mode 100644 index e7fb7d6..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e02a8003364d0011135ca7e1c9885acd +++ /dev/null @@ -1,92 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e05b733c334d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e05b733c334d0011135ca7e1c9885acd deleted file mode 100644 index 0cc777f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/e05b733c334d0011135ca7e1c9885acd +++ /dev/null @@ -1,76 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - head.next = null; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/70f59fc0354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/70f59fc0354d0011135ca7e1c9885acd deleted file mode 100644 index 32e1658..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/70f59fc0354d0011135ca7e1c9885acd +++ /dev/null @@ -1,90 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) return new SuchElementException(); - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f01161f7374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f01161f7374d0011135ca7e1c9885acd deleted file mode 100644 index ad554cb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/f01161f7374d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cd/20b02cd2814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/20b02cd2814d001117ad98d4e911bb97 new file mode 100644 index 0000000..6217b93 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/20b02cd2814d001117ad98d4e911bb97 @@ -0,0 +1,373 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cd/f08de8e1764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/f08de8e1764d001117ad98d4e911bb97 new file mode 100644 index 0000000..65f3786 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cd/f08de8e1764d001117ad98d4e911bb97 @@ -0,0 +1,241 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/00b59c4a374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/00b59c4a374d0011135ca7e1c9885acd deleted file mode 100644 index 045e11d..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/00b59c4a374d0011135ca7e1c9885acd +++ /dev/null @@ -1,107 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/7014cfdd7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/7014cfdd7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..133b4e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/7014cfdd7e4d001117ad98d4e911bb97 @@ -0,0 +1,334 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + nextNode = + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/a020f2c4794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/a020f2c4794d001117ad98d4e911bb97 new file mode 100644 index 0000000..57fa919 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/a020f2c4794d001117ad98d4e911bb97 @@ -0,0 +1,282 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ed5a49594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ed5a49594d001117ad98d4e911bb97 new file mode 100644 index 0000000..080a302 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/c0ed5a49594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cf/301dffd87b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/301dffd87b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..45d0068 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/301dffd87b4d001117ad98d4e911bb97 @@ -0,0 +1,293 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 1; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cf/90ba5a017d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/90ba5a017d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..264c0cb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/90ba5a017d4d001117ad98d4e911bb97 @@ -0,0 +1,307 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + public boolean hasNext() { + return nextNode != null; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cf/a01fd7d8774d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/a01fd7d8774d001117ad98d4e911bb97 new file mode 100644 index 0000000..1b661ee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/a01fd7d8774d001117ad98d4e911bb97 @@ -0,0 +1,255 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d/30fd20defb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/d/30fd20defb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..4a9a76b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d/30fd20defb4d00111282df97d7c4d0e2 @@ -0,0 +1,406 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(data, null, null); + size++; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d/606e191d7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d/606e191d7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..effea1d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d/606e191d7e4d001117ad98d4e911bb97 @@ -0,0 +1,322 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + nextNode = nextNode.next; + prevNode = nextNode.prev; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d0/a0deb2a4344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d0/a0deb2a4344d0011135ca7e1c9885acd deleted file mode 100644 index 742c120..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d0/a0deb2a4344d0011135ca7e1c9885acd +++ /dev/null @@ -1,80 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - head.next.prev = null; - - head = head.next; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/401839a5794d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/401839a5794d001117ad98d4e911bb97 new file mode 100644 index 0000000..43542ea --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/401839a5794d001117ad98d4e911bb97 @@ -0,0 +1,281 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/60cbf7405b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/60cbf7405b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f899b32 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/60cbf7405b4d001117ad98d4e911bb97 @@ -0,0 +1,202 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + + } + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/00c04c0a3a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/00c04c0a3a4d0011135ca7e1c9885acd deleted file mode 100644 index ad40349..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/00c04c0a3a4d0011135ca7e1c9885acd +++ /dev/null @@ -1,137 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - if (index == 0) { - addFirst(item); - return; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/40b810ea764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/40b810ea764d001117ad98d4e911bb97 new file mode 100644 index 0000000..7d3ad85 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/40b810ea764d001117ad98d4e911bb97 @@ -0,0 +1,243 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5021b4c4394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5021b4c4394d0011135ca7e1c9885acd deleted file mode 100644 index 267ced7..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/5021b4c4394d0011135ca7e1c9885acd +++ /dev/null @@ -1,134 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - if (index == 0) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d3/1086319c5b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/1086319c5b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..8615b2e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/1086319c5b4d001117ad98d4e911bb97 @@ -0,0 +1,212 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d3/e0040337ff4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/e0040337ff4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..65d3ed4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/e0040337ff4d00111282df97d7c4d0e2 @@ -0,0 +1,438 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + return new MyLinkedListIterator(); + } + + public ListIterator listIterator() { + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (data == null) throw new NullPointerException(); + lastReturned.data = data; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/002684402f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/002684402f4d0011135ca7e1c9885acd deleted file mode 100644 index 82a59cf..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/002684402f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,36 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/20fc4e7bfb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/20fc4e7bfb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..787bec6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/20fc4e7bfb4d00111282df97d7c4d0e2 @@ -0,0 +1,403 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/00259d007f4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/00259d007f4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f9d83b9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/00259d007f4d001117ad98d4e911bb97 @@ -0,0 +1,338 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/404e44ab324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/404e44ab324d0011135ca7e1c9885acd deleted file mode 100644 index 2b3dc54..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/404e44ab324d0011135ca7e1c9885acd +++ /dev/null @@ -1,72 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - if (size == 1) { - E tmp = head.data; - head = tail = null; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c030968e864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c030968e864d001117ad98d4e911bb97 new file mode 100644 index 0000000..cf731b2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c030968e864d001117ad98d4e911bb97 @@ -0,0 +1,377 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c04b8a237e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c04b8a237e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..820e204 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c04b8a237e4d001117ad98d4e911bb97 @@ -0,0 +1,323 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + nextNode = nextNode.next; + prevNode = nextNode.prev; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c09ebc84fb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c09ebc84fb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..b6c6019 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/c09ebc84fb4d00111282df97d7c4d0e2 @@ -0,0 +1,405 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/10c828e95c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/10c828e95c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..54c7184 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/10c828e95c4d001117ad98d4e911bb97 @@ -0,0 +1,221 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/30fc1da4354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d7/30fc1da4354d0011135ca7e1c9885acd deleted file mode 100644 index e37e599..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d7/30fc1da4354d0011135ca7e1c9885acd +++ /dev/null @@ -1,86 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d8/80ed6fd52f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d8/80ed6fd52f4d0011135ca7e1c9885acd deleted file mode 100644 index 06ea5d1..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d8/80ed6fd52f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30fb53fd834d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30fb53fd834d001117ad98d4e911bb97 new file mode 100644 index 0000000..dfac56b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30fb53fd834d001117ad98d4e911bb97 @@ -0,0 +1,374 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/9074038c5d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/9074038c5d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..e9d80c9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/9074038c5d4d001117ad98d4e911bb97 @@ -0,0 +1,225 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/e0b72a69a84c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/e0b72a69a84c0011135ca7e1c9885acd deleted file mode 100644 index 21e3c23..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/e0b72a69a84c0011135ca7e1c9885acd +++ /dev/null @@ -1,7 +0,0 @@ -package jcf_map.exercise; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - */ -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/10811de0a94c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/da/10811de0a94c0011135ca7e1c9885acd deleted file mode 100644 index f08fff1..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/da/10811de0a94c0011135ca7e1c9885acd +++ /dev/null @@ -1,18 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/908b1c2eaa4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/da/908b1c2eaa4c0011135ca7e1c9885acd deleted file mode 100644 index 442fcab..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/da/908b1c2eaa4c0011135ca7e1c9885acd +++ /dev/null @@ -1,24 +0,0 @@ -package jcf_map.exercise; - -import java.util.Map; - -import binary_tree.BinaryNode; - -public class BinaryTreeMap { - /* - * Esercizio 1 - Esame del secondo parziale 8/1/2019 - * Scrivere un metodo generico statico ContaDuplicati che conta il numero - * di oggetti duplicati (non univoci) contenuti in un albero binario. - * Il risultato è il conteggio totale degli elementi che risultano duplicati - * (non il numero totale di occorrenze, ma il numero di oggetti distinti che - * hanno almeno un duplicato) - */ - public static Map ContaDuplicati(BinaryNode node) { - - } - - protected static Map ContaDuplicati(BinaryNode node, HashMap mappa) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/90fd1cfafb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/da/90fd1cfafb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..63f7568 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/da/90fd1cfafb4d00111282df97d7c4d0e2 @@ -0,0 +1,408 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(data, null, null); + size++; + prevNode = + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/da/c017ad9e374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/da/c017ad9e374d0011135ca7e1c9885acd deleted file mode 100644 index 3fb13dd..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/da/c017ad9e374d0011135ca7e1c9885acd +++ /dev/null @@ -1,114 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/db/a096ef26594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/db/a096ef26594d001117ad98d4e911bb97 new file mode 100644 index 0000000..27eaf3d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/db/a096ef26594d001117ad98d4e911bb97 @@ -0,0 +1,203 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + + } + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50fce311374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50fce311374d0011135ca7e1c9885acd deleted file mode 100644 index bf9af33..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50fce311374d0011135ca7e1c9885acd +++ /dev/null @@ -1,101 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/90bc596a594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/de/90bc596a594d001117ad98d4e911bb97 new file mode 100644 index 0000000..9fc47b3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/de/90bc596a594d001117ad98d4e911bb97 @@ -0,0 +1,210 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/d0d81ce2804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/de/d0d81ce2804d001117ad98d4e911bb97 new file mode 100644 index 0000000..1b6a985 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/de/d0d81ce2804d001117ad98d4e911bb97 @@ -0,0 +1,364 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/e0f7a0da2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/de/e0f7a0da2f4d0011135ca7e1c9885acd deleted file mode 100644 index 778b6be..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/de/e0f7a0da2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,55 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/0040967f7d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/0040967f7d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..137bd8e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/0040967f7d4d001117ad98d4e911bb97 @@ -0,0 +1,315 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/20c27ace754d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/20c27ace754d001117ad98d4e911bb97 new file mode 100644 index 0000000..f2100ed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/20c27ace754d001117ad98d4e911bb97 @@ -0,0 +1,228 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null) return false; + for () + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/70f187997d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/70f187997d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7034f98 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/70f187997d4d001117ad98d4e911bb97 @@ -0,0 +1,318 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/df/80ab8c475b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/df/80ab8c475b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..07cc66e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/df/80ab8c475b4d001117ad98d4e911bb97 @@ -0,0 +1,202 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + } + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e/507ab028764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e/507ab028764d001117ad98d4e911bb97 new file mode 100644 index 0000000..b912b91 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e/507ab028764d001117ad98d4e911bb97 @@ -0,0 +1,231 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e/f01b0ddc384d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e/f01b0ddc384d0011135ca7e1c9885acd deleted file mode 100644 index 5c70255..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e/f01b0ddc384d0011135ca7e1c9885acd +++ /dev/null @@ -1,126 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e/f0675cc2344d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e/f0675cc2344d0011135ca7e1c9885acd deleted file mode 100644 index d0d99b0..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e/f0675cc2344d0011135ca7e1c9885acd +++ /dev/null @@ -1,81 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - head.next.prev = null; - - head = head.next; - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/808f90b0374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/808f90b0374d0011135ca7e1c9885acd deleted file mode 100644 index efd0825..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/808f90b0374d0011135ca7e1c9885acd +++ /dev/null @@ -1,113 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(); - } - size++; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e0/b02052d1574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/b02052d1574d001117ad98d4e911bb97 new file mode 100644 index 0000000..3fb0490 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e0/b02052d1574d001117ad98d4e911bb97 @@ -0,0 +1,193 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if () { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/302c0c891e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/302c0c891e4d0011135ca7e1c9885acd deleted file mode 100644 index 4693970..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/302c0c891e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,27 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Data - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - - } - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/3045076b5a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/3045076b5a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..0c2d9e6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/3045076b5a4d001117ad98d4e911bb97 @@ -0,0 +1,220 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + size--; + return true; + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e1/e02939a4784d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/e02939a4784d001117ad98d4e911bb97 new file mode 100644 index 0000000..ed066f9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e1/e02939a4784d001117ad98d4e911bb97 @@ -0,0 +1,268 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e2/603ac3da864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/603ac3da864d001117ad98d4e911bb97 new file mode 100644 index 0000000..b7f3fa2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e2/603ac3da864d001117ad98d4e911bb97 @@ -0,0 +1,380 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/609cff06304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/609cff06304d0011135ca7e1c9885acd deleted file mode 100644 index 65b5a6b..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/609cff06304d0011135ca7e1c9885acd +++ /dev/null @@ -1,57 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a0ea685f804d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a0ea685f804d001117ad98d4e911bb97 new file mode 100644 index 0000000..8edf9bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e3/a0ea685f804d001117ad98d4e911bb97 @@ -0,0 +1,350 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + @Override + public void remove() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e4/205450e8354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e4/205450e8354d0011135ca7e1c9885acd deleted file mode 100644 index aecb996..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e4/205450e8354d0011135ca7e1c9885acd +++ /dev/null @@ -1,91 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/00af1de57b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/00af1de57b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1179d82 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/00af1de57b4d001117ad98d4e911bb97 @@ -0,0 +1,294 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head.next; + prevNode = head; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e7/3013d1131f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e7/3013d1131f4d0011135ca7e1c9885acd deleted file mode 100644 index 1ff4cbc..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e7/3013d1131f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,31 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e8/a049ab1c864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/a049ab1c864d001117ad98d4e911bb97 new file mode 100644 index 0000000..e1964ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/a049ab1c864d001117ad98d4e911bb97 @@ -0,0 +1,374 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/00e6be175d4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/00e6be175d4d001117ad98d4e911bb97 new file mode 100644 index 0000000..6f56335 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/00e6be175d4d001117ad98d4e911bb97 @@ -0,0 +1,223 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/300b1d78fd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/300b1d78fd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..150af02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/300b1d78fd4d00111282df97d7c4d0e2 @@ -0,0 +1,414 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/309be5ff864d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/309be5ff864d001117ad98d4e911bb97 new file mode 100644 index 0000000..8d47ba5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/309be5ff864d001117ad98d4e911bb97 @@ -0,0 +1,384 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + size--; + nextNode = nNode; + prevNode = pNode; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/a02e45213a4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/a02e45213a4d0011135ca7e1c9885acd deleted file mode 100644 index d6cfed4..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/a02e45213a4d0011135ca7e1c9885acd +++ /dev/null @@ -1,140 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - if (index < 0 || index > size) throw new IndexOutOfBoundsException(); - - if (index == 0) { - addFirst(item); - return; - } - - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/e07c0cdc7e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/e07c0cdc7e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7f26190 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/e07c0cdc7e4d001117ad98d4e911bb97 @@ -0,0 +1,333 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + prevNode = prevNode.prev; + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/f096c870814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/f096c870814d001117ad98d4e911bb97 new file mode 100644 index 0000000..be1b491 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/f096c870814d001117ad98d4e911bb97 @@ -0,0 +1,368 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/20c46eea314d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/20c46eea314d0011135ca7e1c9885acd deleted file mode 100644 index 52d298e..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/20c46eea314d0011135ca7e1c9885acd +++ /dev/null @@ -1,62 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30d88b7f5b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30d88b7f5b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..4dc8f35 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/30d88b7f5b4d001117ad98d4e911bb97 @@ -0,0 +1,203 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + + } + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/507c0e3f374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/507c0e3f374d0011135ca7e1c9885acd deleted file mode 100644 index 315a97a..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/507c0e3f374d0011135ca7e1c9885acd +++ /dev/null @@ -1,103 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/70e27a56374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/70e27a56374d0011135ca7e1c9885acd deleted file mode 100644 index dcda986..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/70e27a56374d0011135ca7e1c9885acd +++ /dev/null @@ -1,107 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/a07c186e354d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/a07c186e354d0011135ca7e1c9885acd deleted file mode 100644 index b07c0ca..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/a07c186e354d0011135ca7e1c9885acd +++ /dev/null @@ -1,85 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ec/009a9879814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/009a9879814d001117ad98d4e911bb97 new file mode 100644 index 0000000..d4b8f89 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/009a9879814d001117ad98d4e911bb97 @@ -0,0 +1,368 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/00c5c70e334d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/00c5c70e334d0011135ca7e1c9885acd deleted file mode 100644 index 01a4da3..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/00c5c70e334d0011135ca7e1c9885acd +++ /dev/null @@ -1,76 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - - } - size--; - return tmp; - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/204e902f1e4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/204e902f1e4d0011135ca7e1c9885acd deleted file mode 100644 index 239f70f..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/204e902f1e4d0011135ca7e1c9885acd +++ /dev/null @@ -1,12 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/4089760ffc4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/4089760ffc4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..a8e9926 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/4089760ffc4d00111282df97d7c4d0e2 @@ -0,0 +1,409 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/503adbbcfb4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/503adbbcfb4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..b0bfc87 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/503adbbcfb4d00111282df97d7c4d0e2 @@ -0,0 +1,406 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + // Se la lista è vuota + if (size == 0) { + tail = head = new Node(data, null, null); + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/903f2035594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/903f2035594d001117ad98d4e911bb97 new file mode 100644 index 0000000..54174a5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/903f2035594d001117ad98d4e911bb97 @@ -0,0 +1,205 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/2005b9768e4c0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/f/2005b9768e4c0011135ca7e1c9885acd deleted file mode 100644 index 94783fb..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/f/2005b9768e4c0011135ca7e1c9885acd +++ /dev/null @@ -1,5 +0,0 @@ -package jcf_map.exercise; - -public class Dispari { - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d02671bdfd4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d02671bdfd4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..d4ba284 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/d02671bdfd4d00111282df97d7c4d0e2 @@ -0,0 +1,419 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/90903d197a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/90903d197a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..2d95213 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/90903d197a4d001117ad98d4e911bb97 @@ -0,0 +1,285 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a0e404d4574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a0e404d4574d001117ad98d4e911bb97 new file mode 100644 index 0000000..463d7d3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a0e404d4574d001117ad98d4e911bb97 @@ -0,0 +1,191 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return null; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/b08e7deb764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/b08e7deb764d001117ad98d4e911bb97 new file mode 100644 index 0000000..5034519 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/b08e7deb764d001117ad98d4e911bb97 @@ -0,0 +1,243 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i] = currentNode; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/e087f723ff4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/e087f723ff4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..fd8bddb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/e087f723ff4d00111282df97d7c4d0e2 @@ -0,0 +1,438 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (data == null) throw new NullPointerException(); + lastReturned.data = data; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/107ecf8a814d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/107ecf8a814d001117ad98d4e911bb97 new file mode 100644 index 0000000..7edc721 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/107ecf8a814d001117ad98d4e911bb97 @@ -0,0 +1,369 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + + return; + } + // Se è un elemento generico + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/c0601a52324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/c0601a52324d0011135ca7e1c9885acd deleted file mode 100644 index 050c951..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/c0601a52324d0011135ca7e1c9885acd +++ /dev/null @@ -1,67 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f4/20ff08f2594d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/20ff08f2594d001117ad98d4e911bb97 new file mode 100644 index 0000000..2445383 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/20ff08f2594d001117ad98d4e911bb97 @@ -0,0 +1,215 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + } + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f5/50cfaf89574d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f5/50cfaf89574d001117ad98d4e911bb97 new file mode 100644 index 0000000..c5b826d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f5/50cfaf89574d001117ad98d4e911bb97 @@ -0,0 +1,191 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d4ee8d394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d4ee8d394d0011135ca7e1c9885acd deleted file mode 100644 index d52bcae..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d4ee8d394d0011135ca7e1c9885acd +++ /dev/null @@ -1,133 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add(int index, E item) { - if (item == null) throw new NullPointerException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/8088a1e67e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/8088a1e67e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..7bf846e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/8088a1e67e4d001117ad98d4e911bb97 @@ -0,0 +1,334 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0dcbb267e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0dcbb267e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..924f90d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0dcbb267e4d001117ad98d4e911bb97 @@ -0,0 +1,323 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/306865ce2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/306865ce2f4d0011135ca7e1c9885acd deleted file mode 100644 index bf0e0ef..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/306865ce2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,54 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if () - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/609ab05b7c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/609ab05b7c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..1acea55 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/609ab05b7c4d001117ad98d4e911bb97 @@ -0,0 +1,300 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + Node currentNode = head; + int pos = 0; + while (i < index) { + + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f9/50697e5a374d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/50697e5a374d0011135ca7e1c9885acd deleted file mode 100644 index 93a8e62..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/f9/50697e5a374d0011135ca7e1c9885acd +++ /dev/null @@ -1,108 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f9/b0f2ebff584d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/b0f2ebff584d001117ad98d4e911bb97 new file mode 100644 index 0000000..8871e2f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/b0f2ebff584d001117ad98d4e911bb97 @@ -0,0 +1,201 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.) + // Iterazione per la ricerca dell'oggetto + Node currentNode = head; + + while (currentNode.next != null) { + currentNode = currentNode.next; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f9/f0cf52385b4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/f0cf52385b4d001117ad98d4e911bb97 new file mode 100644 index 0000000..ae4fcdf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f9/f0cf52385b4d001117ad98d4e911bb97 @@ -0,0 +1,200 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + + + } + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/802595e85a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/802595e85a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..21f2062 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/802595e85a4d001117ad98d4e911bb97 @@ -0,0 +1,221 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode; + // Caso in cui sia il primo + currentNode = head; + if (currentNode.data.equals(object)) { + removeFirst(); + return true; + } + // Caso in cui sia l'ultimo + currentNode = tail; + if (currentNode.data.equals(object)) { + removeLast(); + return true; + } + // Caso in cui non sia il primo o l'ultimo, sia quindi tra il primo e il secondo (non per forza) + currentNode = head; + while (currentNode.next != null) { + currentNode = currentNode.next; + if (currentNode.data.equals(object)) { + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + size--; + return true; + } + } + return false; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/c0e9e8207a4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/c0e9e8207a4d001117ad98d4e911bb97 new file mode 100644 index 0000000..8e911b5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/c0e9e8207a4d001117ad98d4e911bb97 @@ -0,0 +1,285 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + } + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fb/0056d117304d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/0056d117304d0011135ca7e1c9885acd deleted file mode 100644 index d81522c..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/fb/0056d117304d0011135ca7e1c9885acd +++ /dev/null @@ -1,59 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = - } else { - - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fb/00e45c525e4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/00e45c525e4d001117ad98d4e911bb97 new file mode 100644 index 0000000..f70801c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fb/00e45c525e4d001117ad98d4e911bb97 @@ -0,0 +1,235 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean removeRec(E object) { + if ((object == null) || (head == null)) return false; + if (head.data.equals(object)) { + removeFirst(); + return true; + } else return removeRec(); + } + + private boolean removeRec() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/70397e4f2f4d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/70397e4f2f4d0011135ca7e1c9885acd deleted file mode 100644 index 6ea07a3..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/70397e4f2f4d0011135ca7e1c9885acd +++ /dev/null @@ -1,40 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - - } -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fc/b08ee6f47c4d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/b08ee6f47c4d001117ad98d4e911bb97 new file mode 100644 index 0000000..e0eceeb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fc/b08ee6f47c4d001117ad98d4e911bb97 @@ -0,0 +1,307 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + public boolean hasNext() { + + } + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b09e96bb324d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b09e96bb324d0011135ca7e1c9885acd deleted file mode 100644 index 09a40d3..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b09e96bb324d0011135ca7e1c9885acd +++ /dev/null @@ -1,74 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - if (size == 0) { - head = tail = new Node(item, null, null); - } else { - Node newNode = new Node(item, null, null); - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp; - if (size == 1) { - E tmp = head.data; - head = tail = null; - return tmp; - } - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c09ab21d764d001117ad98d4e911bb97 b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c09ab21d764d001117ad98d4e911bb97 new file mode 100644 index 0000000..0cc84d9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c09ab21d764d001117ad98d4e911bb97 @@ -0,0 +1,228 @@ +package list.mylinkedlist; + +import java.util.List; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0c1cb17394d0011135ca7e1c9885acd b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0c1cb17394d0011135ca7e1c9885acd deleted file mode 100644 index a930e41..0000000 --- a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0c1cb17394d0011135ca7e1c9885acd +++ /dev/null @@ -1,132 +0,0 @@ -package list.mylinkedlist; - -import java.util.List; -import java.util.NoSuchElementException; - -public class MyLinkedList implements List { - - /* - * Classe Nodo - */ - private static class Node { - - // Dati del nodo - private E data; - - // Riferimenti elemento precedente e successivo - private Node prev; - private Node next; - - // Costruttore - public Node(E data, Node prev, Node next) { - this.data = data; - this.prev = prev; - this.next = next; - } - - } - - private Node head = null; - private Node tail = null; - private int size = 0; - - // Costruttore - public MyLinkedList() {} - - // Metodi - - public boolean isEmpty() { - return size == 0; - } - - public int size() { - return size; - } - - public E getFirst() { - if (head == null) throw new NullPointerException(); - return head.data; - } - - public void addFirst(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - head.prev = newNode; - newNode.next = head; - head = newNode; - } - size++; - } - - public E removeFirst() { - if (head == null) throw new NoSuchElementException(); - E tmp = head.data; - if (size == 1) { - head = tail = null; - } else { - Node firstPlace = head; - Node secondPlace = head.next; - - head = secondPlace; - secondPlace.prev = null; - firstPlace.next = null; - } - size--; - return tmp; - } - - public E getLast() { - if (tail == null) throw new NullPointerException(); - return tail.data; - } - - public E removeLast() { - if (tail == null) throw new NoSuchElementException(); - E tmp = tail.data; - if (size == 1) { - head = tail = null; - } else { - Node lastNode = tail; - Node penultimateNode = tail.prev; - - tail = penultimateNode; - penultimateNode.next = null; - lastNode.prev = null; - } - size--; - return tmp; - } - - public void addLast(E item) { - if (item == null) throw new NullPointerException(); - Node newNode = new Node(item, null, null); - if (size == 0) { - head = tail = newNode; - } else { - Node oldLastNode = tail; - oldLastNode.next = newNode; - newNode.prev = oldLastNode; - tail = newNode; - } - size++; - } - - public void clear() { - head = tail = null; - size = 0; - } - - public boolean add(E item) { - if (item == null) throw new NoSuchElementException(); - addLast(item); - return true; - } - - public void add() { - - } - -} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/f091830aff4d00111282df97d7c4d0e2 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/f091830aff4d00111282df97d7c4d0e2 new file mode 100644 index 0000000..c159962 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/f091830aff4d00111282df97d7c4d0e2 @@ -0,0 +1,437 @@ +package list.mylinkedlist; + +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class MyLinkedList implements List { + + /* + * Classe Nodo + */ + private static class Node { + + // Dati del nodo + private E data; + + // Riferimenti elemento precedente e successivo + private Node prev; + private Node next; + + // Costruttore + public Node(E data, Node prev, Node next) { + this.data = data; + this.prev = prev; + this.next = next; + } + + } + + private Node head = null; + private Node tail = null; + private int size = 0; + + // Costruttore + public MyLinkedList() {} + + // Metodi + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + public E getFirst() { + if (head == null) throw new NullPointerException(); + return head.data; + } + + public void addFirst(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + head.prev = newNode; + newNode.next = head; + head = newNode; + } + size++; + } + + public E removeFirst() { + if (head == null) throw new NoSuchElementException(); + E tmp = head.data; + if (size == 1) { + head = tail = null; + } else { + Node firstPlace = head; + Node secondPlace = head.next; + + head = secondPlace; + secondPlace.prev = null; + firstPlace.next = null; + } + size--; + return tmp; + } + + public E getLast() { + if (tail == null) throw new NullPointerException(); + return tail.data; + } + + public E removeLast() { + if (tail == null) throw new NoSuchElementException(); + E tmp = tail.data; + if (size == 1) { + head = tail = null; + } else { + Node lastNode = tail; + Node penultimateNode = tail.prev; + + tail = penultimateNode; + penultimateNode.next = null; + lastNode.prev = null; + } + size--; + return tmp; + } + + public void addLast(E item) { + if (item == null) throw new NullPointerException(); + Node newNode = new Node(item, null, null); + if (size == 0) { + head = tail = newNode; + } else { + Node oldLastNode = tail; + oldLastNode.next = newNode; + newNode.prev = oldLastNode; + tail = newNode; + } + size++; + } + + public void clear() { + head = tail = null; + size = 0; + } + + public boolean add(E item) { + if (item == null) throw new NoSuchElementException(); + addLast(item); + return true; + } + + public void add(int index, E item) { + if (item == null) throw new NullPointerException(); + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); + // Se l'inserimento è richiesto nella prima posizione + if (index == 0) { + addFirst(item); + return; + } + // Se l'inserimento è richiesto nell'ultima posizione + if (index == size) { + addLast(item); + return; + } + // Se l'inserimento è richiesto nel generico posto i + Node newNode = new Node(item, null, null); + + Node prevNode = head; + for (int i = 0; i < index - 1; i++) { + prevNode = prevNode.next; + } + + Node nextNode = prevNode.next; + + prevNode.next = newNode; + newNode.prev = prevNode; + newNode.next = nextNode; + nextNode.prev = newNode; + + size++; + } + + public E get(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + return currentNode.data; + } + + public E set(int index, E item) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException(); + + Node currentNode = head; + for (int i = 0; i < index; i++) { + currentNode = currentNode.next; + } + E oldData = currentNode.data; + currentNode.data = item; + return oldData; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + + } + + public ListIterator listIterator() { + + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (data == null) throw new NullPointerException(;) + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.indexes/e4/96/d8/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.indexes/e4/96/d8/history.index index 54272321c9c66f05d0b8433e0f5767ae6edd302d..92831a18b741f79272c694ff534f8fdffbdf764d 100644 GIT binary patch delta 28 kcmeB>n;|(ti_vJK_6C;8)~wo$Mw`=FH?VA0=XuBk0Dd9}q5uE@ delta 648 zcmbOs*&#PUi_vVO_6C;dfU~!C`+XP$g=3aKJlPR-_W#GjLh~3I7z`Fnl0+7tdu%^g zT!D3GSs#-6Zt2OHPw;TC!0gW7f9HsA&al8EPvU`xlfA1>*o0G6|Njb8(;ZBJ7hWJBe z$l_Nv0LANpLA_vMMJcjG@uf_NkGE@Ou0RTj6`wP};s*YD?#SXFY9QhhdIe08#Y-3I hKpe!!B0L|-oV7C`;uAW11o@FA5@zUZ-o*Kg2>>t{13>@) diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.indexes/e4/9e/1d/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.indexes/e4/9e/1d/history.index index df90cf7349582755dce24cde5a6f8c6c1dca18a4..24c44b3b569c847b423a08c547323f3eedc8bf5a 100644 GIT binary patch delta 36 scmbQJ@sM+Zfuzv^{*Pb%d>I6VW0pTW*%5VC`Lu`lJVpkFjfOK=01kK!=>Px# literal 5137 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 B4afih diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/asdl/.markers.snap index c68038d3f309497e5ec99e26a8e6b41e0a06f83b..f5044ff8258e0633adcff24ff69ac914410a156d 100644 GIT binary patch literal 211420 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 literal 144602 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 PC^z&4OyU0v;Klw2S-wlp literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index 66adea3301f1b17d706bfc472ddf246a6efadadb..6dffc961df1793191e4744324b915f7487550166 100644 GIT binary patch delta 251 zcmX@eb%%F?g1T>ho`P>;rGlZMf}y#UsezS&xq`E6aEOADfsq+6m%d&}QEIBK@#I7n z$&CpijGU&1CT0fa<_4yd_c9t`(QScC_rwJ5%~ni-1WYiu0y+ez{o0I^_cI!(hm@v5 k+-#&^XkukxW@T)IPmjQXh~J-;_b`Y^1%B?S-d%nS0On9cEdT%j delta 186 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 diff --git a/.metadata/.plugins/org.eclipse.core.resources/3.snap b/.metadata/.plugins/org.eclipse.core.resources/3.snap new file mode 100644 index 0000000000000000000000000000000000000000..14d24e98e379e97696873c2615fbdb188f109158 GIT binary patch literal 18047 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 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs index ff92bb2..a815d4c 100644 --- a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs @@ -9,7 +9,9 @@ content_assist_parameters_background,defaultValueBeforeOverriddenFromCSS=255,255 content_assist_parameters_foreground=238,238,238 content_assist_parameters_foreground,defaultValueBeforeOverriddenFromCSS=0,0,0 content_assist_proposals_background=255,255,255 +content_assist_proposals_background,defaultValueBeforeOverriddenFromCSS=255,255,255 content_assist_proposals_foreground=0,0,0 +content_assist_proposals_foreground,defaultValueBeforeOverriddenFromCSS=0,0,0 eclipse.preferences.version=1 java_bracket=249,250,244 java_bracket,defaultValueBeforeOverriddenFromCSS=0,0,0 diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi index b1fd3e5..0448152 100644 --- a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -1,8 +1,8 @@ - - + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration - + @@ -11,9 +11,9 @@ topLevel shellMaximized - - - + + + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation persp.actionSet:org.eclipse.ui.cheatsheets.actionSet @@ -80,2481 +80,2473 @@ persp.editorOnboardingCommand:Show Key Assist$$$Ctrl+Shift+L persp.editorOnboardingCommand:New$$$Ctrl+N persp.editorOnboardingCommand:Open Type$$$Ctrl+Shift+T - - - + + + org.eclipse.e4.primaryNavigationStack - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - - + + View categoryTag:Git - - - - + + + + org.eclipse.e4.secondaryNavigationStack Minimized - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Java - + View categoryTag:Ant - + org.eclipse.e4.secondaryDataStack Oomph - + Java + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Terminal - + View categoryTag:General - + View categoryTag:Oomph NoRestore - + View categoryTag:Oomph NoRestore + + View + categoryTag:Java + - - + + View categoryTag:Help - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:Help - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Help - - + + EditorStack org.eclipse.e4.primaryDataStack active - noFocus - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - + + Editor removeOnHide org.eclipse.jdt.ui.CompilationUnitEditor active - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - - - Editor - removeOnHide - org.eclipse.jdt.ui.CompilationUnitEditor - - + View categoryTag:Java - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:General - + - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + ViewMenu menuContribution:menu - + - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Mylyn - + View categoryTag:Terminal - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Java - + View categoryTag:Ant - + View categoryTag:Oomph NoRestore - + ViewMenu menuContribution:menu - + - + View categoryTag:Oomph NoRestore - + ViewMenu menuContribution:menu - + - - + + + + + View + categoryTag:Java + + ViewMenu + menuContribution:menu + + + + + toolbarSeparator - + - + Draggable - + - + toolbarSeparator - + - + Draggable - - + + - + toolbarSeparator - + - + Draggable - + Draggable - + Draggable - + Draggable - + toolbarSeparator - + - + Draggable - + - + Draggable - + toolbarSeparator - + - + toolbarSeparator - + - + Draggable - + stretch SHOW_RESTORE_MENU - + Draggable HIDEABLE SHOW_RESTORE_MENU - - + + stretch - + Draggable - + Draggable - - + + TrimStack Draggable - + TrimStack Draggable - - + + TrimStack Draggable - + TrimStack Draggable - + TrimStack Draggable - - - - - - + + + + + + platform:cocoa - + platform:cocoa - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + platform:win32 - - - + + + - - - - - - - - - + + + + + + + + + platform:cocoa - - - - - - - - - - - - - - + + + + + + + + + + + + + + platform:cocoa - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - - + + + - - - + + + - - - - - + + + + + - - + + - - - + + + - - - + + + - - - - - - - - - + + + + + + + + + - - + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - + + platform:win32 - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + + - - + + - - + + - - + + - - + + - - - + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - + + + + - - + + - - - - - - + + + + + + - - - - + + + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor removeOnHide - + View categoryTag:Ant - + View categoryTag:Gradle - + View categoryTag:Gradle - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git - + View categoryTag:Git NoRestore - + View categoryTag:Git - + View categoryTag:Help - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Debug - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java Browsing - + View categoryTag:Java - + View categoryTag:General - + View categoryTag:Java - + View categoryTag:Java - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Language Servers - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Maven - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Mylyn - + View categoryTag:Oomph - + View categoryTag:Oomph NoRestore - + View categoryTag:Plug-in Development - + View categoryTag:General - + View categoryTag:Version Control (Team) - + View categoryTag:Version Control (Team) - + View categoryTag:Terminal - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:Help - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - + View categoryTag:General - - + + glue move_after:PerspectiveSpacer SHOW_RESTORE_MENU - + move_after:Spacer Glue HIDEABLE SHOW_RESTORE_MENU - + glue move_after:SearchField SHOW_RESTORE_MENU - - - - - + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - - - - - - + + + + + + + + - - - - - + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index b/.metadata/.plugins/org.eclipse.jdt.core/1865797976.index index a4d58f6896d522cde49bcabea38001c5191e7e65..0037c3078c6953f4cfbde7ff199b1f803de46846 100644 GIT binary patch delta 428287 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�D^jv8~>vNX&6$(HY`d>qia{v;v0YV%1}FyR(@R~_aNxD zn&>2%8Us}a2ZL68`3||?hF{|h(u~0+)2op+Qtik3X`bJ3R+wh7tW9aNe`Xd=yP zq?3RD%F%^+fMGNu-YL#y&w^Zx6UQvPxRqyEN7P@8aj~o?RL?#a>?~wlrlp;1E9l;% z8$}x2WnVhmK>CTQyMR(D8o0rtdQ1|@*v@r~sAY?pc2{(xwK?~RyJP0m_y`iyNQVs# z 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

oT49Z~&8i$G)W9&bsRr=!Wub;O~pZ6`>J z>o3}Q$&p12wp&zivQ^qZSpv~-~%Dq&_p~R#n3um0kEQP0T`u6>#ey0*;i1 z7YJ5S!o|FsP-ISSMpJX(F#)*Ax^@(18}Rq zm?VuF0NSo;!t847DK4B_1M#*WnPf`;bIjCUdKD8-0yxhx+7tMQpVY{NRD#o%6r+U* zi>{SL+Dqj+Ygc28n_dQ_2SW5$Ao`Rwjuz572-X8h(J}S@ALZ96EtQ`j(HTKH>8)`M z5>F>?zr1Ro=9*oR2Dx;ABlW{%Fi^iy5m9n#JSbGm43`EnuR#!)o)!*h`3in=ULmFm z2hY)rDdoSecgMc{diNBQ^uQPip2^T2^RW_xqay=hMi>|lsRRM>FR&`kbUv#;?Ovm_nfGf{>!+t&&;>>QVduEC9uMMu*A;} z)*EB`Qlw?@@l$eu@hZ%mtx7Z4u(oeP8EZzG=!}L%(1xC2FtU0RTqzY2R|&k`6}Xc^ z>n|sESnMgixBiIT^!n~e9IkXF;s!^p)Rj+w)MHj=hB7=cMN*00me3#7eR@v7IG~`O4 zr5XLZIIQCeQB`GY{{p7JFu|(55^EAC`~0|H6UU;fCJYCkkb4?e%l0T&RkoIl?@3#O z?7-GoQ0^icUmP;X&dih^-J!NyPe-O*a?4bwKAct8>9D-p;j&X<^hG^81Mc+pASML2 z4xsz1C3Qu5lrnAK><)6F-_0Bn`cjOj;jC@E;jw_RqUblE*crV-=WR?lqVhPR6gO%7 zZsGy?_u6yvrQJe07+p?#)Zs!{BMDKQTPu#?R#83;`puC#+lJD~U)dW`;L8wm3F+}g zVN-p9B38eUGw}6#fR15ztOFHIpQ<3zNa{0=`@ek^y1^OJVGLH>rddz2N zp}Dh>e;w#0e_!K~;#?otHda#coirpIBOQo$FuVi?X*X#5ltvrb)Br@PqsQ zgO>hsA!yn!sgMhUk9nua*)Qq6(>gHGANYoD?yM8_S=1w+aQX62(COk&9ipV77s)ck z+uah3rPrapt_7NC)Dpho+7Mfvd5`oFAPJ0$e&wKF!xq$~V``TeL|2mW3LrRWHQcam z{|2(o)^bLa&Bg{~>ocB#5~f^wl(|uMHB7+u2OL4o6^N)yfy{hEMw|MA8)}2u8(K$8 zV@f=U>5+~d} z03tecH+1bWwG7&biD2&Dj*DgW1E9pq*L3(3y`d~B+7#d@xB8GCGYjgB*IxFqVIM=$ z>wf}>-1(g!sLS+;uQ%3pS`8WAEixirGUjNb_5Y8xUHk0x2@{M(w}?FaoyKnI27v!# zCqfx9egzRRXCT_ov!C)dR<}hUSF{b{MyDQJ$I(C92{#jWsqKNDByOV*90y1k7- zMn7U=aBUb^`rJ5Ua116@(oY+>8_s=d!Zskma>tzOk#k!#aHe9r-3 z{bj|K{ooqi_oOt|8~;RS_%j7VQVnHyS(dF91Uxf01<&Q{^iqn|8`X2(|b$Cgbo4;TFa(2vFM!6E37Omn^@75T@RK>ofDn{mb0=CV?9 zOQ4OhTre#g#yoPG0zc*bgym1HC6jeE3Ux+5Xh+X3>#%-%Ofz;p4;?d@FxsRK+u%{DBM0de!73{d%gdySFJ|#h*FUd)0n(E?VbxxQEwt6HJg7On* zm=6uN@UNqzcqR~Qw34i0_5%T*dN~5S2FFK?k#OguE>yajxU}%LioRdf;%nvSQS_@P zKBrKB7vAQqRF~jHiU;W3Iww2hvQ4P9jvzo(bCW)*gs1ZOQwwihkAdwn(sTG;P`G*= zVTBw#%QP7+9;~9X)M{JPnR2P;M9+Kvtm^>G%d+R%fdqPj#H!Tbx=r9&L6c2`W%E$K zrqXadcfu(jwkVOs7ORe;i+Yz|W+7)k3_#Ns9UdUt6ph5K`9Yy__Xyu8#)PXwO%}^p z&i%Yap)wwbBh_^8WPsJgAxw9#=1^@NJFDGzbs#(kZ1AB~33{tyhsdPh#x8dBScEPwlLR$HKXP~z{H>H|b*AU!tejz=Ys$Nq(nRE)N zm1pwcFP!yM19<&2o^aMUdIEC{URmC4K50#g#Qc_edLdq$`~RF0Y`Z*+c&N| zP*z16XTt5{^nco}v?X1Kz-rrEV1qEVJi=TK90hA=HWA6J=kXN6*< z<{oQ!tf)ShKH-neN@c)4>b6aS0^VYS-;2o(%@vkYJ3zeqzc6%GQr#2&7kGE5(9A}D z%<+X|^%)iVwO0tYV*600>%O7V$oq@e@IVQoNLdJ&v(*AxxZ&PaQ1n$c513--Z*E2Oq)&R+G`~wu)ed*DAPi0bn=rkh3CaP>{Q$DX{Kxr zQs>kb16kONGmDhsADJhqyyj&~F)9nGMw#o=1iFd$=m;B%j`Zd%kZensB}v_NA!5=C z;$z$!PDHp7@C^TE4DA}kt99In9?5$s;E`c=2s9LweNw&|uG;@Eup;3J7EUT!m-jd9 z%^k0plRm2j9mq`r3t#@B7m-+sH%2)}w|gb4tkejoR@6S1_;MN4?J^PV%qRmPa& zn!}Mw5=)%q{S3XV^tu&p`Nt!{vnRP|tnt89!l+bd?HlifC&_0h%U7i-`^vzNR<$R3 zCH*nwS5DO)4lKk14L|>_<-4_b$Drrhc8+0YNl!%JWg{r06|%9+J{AHO&zg&R+{$ok z7SAuXU>yES@f|4Y$+?#trIYy&!8I}$F%PUdLv;=ZMhAKO=yqF5$}G;VJ4=wXD`GF> z+Kc=xAG4QXGP=pZ1^iXus_Zr=aMm|lvCc+?5Nho96QY!kURg3UiehTpMBt@zBZbo@ za*T|dYq{JXL03uEG8NtXnliHV{&m>KM& z7za@jHwpKa;8abxxK4|t^BscqW!w;V9FFHx38*o+hkrm$`QNV|QhxQne=Qlp07Ok( zFLI;Td@+~hJ%(hQ5k{>blz zH?v)sXH)58faBjF4HU<)1GF%v2xHfz<-C}N8{i|TIV@>?Em-GD>`ne(cq!#{Lfcfe ziKCfFZP1TV5Rvq)VISPTNbW#u3oeMEzbo!7BW(RONo_lHAaMr~y7P3g{YzBU_^@_8ErJVo~a z$u;UHwP)1nNOY!Wl-Ua)VGlb3HH7$dPg&fBfn4#vFjrZ&1ho3u3XV98@vLQm5%6ob zFUNOBJs08QHz8g!d?h0g_xY@4m1f!ScP_I(PH-hID=^X7swQ~(6Gs#vNJkaX-8WLk zbYNMy>wWBu`YML}ZV@y}W0_E!nuhw6b_ga#rz*swUT~=BK|W=e9Fyymp*gT`dCC_IQN_>byIM%o4`~_-t7QeaN-eG1#nU`Z!s;ktC+fU*HE< z9|HLWd{aG01ElW0C$!rJaQnY71^oDM11mR?76h8UOs9$y_>mDiad#Avh&;`q8c#aVWH# zhLil|pCwV6ewzrXB*m5|b$1u1&o7(!T8W|D8f7mvF7=PPYBQ6ZUR?u2#Xr#n2H0fG z?q;o`guVP+W1}h?ZokjrbG8X>olPmmDU$}fx*G4^agy5)snPU1nKDgrqoq(IsnYtm z+G^S>>89(4;GhyS&ehqf>%?(+?XzV(RTLs+QK(baxiGU<+uxy; zAhpLn*VpSxsa0Wps9dFA!NW^$cr}*Fo=kBn?=pf=rw{rEG^|w%BJE_ z+#>ydfdCES5hWr2(CtOWcv>2x%kV6m>*Pa^4F_%LE~s|*`p|OUTSY0|@HxgRXY4t4`14071NJGQ4KgT{H$#vPfKxi^lV5s|3Mj-ZR6eM4dqT7 zFvmJK&eS%OnFOwO!*N}`dGuu__9iK^{)Af-i9Qe0;pI$V`4}58Ysvw4`6~=g?(|Ho z(vpUnhlvt6Z%n*tFNX&@m>YA(>*e>^K}iU~m)}Aau_F$x+o<{GF$#YEmc+JsqHC0~ zCfZ54*RRrh#$1LlQ&y)`S<0C*Yaq4hwP*~cj}HUig*w17*Cq%n=F8AWr!VyJk`O(= zrS4NE<~952d`9)=h%Xu#=p&O}pbV$NaFA`)j%rA5UKzGDhFwU?yM537KhK?Oj9~P) zqa=$f^s3WRBjEl#;p8_|;h1K)$(>TQFfc?p@f?k5gBr-w*;u(ElLE=Nq&a$Q!kVs` z3>Pva2~_rMJH_pFgd+5*vWENd8(q`PIhb_kcILY4cn3F*$IIB@*H>by>KzP!sLfwo z%L)Y>77C^d!#1$TywAV|2{_L*=+9<+l)4?}UOq|~Rs96f@xOSAWX5j!if4w&EwJY3 zAlkEKM=8`H)^kbr;n>kx={@nfvBBUj8lx38lNMmzRw_Y~3L4GGDB zNjB7m`s%wT9B74k+`|NVscy}e-{L>Zrb z?p|`LH^6c0e0SV*luAFbJ>aCLJCDbrJiNU;K5vMUvBy#O9v+N^jGu!;Bs!|p4qauN zBXiYiZxUWITZX=MU_D?*gYxgM=((QkM`IG6%~AH_LPV{lLm9aL&p@vRBP~T3AP3#aaqF#wbO*#H&hX_rl+=5&=mqJ9U-*a|j z(0lrZGU+O0K)s`rt(e@_V>1#;MX1c5)x`5w*I2JlJt8B-#gv7g=t61oDuq{htBSdP z(Fj``^9lK>-O~$lM-#5O%Sm`#&*3cl?q`PMz8y08^kfYA zDvvUwh#6q!Qkua;_v$*Zo)6Y?RF~Xlra9?1t0&ivk4`N)At7m@0;=A^MFTM69(=krAR`UED$oq~^ z0MNgR0dtF&QFi~C&FP)AB)FBl>Itf1D8j>V(@JK2!~G%Xomk0XUD_EvZOv2~=r;b$ zV3uMEaS-D+wId)Ga1BhrOb2rB zUd^?z5sR;37*+Kq5+idnOKMVIAhC5fLu|zDpRl(S*|j$ia%Or`T&peyDP3tDDGw86 z_bq7UMHj+Rf?f%*6jhR`65~izah4ltAuS}{4rq(mXWIK7)CfbbAo{I#hkz9Gnl^0a zF{&K95{`uGWNPVmfS$ShIfd>1fm^7PO?2A8FtF^jebo5Z zqYX4o<=Q`tA3(O<b{aP=9&)nM--dRW{h1 zEPBKMa!U%

+$wgQUX{u-UZEq4wG!#XnDu&HznzV=&7sly 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 delta 425188 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¨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∋VBz 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 ZZ$Q8Q`#<-t|L6SgzscfX`ENb@{{Z7_Ae{gJ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2876837992.index b/.metadata/.plugins/org.eclipse.jdt.core/2876837992.index index 6baba151cf4181a5fb6eb534d22a8fe56019936a..900aab8d1d43340744ee4406eca700785bac5860 100644 GIT binary patch literal 34294 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 JDDUHc`TyXPZ-f8< literal 32007 zcmcJ2TX$4Pl5VI2UyZq0BrXgr?P!u5nn_`MrP6W=~Kt2KHvA*)Y)^>r%&x09~(dP4$=R7La#RJW$%1YE!8i6*{u7% z_py9FRh#w4zA7!3M)H)Msr!RlsWA18UoQs@{+vG%RKNCTyK^*Jt}QH<>ZN9_9(c>a ztY4c8YUP?Y89x3jd^qmqsB41%JG3W9-6u;y6@QDi0NQ)ytMY{}7fOqsuY1!3fd>C% zY4N23^+?mzi!bG<=XlUS=RqM)yBdBIbxI4172lh#HvM{VHdyqVOU>aNZROhM{N|K; zKmIz?u_Z?%YCzspgFjpfYG+FITE$1p{nOP(;4cJ?W>7ATpd=dPF`|{~rPA@G#R{G` z117kFLf*o~if}}}oV=*ma{_NrqHm!#yHxRi8B{OSy7ROX6kiHTAaim2{qgaGzxIyR z%k#ljECo@yGTRJev?Q2WvxC7xi}wG z{2e*k_L+KmI()bnqzA(F8WAnhOXa#>Qp2j9@#~X8vsv=SpFe+ooBB)DYVB_ukL_p&I95l=Ns(=hV`IU&n;VkOQf_N_*=;xwgzx5vb0a0XJWp4a&Z>wo1JagySXd z4wMk(7Hf;%L43&Ud71W?6sK#ta_ubShsScPQYp=p>T`;u+f=Cg3+P8x+_@|K&TVG0 z!_zxuIg6p#BE^`OM`th~QTxzhQD4CyY4 zHWzCRFnQLmdlM+SL47C+NrWKi){B7_KdHV!gD7weY&=!6e7s4$6@S^UoW7td4X81E z64XPoisf3hiJ3*;Jdmy|<(F&CnzXu3y-JmRZvrp#-MRe0))6Yq`@!72A!Nu9a;ENs zhoD$ki-!7whE_&t?GY6Mmp^?$GpM>_?5X&3b81>wsL%|WwThu*cu`OK*>JL@%~jfh zHkq2q`Je(;f=r@*HOv$K1;zXglw$R7_~m9$s|ri+%KV5_s7gi5pR}ZJi7mcdD$ln_!xES^yODNDu^>MhOAikPuXtxg&vt8LC z9^W^gl`4Q-eh+P4syf02=~42hByu*maKVTA0+V>!?oz%HTvA}tgT`bm1&sC5B_r}V z$b_^E=uq;kB}C?A5Wol{tIdR}bDIWOj(|XHsx{Y#&5%zB5=2IA^u&TxAJE`JorO;{ zKC|yN;L_}@rb9k5`D-)?ux^&l`VCleSU>6P78OfS;H4@nF^0{x?GvtdTa+%uNJbk* z$#cvKB?MX=t@Jt%R0)Aq(QM)DZlhIaf~B*iMX;~|kYuoD>0hNCjyO0#q2%FpbUv+d z^i<90o8N$Nuu%DG;CBdYVUNb2si}b#cF^!~J)_OPgM2nZ1-eK5tPXG$YE?A{z%u_2 zKn{(tw1awTEDWkCSdv{Ws1TOiq3ys)O=BpwA_Fhk7iVBDv_#7*2CsS8Kt%y2CZ>$I@gyeO&_N+g8GbbTg7cj*Au%qo`xt=$HrVSd>X9S>Yvv`YB}m>C&#Ur(`r zV9VgP-Fshom4~PNC}#{TJdlmRzq|v*=-%y0SgJYLG+2yZ5||f$pPi@L{2{jYh2;z??xo zQ0XynWvR}F9rbdVY~RRU%AYM&XKM?1`;hYNJI@FB{FI6p*l?ezl*(Ll4RTbO9KCZ#tEmiSl1G>-7 zBtBkKAg`qQWU0{z7D{N2HN0S85XGKR7K4$Vwue0(F*te@CE$!1F;S=*er0@ErGCu} zaS!q2Hf1XT&nnB0xV8BF2tG=w0v}X9_pnC=EytIK)HQ|P;mT+GhIAoj9bAtJK#pM% z-`1?#%wrhYL0zY$a!=L&BbVW)0QdpB?m05U#6O{~8N4g>^bT$l#Lh!K;H2QyIu)&h zk22Y8-!>XP1?zXFCcekiH)Vg3y$`(X&JIBwvk)*Y*^AG4Mi&tQqAua=?!DA?9^|aAk=f1^Cp{(?2w_d+$E#`U)hhP#05jle$=L;ZQPPn929mM`p18ct}3x=LHba z5S-O;y13nJ&(>`tJNHo6Hz)|EHt;YrI81rv(%{=rS5JZEd+Xq~;g?2sh$a{G%rcKx zDYGo{2<5{^kw^a6{YSV&c)vj-r)uYx%JWl7_(JyJ9p=Z#h-#_H8ux&@!};rO`U}jv zOm-jKC|a&z)0t&_Od<-J-yC>V})c;01r| zM|9 zc$pKg50CFsrmP?>Q&w13w7x0c-=ZzkZVZBP=^+hho}51a6&5Gb`qo9ix>UhTV8TLK z%+{7z61QZv=^SQ_+edj-4{y3@2ZOQt{`)V`(hBV`GY|_=;N>0484G~bQPi2kYY=OI zSVbT33{Z?|L07u~uPkkaUP#;4A*lb(U2Nmf|8`*75d{*XShoYxe3sPPKpG82CVQfQ?zWmBQ+5FMvaLjaN^o z&k2{w1J`y;9pw%ovN`cH@P+Y}`X+0YidvBhzV`G{9;*<9EzrUW<<2vH<0B-Qy*Xpy z3W~kI{{rnq94QkhLKUn8nBRzQDRjjn=%Tuz4TcUu6ucEdDc2TxsNkVl8#Y;eVdMf? z=)C$G^^0VkzQ7u*@Gujw)yv>rCSWwbg1_&`--6Lgye|N{`(Q;!s8}m2_6l2pQ>8io z@3G>Pj&cj^JK`grYY|1|zD$83f9v1~dg(n;E0-!@n;P?g^+%MsctjSFl}N(H9I;($cR_Vo{|WK(!cKBB0QG@Y@vifK~6T49ig0X4vm0Y+O{gs`VRG+ zSH2~RZXq7`5JShFmjN7^faNTwII&%kZnakpU<0ywo_UK1nTQ+^hJARJ+f~Yz6=LKO zp(-wi0cN~ghxZ5Q4#h81VTrp(nF^x@9Dchv$M?H5%t)Y_?Bc;HbuTr83g~QQZ+A_z zsGeSGp1$yLZK*ojh`Kf1b*#J%O#dH`aMJwwZkr0T*7X(p(l2N@JjI&X?&drBQh62ZRwa{aBl{moakQ4d^U{+uTUS;t`~&dBxEUn?qWkZ zQgO4^jfi9g)esr8J~(Q@>i5!iM=l(+eg-F6;wPxLPTfo>YKSX4G_sR2i`qCZ^5n0E z&Pb>)3dO{+f`vbCow|NDOHM~v`Z1gcdD&oAHH#0b-Tr`$ypA-Y%v}YsM&niAyl!*X zBSfFKid&%qqQ7-SIf5!e(h?K6Yoc}>CgJ`Oqq8!s157DFWH&abs%@!&O@=ldF^R_t zdL=?wQ9;9OPyaS7;W%c9Ck%e^xyvmsA*_iPIY1KtA}vyMI~MVjdF8+kG z?Zx_a$wyqC3A{p^jYIXa;6W6n+QXEVsmKaN~G(VjxKZ(!>% zmy3mx3v~%Y$b4*2FPsoY4v7%4Hv@E6$S+Uw+KK^ct8>kHsdSH25R>(=rx(J2KJ4a8 z7J&{MGRL<9B8?*AD4*Ff=x&c7T3)UFQA$i7U#Q%Z!ae=wQ}wbEts?7VsG0C0RX8Ujz*J3%=tFz3oL zR;)4S6bM9$qfXO6PN!1(Ac3X4sLXlF7+4+@@vt+5TUaDRw}1-qZo zEs0pbR)qlBOXmti&_;3*M~v>_WP8F*KaO~2vm?7jD^4W@&+HWn zmxfuhfNkv1s;*(gk~fBhku-l6$hgxm9i~AicxV!?~k=%|QVF|%_%X0SeOMYsz=DA|P`TT~m(V`tRjm|en~v`25l+s4F+v4PTIae>Fe zkcDvsZ|Lo2`^GFiuhD)sKx6J!`Ix&^ejr=`zv8U0#!T9Q^#nvnUMq(g2Emwh0mtmZ z2gTNDx8;iD28`LT5#B$ryYV3(w4;f)t7>zia0k*Vy!6ux)nG^EM>>!qIBMm_+qimXA0=04pXHZIju?w2N1)U_+MXzN@PNE< z(?L27hGFst8jz441i{G3cl4@lUCo(ZoSO6v)Qe1PdV}`GxfDrj^12B9BL)~EmQ1@RBH*dF*J#9*g~+?B zv_B?=o*k?(L^tw)4#YIZDX8;}RCo6rVq`)*nFQU=4SGGwVW%0lzlU@%6)C)Q3Dd3r zMBB8+nNj}RKQV*8qn9=Qd2tcaHCJiGp+pbpphsN$9=(-76)&j|p7&?zY(+X_opn0X zIZ=v5x9D}(LU;)SqKR6g-4=AC^RCAAoL*(sYR{CX%#_GXsLJ2dfK-;uC`H(}wAWxl zE81_TPs~Jn8i3V`g&HkV*(b7mnO<|XD>*5O(z`U;!VhRw;|{%Hjc9vn*VD&%sC}&; zXs>ZL9OmhKH%0YLdfB8C#nDzz`6JpRlaeN0!XK=(tW3ZV%Wz%T)(s&CQWQvhn^uJ$ z)0=FtQv@&~pGDS!HQHyL42Q{DYl*ybDD?n(lu$9PN6;}5Lygc8T)0lJCq1I5$jk7b z8I=&a9c#kFmVYron@Ex>4c!;a?k+WEIZE@N`1T7rkigo5Xf;BG)ZL)*G;o^m_H*%c zghD4j(vAoaOKCxByu3)A zOxCDG-a(w2-V`wr3Y|95=`$KKpts)x-YH?ji|^@!P)jG650=qdRW*kZ9`b_OQ77i7 z_;Zu?$1GULAjgkDPY>xp)V6B*uq+bQLCO2{N(j5sn59WgKFZvtkCR4doJ~#|mNM}+ zEUvR16#XmoW<?6iD9CrTMUYV##5N0kz+M?V4JX0HLKJyKFWYKKR7Hs^^hVsZ2^(`4o+x^cc7=|X zvZzv092~s9L7yjdEg|pm5|H}%qZHXk>l^fqW5C{J*-eKUFM<&!{6DHTg3VV?<$a7g zJDDQuDu;Pg#i2(fk5)uso!&{1nZS_~95b>}b|r8v&~m(kApB&!F5@zYpeAQfb#mF6 z86!PlkP)71v`0Y;Yor#eC}2FNeO6A=`HDGsO22I7cC?b2JJhRzulVhs{)9HxXs>Zb zrB15u?3?5`fHK};%Q4Y@90wT9(j>qHoQh3=0H!jnTi1m(0{&jlQaSi|( zy(xcY4&)-Y|2J zEpt!owriNkrW4!RCdjxsd6B%4v~-zheqqW+dpAdQp`0DUxt&vNA_-ur30`5QQzFwQ zn(P+Y;*ablyQ#IYjGG}g0$4i5Q)SXJOFQjnx6hA^=UTW~v5}llXGc3FXT{yhjiiXU zdA&|LX`x)}igo+6a+|Ql zJB@I%eWR6IZx6L7ZrR`P|4s%#H1xUvEwaN6cSaMY)MLn8^1gO5M>gioK&vXIZrbL^Jtw@4vJe4n=teBFJ*FLp6o{tqh z!4sZqW}Lykea@^!uZHKLp&>X<7ELU5Pc(FgNt>+_CQ}kW(=#*E4@abAv_;PkbjlVi zs8B;PlegvB8BXyHPc6B}nT$-@Y&M;#3;yXtMe!`hM1~wgHRmXRv2v10=SIg4%ByWs zCnvX625J1HfD6ZAMzqb=Pd~mC9w&11!BcVq-4h)|`@`ISjOAMDF@cy@Ya9!lxdzAb zfCoP4oSs1GEWptGhCNJ#Z#ea8V-NWLIL!dGcYBT3f!a6HPmS=}uEnVlo}Cu2cx(M> z>KO!wpD2UmN9XvN;}}W(wkxJ|J#l>UoaB+aM-SRM&+NpZR~&$i1Yq#!3U$EERH?NF z+IZAgokK-&flYclExbG;-s6F(Umik(Tc;V#DoOD^Eh%1R<_--h8_vt@lq zdoIa!G0+swbc(-&QNc(d^o=|T{n=)|n}xT#Y-weq<33|rWGfLwva4n{ID++wP)IaJ zztl78X_+!fTAmjVYnv6Is-*jxJx>h(u?2e z6Co#3=N`RjI&s9+n>rlX&PMyf{T9QWh_tVE`V~p{={?hYD=lp~oI7;X;;@%`rxJHu zPR)e$riI-<(r--vW(N>s)6K$)9roZ*t2fK>V?CyQY5 z8XY#>Sb?$teyBCaRKGva0b37+)1+WpOF^iC5#rLht6E>9QA1ry&Vm=$LyYHHR3hy@ zUZ~kDk@sx7*7CDcp%gAf(x1>lThj9qUPBxel!|STXXv*)?Zndc_EXYEuNBjNq&H07 zhP~QLZMAzdhjq%3qVER1W$1HUEf;kRU@_N_z-UT`4xMr~xZQ@_C8kKYX8GHZQ>w;> zoi}OHBsh7IcCXUg7N0z?oyMsF-eg{A8e7t=iaIpM{Hip5u)TU{RaB@_zFA8V!d`QN zeer2g%(#(Ms)QgbrGg;4>eqG>RgDMjrK=4@D%yVP46|)OL$Ue?I^<5{W>iB}T&Ep| zg&Gtk^HNdvExn&&UZN|Y7S@Jm^Rkt|$R@p~HAZ!EJp$nzg@HQ9(+{+DT!mlof9SWV zH{N;XZoe9D^xFm^nQES7qj8oBun8pIrjy~-N`QgTCbn+D9KZME;Qc5zwZ!V6MZTj( zn*5bIGo=EhjA>=LvdKsJuph<8Ib?pef>wMN$|v0AuNZ)BU6BkJlImQ*>_#gFvSf?R{-#hl}bl(Y|>i}d?1FyV6zW|p42 z`*h5?whjE^CRsZbNmDPWgLx2(QKUq-GcOfiY5 zdL9QzlGle~M^4-<{6+TVtUnq#dhd0Ilx@(P>Y_J?EQOe8`ww!@rI0m)S-U~6DM4lz z#MnQl7(Q~b?`c9^xwdKXQZu$j?>hGwdYJhzaM$wM0cX2pO&f4<; zob?8JaM>u0+t;%6m`uB%tMiOVQ)cM_-fYm@`bx4C4$gQ1risPN3c>euSgwWJ3@@it zeQ24jzebaera8t-bG0F7)|3kpNyyW<5vuG18VC3I5>3Y`KqD4cT{TxtVZb-(Zz1{i zI!>$&_1&_H!Mt#l5hui$--M^ZJ-MTU71Ivw8I7q^t&Zr%G)i+6gV6eXjecQJ!KkvB zH?u(y*Z*(nWc-FmBRNbT`?H#n5%ILb!)U+?$fPSVe?q?kBRzNl5g#4RB+US7pcZaA zu;$=H%$OXMMFX~*bQbb5g%N<0l(_|Ff=KhbHY1zo)2x&t)2Yp*NN_lvw?qomy@H#R zezsz1C=;71>4)Lt8og%WBT)z>DmH#cUpR+pJJVu$)d3qbp|EVww0qe9FSooOXjSCf z4LfL2=yxw#s|j7g3s4LtPZqqVEMB)Pt?PzNgPLFbSj7(wH5E`(V z+$>W`KM_;6oVd{#u3ZQ*D|D0rI=oi1^Q1~;I}nky!{!di4jk5AZjJl5pmLM`0ZGL* zbs=zP0&L$Mq{_9pA6N=){kR4j^7sZFheVmHLk7blUNrct40bCpyH5Y;UNHOLG`d&h z(q~4uH05Othw3`FpKe}M6iZCF!X$8vkD5;t-k<-Mfrk~ENxL^R8JYyw5(__Z;}jQ- zF9#vvr=b3x;P)|m$;##|qC%~k^p3vVb~ErV;;k*$8olMXkm+8I731&eAKe>$|C^@z zsFB0YOA@)E8UD4@u>SR3ItHIdw!hAV_nvm9Ru~g;tETOJQ97r{y_|d#3zN_(#}u#9 zI{+ee9Ys4U8-pLw&5t13`kHT3HOlp><36&iPhQuUHHT49ux&gb;8b*ICtb~_I? zW!ggtY_SQKrrsew#)R<>{nokD8-_3uSVL>)6OO9!vc$~`joAkMeG15#lMQGn#TIr3 zILxI2lFRhIx;-9q7+%4}Hl)RxS+NdjpX##5bvh0SSJy%RtZ~9iQiN=DT*@D6Lzbnz z%~JjcI>u`tL<%GCmZLSTx`%g)L0lgD+adA`5`9 zg_wvvruQ5XgPYVz#AMzKrzhlYBlbff?dB&o0%or@VQMKS)%3U@(h++b&SrRM*O4LT z7!QA5_zD3rxoWB%7`oIxr}v^iG+-*Sn#G+Ysi<*9(Dxu`=Bn$sH?gcye7!|j+$$U8 zUfsUQxrtbzU&jS3Mae_ahzZvf`T*0Ueqi8d&Qb|}E8vM8l{P=-(cTz}@1w(bM?FL{ zB}Jc?uiF1vrAf6^F!pg%A{;LycIczU7I(txMXAJoA>HXQ1}whO$|@Z(TJZuVz?HZ= z^uC#Y?l(?ps?0@Zecaw&WQ4V)5md7ex}Vcm&?(bSi#ze5>Mt-TQAK@FYjtXMgaxMbJXGPm&n;C;m>URY}Y{J=>|=NsJJO{3+o-XtMpD4+j^KA z^lLCO^1But*8Q%=+@^8htkHivbEy;S!t?LKy%n%fMF=+I5$VIaQ78E_O@N5ahI3si zeyc+Ia;IZweYeA7|Jpct;f(yk1gliJmWr=z&2zX-4gLEMPS`Rn;%?pL8*~hDA2m|& z%@P#nw|&E;N(K}2jA<36ddtw-76KHd*XW=r-AU3!G*qn(I<9}5*4^Yr+PTUhPOsD3fH6+j-UNtE37Zcav*!MWQhO9~Shz~Rlqe1V zmQ=gRHdUm{zc$%)=0Hu#k85p4!Ie$D-O;C)Noc`8%j7mb{ZI6Pa#nbd3JKg~L(EQ! z>*Qk43caV@5cyG^&3H^wU2UpID&Gv)ghL;XYBQtTB|B zN!jkXK}P`yqV;9GH(QP^gg>O+rr=a#Ek@X!q5)Z`ba3Rwea_c%yhIgIfg#*HV>MggfrDP zwVpa*!fN4u1bEbLlRqq{F;L<~)|3I<_@{=X4M~##U#)lFV$12Uy5{4>gvR+niD=+7 z;q`(9OW=3(*Dva$Osl90$3r-}68BP0DVUU>wAy5_#v-WutDa$K3Bem1K68G|sWTD@ z0y<)`L1)d63bFA2g2T75{!^(}4&LsdUp957E zOJ08%+gjsHv?s6_Fb+XC4;i%pa8&Jj z^Mx6C2=XC|kG2cH@KPeX);px(fB^)o&=Hi>PN8E_h0;mw!$-Q zH0w)coWj))|Aw-4?sNP

+ + + + + +
@@ -37,4 +43,12 @@
+
+ + + + +
+
+
diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png index 3ac89df245feb171efd2bbd559496b7ac98da685..6630b187ef5046b8a5515b8e4d26bb5c248575f1 100644 GIT binary patch delta 1219 zcmV;!1U&n{1=b0WBYy;)Nklm}NFJ#!LaSfH0o zV&Lz1R?;reGh64C$`T`u7qN)6(naws(}5B}L_lO>wc@1v&#YEIf&%VCxPt>fTPB4R zQxte|eJW1Re1n6D3=+sX zpd!htPj3zjOn+)ct%~??)escRo{WCw{*pgmE(1ez{#_FXg8eF=`1-5S7F8t>>%G`9 z5e3+FQUj)*%@hsx?eM+x1UM&$U}D+w`_$i)ms!8GB3Q0@&)suVfJMG#N>tTCK0YTfaIVj1^nMvp$?}jtK zS>d+pR*?Q!pOO0On%2WJ?~>c$eY%X9A7=I9QcPe;l^i+c6YOYx8~&P|;RXM3Vh{{p z7E+t?mVZs)xIV(Oxj5;ddW=_hXOJqyvEnVE3HUl3C~LE!*u0M5NN)`<@Sm>RptWeI zo`b$=0~ot1DR#D&^7L6XD(*(Kh9fYHjdBmEL34a9LC5gdJObw~ouRsDkXyfsBQO+> zz#rIXb-fz$8gdDGM!(|`u>RUjb~#wSWp?9V2!3^wryIIfLRT{KAjSjjb{^Wg||l3VbB9MX^j#{12c zJOW;?7c@tUsh&gL;Uc&){X1N}b&cTC)MdytfLH-f|xSotOi6Uvg&L!yL?{VIyQBSp|)I|lX(1L%P| zPhcCfL!Gq|)-)9GY*UTOITMoja74+mBv!~CM^1el37Js=@|x_Zkc_T!!nR~z|9{sr zy$eb*AB&g(*@~@8Md->5a)3 zD1e!pb`wxJ7gwf(6jdZ0&4?@NatQFZ6b-A3kZ#UUir@dwa5e8K`CN(Bi_=iRbAjWx z5KTG)RuVjx>zK1~I!Wq%Ck~K@P&^xD&|&%rw^Q8H=OmrN{{%Xw3f&$tw*9Y@|GQKq hJxcIE9?1V){sG07WwyALaXA10002ovPDHLkV1f~yPCftt delta 680 zcmV;Z0$2Uk3BLu9BYy&hNklIMK1VRvO#D$<(L80JEDk!!}Kfg0Lpv{!Z zBz2V+9th{0_q=a1nQv}xrkQ4%$$%tDIwuI3peV{6^OY@ugy zD&e9io=zsEj|h~@b?EhaFdPnb>G%6ksVoCIn@pxZC6n2+6Bmfb#U}_93KiJc7{Os0 zjb1{jR0HCP$A5+PMB$N0;$k$Kfwr|6M@cw@2D)d>p3q(~$V z#bO1T&BtSC(%UPQszAJWN5yb~Fdusr=A%%n-G|lHhhu2c+pE`CfOwHj!v%t&$Y%uq zSaqmYm&eegw?{n0i|pW$c|!#P9RC#oSEB?cuZp;zhO$g%hzXx8n73u(Xs=2he^r>Ftp>fOx&$K+|vmr_+DU<@SS@ z4XRU4mh*qHz5PXH|2lzXLqNPPm;a{W0;qY1lYN0eC>+J-TKFgM?E&IpoW9o_#~q)f zz?{S3U4OJQo^J?*v4o-&A(ty12!AgI3K1f*^i`MdGF`1eB>#zKilmtm==MLH7wwmt!P}saC{#45y>~o1PFp4{*EU_TL}?OYEhB^ P000009Fvt_^}Pq-Dlx>GYl@egMZkO2szmn(jhwd&Txe6_}+q zEVaPKr54z<)PDj_iz;xTkEhT5^ycf?^R{QJT?AB}sWj*S89KXj4#6~T!jIpBi0slL zu=yxlc|Qc`BLt_F3kr~Pq3$wHp_lROE5Zgkk2X^7v@#;vW5!mz0S~1-E#f0 zGtb{Vh_Zd@v%0><1q>pNk&=*7f{B3tFljW6px{L{LVq4;uty(6LVc!3v1efj^xf5% zn4FlWfWccP=h??%kZ)BYE;eVNq>Dpo7mtkA%Lp`_f?UVq{_AJ-osW)>;_L7?%Fvkc z-vd}XujZ#ZhhuI83A=)Z-lAE_YR`mIz8dKd%kka#Q%Ieh5jswIPl%mYxI8C(m$2<} zUO8vD2!G#k6{~gObf=^`_VB#IX765EA}r=nu0h$8EQ<)LNiv@aj%~Do06p!9zmtOO zmP;0qa_^jYCa^*A8ir-#gU@GpjF{h0#(9d+kf&^P?W}6giE1Xyag@R3+NO+!h|D( z2uwvBVhktdB(yS~Ttg)lSjDp{s|Bb8uc#LXk@8j&66;fDMO}Lu8}d})0B>6Ld@M%cvdE0%~a=v4-!tb*>(a#am+gMPMhZVA^O{S zK0Ld{w&62M$|)FO!U-pQMzB%JD_U*#&MhvET`wsJx6hx; diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png deleted file mode 100644 index db1121ada8ffd067059264e7be83365c1243e649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmV;T0bTxyP);?a#xAc-2uuOOIv}K{|DprrSs@& zxl-y1HK4^mfR6aDoC$WsUzPM_mUMFf(Bd5+pS#p;{_oqm9UKaZ8B5PGgsx(yx#hs% z4gy)Inziiz;{CV&uR3z~zk2p^h$AwWWYg4gXu^94vMh1(zW+ae|NZ~x@4x?9GY|cT zriXVlO^~33XH>lA|HLhq{{I464g(-ZOx=Fvze&j&+9gO>!m}t}_kY%|t6)o!9k6i! zjsMn_>uHxDVF^z=XZe3~U?}9zI{g3lpTGbA0xd6_e+(?9le>a82@*Nsxm9lb?^(SG zjF$rw;f7=P;Cy!=RtKt~YJzlV*v|q>cpwL80#iH;TLGiPv1TKRm}=%Sc!H!#F%3=m zui&K~@%XcR+G0s6gaHGCOyMd{g^cA2q+n1*MHS0O!6+C7qkxtG0JX0x#+3?s?f?J) M07*qoM6N<$f+6L?*#H0l diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png index 6630b187ef5046b8a5515b8e4d26bb5c248575f1..dfbdbb0c89daad895cf89eec30fc1f0c8526aeb9 100644 GIT binary patch delta 524 zcmV+n0`vXW38Vy&BYy$wNkl!QF^~KMwp4h!-$4_;OL#@|ni0Y>l2fU>2E8i}_!$ zuH=8;o`(Mu_B8%4*--l5c4qv4wkEhkP6HjxLpA%MKL5|#;(r6QtnB}iqn%iB-PWrA z!fk#KM>Ke>q>ANi&EA@zU}tOe!fQDUH*Tx`&(Y)!b_7e4r#;0E04A_LkYNUsBmYm_ zRYw%In-K>M1<&PFZ~!>9|BqOZ^1pt45m7j0X(lW!yrqT%Kw0g7?EK{aIZM)s!s&}r z;W>k$(~p-@2Y-A88RR!D>VM?S7@}|(5W^kN5FkLQ18#y0GVb*I@7^0o6t?R2hdJOA zMV3PyFb!mwY@6?Yj|ssaA2SOhDGyk^J!k6Dz075mLi_%G1v3x5gzCa>L8u^bG#-ME2%Z=#i2ngV3lmpo|4#m}NFJ#!LaSfH0o zV&Lz1R?;reGh64C$`T`u7qN)6(naws(}5B}L_lO>wc@1v&#YEIf&%VCxPt>fTPB4R zQxte|eJW1Re1n6D3=+sX zpd!htPj3zjOn+)ct%~??)escRo{WCw{*pgmE(1ez{#_FXg8eF=`1-5S7F8t>>%G`9 z5e3+FQUj)*%@hsx?eM+x1UM&$U}D+w`_$i)ms!8GB3Q0@&)suVfJMG#N>tTCK0YTfaIVj1^nMvp$?}jtK zS>d+pR*?Q!pOO0On%2WJ?~>c$eY%X9A7=I9QcPe;l^i+c6YOYx8~&P|;RXM3Vh{{p z7E+t?mVZs)xIV(Oxj5;ddW=_hXOJqyvEnVE3HUl3C~LE!*u0M5NN)`<@Sm>RptWeI zo`b$=0~ot1DR#D&^7L6XD(*(Kh9fYHjdBmEL34a9LC5gdJObw~ouRsDkXyfsBQO+> zz#rIXb-fz$8gdDGM!(|`u>RUjb~#wSWp?9V2!3^wryIIfLRT{KAjSjjb{^Wg||l3VbB9MX^j#{12c zJOW;?7c@tUsh&gL;Uc&){X1N}b&cTC)MdytfLH-f|xSotOi6Uvg&L!yL?{VIyQBSp|)I|lX(1L%P| zPhcCfL!Gq|)-)9GY*UTOITMoja74+mBv!~CM^1el37Js=@|x_Zkc_T!!nR~z|9{sr zy$eb*AB&g(*@~@8Md->5a)3 zD1e!pb`wxJ7gwf(6jdZ0&4?@NatQFZ6b-A3kZ#UUir@dwa5e8K`CN(Bi_=iRbAjWx z5KTG)RuVjx>zK1~I!Wq%Ck~K@P&^xD&|&%rw^Q8H=OmrN{{%Xw3f&$tw*9Y@|GQKq hJxcIE9?1V){sG07WwyALaXA10002ovPDHLkV1kT0P9gvR diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png deleted file mode 100644 index f5c6e73c62f4e99d57b542b18872ce0750fc1a3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmV;#0z3VQP)g5Ntx_ryYEVin zVvjisJc1Li&n8xm<^SzYn9)Xexuj04kLY zAZrte)VD+;dvWdpv6%P*fnu=&dwV_T_1*v#xt@kB*MN9pF`+$IcsLxt8i^z!9v5L} zrve(c+Tm|CAJt~?D1Vhnx z!B7Nhwa2iv^>hrCdNxVDz6r#O>}xLI4}`xX_{XY4wYo8eNDhyLx1ix8mBZB@OT0r5lAK_z|(FFm3lS_o|Zto$bqJCBDb60 zbh&s~UymyX5QR!Tn}mD;#OreTnwksP?cQ6Q!wW9AUpeJ6nS#PB(dPuWI{?JXao)R{ z3!qkPcK2HZ0>KEr*P_BK(dYQ}0P(PP&wHNdPtQ|8XS2E1tgQ1V0zoX1%atIXmuC`s z6a}&tIb>PK^|`{S%x3Pk*~0xol%ExkSfxmzP*%w0Waa2}IDJ6YAV+4i{oX>tsZ1v8 zHO6H7fB?m8ae~F_0QHP{XxlfLxEl)%r_$^7XBftM-)LlC8yWTpfq(o)x&{;b0N?r9 q6A7OtgTZl*VVtY~EpVx&7OlUu3<&Ia4;I+~00006bWah7oD-5nRjyYo98^|ocI5n6Fretj04 zl?gb1{1DXqL-^r#;Tx`h1J{rZmm!&IIW!V>1NI9N^r~f88ZqMM$vV86yM|w<8}Mw@ zf;nR3L2EwTmQ<9=Lr``y7|Zv}guCM9o{zoZhHK7ItzPvBb^|?mVsxt{cuFSxZRtAx zdew#3Ph0TQqgpJuEAXgYhY?#kYEq+cIgO7O6V@%I_E;=}3AtjsiextHtQEiHy^8C0t) z_bYY-ok}4(lp?x~&qk}M;PbI>u{czTsqSwuemxJasw5Q4f}xiOVV<1*X3pT{+|_AR zt5X@pZlFC|fLqx@vQjOk?ZucS4L0K_!6a$6i5n`6)MmhbNddKh2c0m0ZuMKaE1Bpk zOQ2fqIRbVAZJ7eJW=7!-5g2Pak8vW#{oZTL!B9;)oQBir&`FUU_BnDR4&rWowwL2p z&2hsv57$)?O|{yx`0NI5rbnVBosZsPIaxs*oD~W<%i~}#jY0QCDcaRS+{g&?8t5&F z*}y4a*ROH;LbT*WP_5Q;$9)^v5Ur5y{{*RldyyCE4}DB1tfbp36%i!T@h_pZjIFkDUk0#iLjSQ<9apm{PS@9an3BB)mhYOjO+vTjEY+${2xd1>7axqe_)xN<>TQ#7(30jgK$CE>34g9^ zO~N4(#hg~%sUUU(wTd9rDndvSR?#HnL^mZINkSL73%GvJ2m(Aw=;fL`oXeAhZfiQ# zs*O9wZon3M6t>tP8Z4an%LleC3D<8-q|H_$3&O(SS`u>H_!>w0hsy<*DTQj;P6o0Y zu*#3XDnCljP(u=~gr571qjXck_39P0(~XL7+L)WUiKsmcUo@!a;Jaz*X84ng& zAW6b3ns5_uNw|&z3B3(#Quy8^T<7jLDm|R>G&;#cgwwLf0@w|hC5K^_@Zcy3K1f*^i`MdGF`1eB>#zQ;T~aS_lrw)UR)FJv32bo6 zRWytsn!u&jz_rzv5{@5!?G13L*5UP(3osdCce*$?nz)$@@Xgjg+wCrx7J-j7EZ~@} pXk5c^d>;4_$v4Ub2!bH~jweN12@y?dQIY@v002ovPDHLkV1jQPaZ~^R diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png deleted file mode 100644 index f6e5026ec700f469d5cee50177cb62e35f9048e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1429 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 O0000ked zy>JPIwRO&b3n=K^98)8NDIzn#xNJhXBNl{So;~M9URxEyi|o_?wa?t&&nnl=`2jf=;KmVNj&-ga^eWq#(3*95{3S#Oig!U zb4!#I;7{0?Yyk56{NIc>EY&z1q+x2siHvO3%q1%QCN#K$v-E8Ju*~yb;g7)9wZest zf8f%eH^FlD8e~wX;oU=42-O-n7|hHlX6ajz2%dN(^8hs)BvDbFQWXWeb8T?r?=e_P z4Xr&8n{S8p8U_Lr={c!VU%p~@== zQkuXuW^+IgHF>X093pIkxrAj7deIh%vIo%BB+xq#y zF1H8v8_vL6IaTmRRs}@m*&vf{gj>_I4?x&|?I49ovhas+02OtS&?kI-(l2NR)c~?Y z8rPSB@V#b!2fY9Ji3b3NCY-Q+UpWM84MUMS-BZgqS1=J+M9$6WrO?(p%m-}ka)2EB zBC{*uFn_Oz6uz< zHN*Gy4NbyUG$G>&ps$K+E(4w&uq7>Z|c71jw2PNG&5d^R)*>IB-Ti3uiAF#c51j4ZD-#PTXAAn>0Hf+l*=KzjWH$g}LC}gpXSgdA{ zV_}xmwvb`Nf&hXvY)`P(#8vr%uJ?~XXsQt+a0j?O9=^YOZ~`+^$^mRg5MoRYubl@i zP<^g_Vc3u$01Vbd0-8@>;f==brW)bkRLi~EsBiv@>m%dwqJn5F)I!X}l>fmb3_z-+ z?Id8*QU9ur&a-nyksnzgr}P};SDwe2R%2#N@Tv88ZbvL4p&4M}(8w8)ZE;P{y7(wn zKet18nu$OCNF%pia#7u4#w!C5>2yy@6m%ONNbc`yn*Ab`;UPrQOllz-uia0oe&cSx z)ddi7r{QNf!@1Wo%BIMf{)iF|AlJ}OBR~sDb4>T%wGsu@xK2%v6OhnU^GsB(%}w44 z2aIRu8(v%=d{F~2d3JAbifQuhF2U?kmO!QP#TA?T3TN^rz7gxmBb97Z-|a{mK2m06 zYPOGjU%;_n1!(A(SH<{#tw}IHCsmhhlPc&;{E|Y86;z>E#bij-C30z6(X;=F>0>?C b|3d!)@rt8PaLF4|00000NkvXXu0mjfW|LX` diff --git a/.metadata/.plugins/org.eclipse.m2e.logback/0.log b/.metadata/.plugins/org.eclipse.m2e.logback/0.log index f906d07..80a58e3 100644 --- a/.metadata/.plugins/org.eclipse.m2e.logback/0.log +++ b/.metadata/.plugins/org.eclipse.m2e.logback/0.log @@ -3,3 +3,5 @@ 2026-05-02 22:23:21,340 [Worker-2: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-05-09 20:34:37,650 [Worker-1: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. 2026-05-10 01:32:01,791 [Worker-5: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. +2026-05-10 18:30:16,902 [Worker-6: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read. +2026-05-11 17:51:48,080 [Worker-5: Loading available Gradle versions] INFO o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is out-of-date. Trying to update. diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Crashpad/settings.dat b/.metadata/.plugins/org.eclipse.swt/EBWebView/Crashpad/settings.dat index 4083a1e40ab5d7931219e8a9b004490176390c40..94d7aa73b88719b3bb8e1c0ad80f8c156472ffcb 100644 GIT binary patch delta 24 bcmZ3$w18=Y0HXj40|d<6>E)3&Gxs|HKd}a3 delta 24 bcmZ3$w18=Y0HXjC0|d<6>E)3&Gxs|HKamDs diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/BrowsingTopicsState b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/BrowsingTopicsState index 192cbf1..5063d4d 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/BrowsingTopicsState +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/BrowsingTopicsState @@ -8,5 +8,5 @@ "top_topics_and_observing_domains": [ ] } ], "hex_encoded_hmac_key": "3DA604280665A873D0EA6D316B3A72B9F419BDC719033123A3E96DBB0342BE2C", - "next_scheduled_calculation_time": "13423430092943205" + "next_scheduled_calculation_time": "13423430092943254" } diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_0 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_0 index 0f2e114f4fba08b6be9f780f728b864796abd27d..62c76214602df984304f3641e63c5c72201fbb22 100644 GIT binary patch literal 45056 zcmeI&%S+T@6vpv)E>4bS+Nfzxlbc~8D3qkj)IekqK?PkFEp(B~C`u_>s6_uj@LRgD z$W=u5O;D{$if9v25CjplXjMrqBqABlnfIK%i*|hnUZ0Wo;hf)maOcdw&OQqv9rRU} z)2(l^`Xjzl5`X-c6=c2Mzk(JO1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5crn@cbke|h8_$APnn&_|NN75NX_Y&w;>W1!mIQOD9_B77%)IAwFdFz~6$X9;U;v7%C zZeMnlZbMMumrOK9bZAXPtF2 zPd5Gfy*qY13v!>A(_@_j`@RsEA-0Q4f>+F0}-uh{8oa4Dx?$^j!Z=L#w!9vD5 zp1MbSeb(7_>h!@$+vV9N_pNe@*17Vo`gq#rc(%*E?%H6TtCudMXY6x%>gQI+l65+A z*RNgN6`$F&MecRqM(e!Hzpqzqj;B708ueSJFg^ZP|JHaRfB*srAb&apvMW9RcO8NSMR4Fy;1ZNWWs4Tq)E^rg42Op1pol1befh#rr*%3(qUTQ|?aXZ~kdZ$UM|Nx4%Bkp8XIzp4yTB7)Z0$X-vI*Q~wb= zo_fb7nVfZ24-Nj@bG)~?%QM~)(ybv=(_I5g^-opncIMdNen2?PR>iQ~q5+ z?g(k#Ix|Nb<70OYH+OmJ`3{-HI>Y6+qk9ibw*7rp37%WzT&G~2sUxMOgBRj1Pkol0 zOow%@Cbi}I<73TTp6zm;$P}&fpuO6EzBtZF+5i9m diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_1 index b7fbb0c2c577e17ec06f76134920501aab0c0a63..4d543f6733fb6046be91a30661837387c4df6296 100644 GIT binary patch delta 566 zcmXZWF-Tic6b9h?UM}@kBV-675@@OtjK@JR#uznms6wYmTTo(=6HyUSad7BTiL|t( zgAk73QfjHFOA6`(UDJY-lejoK>EIxBC{zbM_vAgeT<-b)`@dVPgo>5WUNP#trq$?Z z(~F>zFXB}9@6}D^b*a$cndjPZG}SkQ8B>AZO1b-`LPX!LB{n>4E{nB-e#KTQMD^L` zaf^qo)p-m|p69NA=l#aFaSvl`HB{f0(>H(DCkWfhwmuH#Ek}dO`DyE$>MD(daiMlF z6HFnW2KU!j2-}6=SvZ;2{(F_G<=7LYind|bT?l#z@GmD9JGH+O_xaxDR7j-#Et zZ1mlQc}kcN>K+Ni=^tUYoRVNB<=5_k4Gt}z9ug*ndce#wMU}Hd9kA!KVJ}}6X;AJU%HTpoXQwz)bPD!!In4zdRru5Xyi_GKH1v*~0&q(>P)Kcm R!0cztI=tK?%m#j3JOc0Fp>+TN delta 566 zcmXZW&r4KM6bJD8?tA1_6bBN)5FABD$0H)l4;_EZL{zASGm9{BE4Drg<_1R_m9t~(?>4{qKo}M31Jl41 z3g}faH%r(j1RX7>DSkUxk2uDsf^Ep*%0C~WQfJ#^S?~M1qhEwExfTcWkfVdVZS?Kb z*92i)D3Nn}P9_Nxa!P`kmZ$Ze4SuUB4km?$z}#jED`(fzkN?HrghN8ZS?}WBUYT%M zjwvuRoYcXOEw8m56Q+blz}#VKSMG@|IhcErCmazP1#_P%&fC)2vzeEKqe5d~l01$C z^ru``BODVN2Q$Uv{-AKZc=&*DTqq4@f~iGm-xelT7j6=!g)(4rOzEJo`uhF+Q_MWa NjKf>+W5#{+^9nnYp4R{X diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_3 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/data_3 index 4a768576fca5fe47ac55d2e9d749aae002701e92..20fcc012b99ae65f087c3c4e08bdc21f13e3bfa9 100644 GIT binary patch delta 2297 zcmcJQZ)h8J7{}AzopyRjyWUot*ygV3nzS}u?=E-wb1M54*~>X6!hEBtDz9v>2#>3ah7jZ&TQhlzRw%Ns?M-` zpL;fSGjnl16rP{`_jD$7CK-LaCCH+j6(mVh3z{l9y3V{v@}jJm8KWpl zvLQ-}vRE<-a!EDhV%boXvSbwUa=EM&%TmrPm5s%+oXKVLhEg&MC0WfWtvfn1z`xsm zzukAK-OuXb>mQS@h1%pZH#1I@Q2PTdWE`DPh0(1JWlhRxa;r(G!v|Ig&2m$pc%nD< zK@|6laql=hp{ILEH|WBBK6}!6dnTc@HX3w{zto^ufji&_I5Oo0xIF9zpn3*ar-B1y zy#VV}?AX@2ZLXvH|29<@*pXje`@Me>_xtVIANQPgLYRskT3$jOrF-hAYO1V>@|rGO z>>J(sIj2dYraDcFQrBKeoEyLEqgH9x2^(2?)eCjusvF9Vk-6Xyj^3c7_IWazJz-Q& zX$!@oS$T8r;8Jn9bbRTRka@ClylTFo1$j{Iq;b&MAk>I`B{AUS7pQT&O5*m{gtu># zkydqrzA?0>*H^->v7;UD?k_+8SJ#*xYzz1@uHHD-Thbxr+~twy+RvD~-kT|@Js6QNG`Jo~d@^VW1=Egvvt z|H0j=MTdv|w))j?D{}{JWzoSS!D$N2<<|0Px)xt06w6h8{nwLT+fJn4-llCo(wScJ zgo1n@^I4qx!k7Ls#vBOzL|F7gr2$2 z;_nQBHwB^PZ~y=R delta 2048 zcma)+O=uK%7{;^N%p}!acat?~qH$-E`jME#%=gZ&TE~E-P}GA5r9qs{cDI6Jf|5f^ z!O>cKsUR-y9|d(H)RWLA!3-X3C$!L`hzG@slS4~s@t|o%B(i;GXCygnCcE%sZqM_7 zp7(v%u#I{HT<)hsb?%Qm-y2G!}5al^0UwnOi806ZJm!tqVIkjtUED% zblI15Yt)wFu-Rvw)~K7Ijzbft`dOZ1_h-Lk1x`>{K9%9QjKo{LL)4Q^C6kJ*d-=#y zdNJiHkqss_;3|;eNh(>qVT$DBB-LL0%M@2uBfs0!K5}%3x>JnZZnesj^#1tF`1JSD ziovyCy(doJJytQW-y6(T41{<=9UV|)E~lvJf{>DPMaSG3WM(cioB4D8fbZoX%-MhZ zI^KF-j_;++Q=JGSkR$WKVFZz&nrBNnEd3Q_MsJ&J3HpiaZ(QBMx?6u|-+u|?P(78# zYB!Opnw)noI-yyoKB7l|`)}V^?5DxHr}U>|G18%hcT_1v$%vSxLUb*hZm&9OA;Vcy zTKM3ek`|664!rh6Cz>D%@jv2U6GjX7tSo(1Z(LcK^bAoliA+*$_ZAx)m{~I%VH0b7 zk9Uop$ImURc@W(Wc>a=!wP=SMj=4di6aRWaM$UiYwqw$P?U?k+8LTOjKFE{|v~%AV z{lyhUJHvfn5yl8=hv-g#^zxTGbOUo|B*d0jI@+?}Jzn|3^U2rH5KE`43<$f$7wMi}y#Kw_6)*4=Ynh{MgRk6EuZgignqgysjh z#u6~R=@ECAswIo)x03(3k5#M<Xke7DFpf+p|*SOeCA2#A7pAO_-~8MJ@|SPxo38~6~kgAT9(Yy_QP6G#FE zu%HWcgO9*wumx-d+dvQK1=~R%=m!H}2N(n#;DG={AORUDAO%#A1{tsu>;k*N$GFoy M4P{L7+hsKW508Y1aR2}S diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000004 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000006 similarity index 85% rename from .metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000004 rename to .metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000006 index 935f1d4..108edf9 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000004 +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Cache/Cache_Data/f_000006 @@ -1 +1 @@ -[{"organization_id":656,"name":"IBM","member_since":"2002-02-21","renewal_date":"2027-01-01","description":{"long":"IBM and Eclipse\r\n
\r\nIBM is proud to be among the founders of the Eclipse project. Beginning in 2001, both IBM and Rational Software were founding members of the Eclipse consortium and the not for profit Eclipse Foundation. Rational Software was acquired by IBM in 2003, and today IBM Rational continues as a Strategic Member of the Eclipse Foundation.\r\n

\r\nEclipse continues to be core to dozens of IBM offerings from Rational, WebSphere, Lotus, Tivoli, and Information Management. IBM Rational software provides an Eclipse-based software development platform that improves the speed, quality, and predictability of software projects. This full life-cycle solution combines software engineering best practices, market-leading tools, and services.

\r\n\r\nThe Rational Software Delivery Platform\r\n
\r\nThe Rational Software Delivery Platform helps align all aspects of development and engineering operations with business needs. This highly collaborative environment supports IT as well as systems engineering efforts, and spans the entire project lifecycle with a complete, integrated set of products, services, and best practices.\r\n

\r\nA key component of the Rational portfolio is Jazz, a technology platform for collaborative software delivery. Uniquely attuned to global and distributed teams, the Jazz platform is designed to transform how people work together to build software -- making software delivery more collaborative, productive, and transparent.\r\n

\r\nThe IBM Rational Software Development Platform is the industry\\'s most complete, open, standards-based software development environment, and it enables our clients to more easily govern their software and systems development and delivery. Ninety-three of the Fortune Top 100 companies use Rational software.\r\n

\r\nAdditional information is available at
ibm.com/rational"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/656-web.gif"},"website":"https://www.ibm.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":665,"name":"SAP SE","member_since":"2004-01-01","renewal_date":"2027-02-01","description":{"long":"SAP has a rich history of innovation and growth that has made us the recognized leader in providing collaborative business solutions for all types of industries in every major market. \\r\\n\\r\\nAs a market leader in enterprise application and digital transformation software, SAP helps companies of all sizes and industries run better. From back office to boardroom, warehouse to storefront, desktop to mobile devices, SAP empowers people and organizations to work together more efficiently by utilizing cloud, analytics, machine learning, Big Data, IoT and other insights more effectively to stay ahead of the competition. SAP applications and open cloud platform services enable more than 296,000 customers in 190 countries to operate profitably, adapt continuously, and grow sustainably.\\r\\n\\r\\nSAP has been a strategic member of the Eclipse Foundation since its inception."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/665-web.png"},"website":"https://www.sap.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Platinum Member","level":"WGPLM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":682,"name":"Ericsson AB","member_since":"2004-01-14","renewal_date":"2027-02-01","description":{"long":"At Ericsson, we strive to connect everyone, wherever they may be. Because by being connected, people can take part in the emerging global collaboration that is the Networked Society - a society in which every person and every industry is empowered to reach their full potential.\\r\\nOur services, software and infrastructure - especially in mobility, broadband and the cloud - are enabling the communications industry and other sectors to do better business, increase efficiency, improve their users\\' experience and capture new opportunities.\\r\\nBy enabling the Networked Society, we make a real difference to people\\'s lives, and the world we live in.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/682-web.png"},"website":"https://www.ericsson.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":685,"name":"Fujitsu Limited","member_since":"2004-04-28","renewal_date":"2027-04-01","description":{"long":"We provide software and services to help companies continuously visualize and optimize their business processes and applications to improve and innovate while creating leaner, more efficient operations. With market conditions changing rapidly, organizations need to be equipped to iteratively develop, deploy, and optimize business processes and applications to meet these business demands - without compromising on business governance."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/685-web.png"},"website":"https://www.fujitsu.com/global/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":687,"name":"Genuitec, LLC","member_since":"2008-08-31","renewal_date":"2027-01-01","description":{"long":"Genuitec's products enable developers to build anything from anywhere with anyone.\n

\nMyEclipse, our flagship professional IDE, is the world-wide leader in its class for enterprise Java and web development. Premium toolset. Fair pricing.\n

\nCodeTogether, our cross-IDE live sharing system, enables users of Eclipse, VS Code, IntelliJ, and the IDEs based on those, to code together collaboratively using all the tools they prefer.\n

\nDevStyle with Darkest Dark makes millions of Eclipse installations look their very best, in dark or light themes, with stunning custom icons. Free in the marketplace."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/687-web.png"},"website":"https://genuitec.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":690,"name":"EclipseSource","member_since":"2007-03-01","renewal_date":"2027-03-01","description":{"long":"EclipseSource has well over a decade of experience in designing, developing and enhancing tools for a variety of domains and based on all major technology platforms. Whether it is a classic IDE for software engineering, a modeling tool for your domain experts or a domain-specific solution for engineers, whether the tool is a web-based, a desktop-based application, a tool based on Eclipse Theia or a plugin for Eclipse, EclipseSource can support you in implementing the best possible solution for your use case. We provide a complete range of services including conception, evaluation, training, support, and consulting/implementation all with a special focus on framework adoption, creation, and (long-term) maintenance. EclipseSource is a major contributor to a large number of open source projects inside and outside the Eclipse ecosystem. EclipseSource is distributed over multiple locations in Europe and serves a truly global customer base from various domains, ranging from Fortune 100 corporations to individual developers"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/690-web.png"},"website":"https://eclipsesource.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":721,"name":"Oracle","member_since":"2004-01-27","renewal_date":"2027-02-01","description":{"long":"Oracle\\'s business is information how to manage it, use it, share it, protect it. The world\\'s largest enterprise software company, Oracle is the only vendor to offer solutions for every tier of your business-database, middleware, business intelligence, business applications, and collaboration. With Oracle, you get information that helps you measure results, improve business processes, and communicate a single truth to your constituents.\\r\\n\\r\\nOracle\\'s next-generation enterprise computing platform Fusion is being designed to enable incremental adoption of a powerful, flexible, service-oriented IT infrastructure without the disruption associated with a wholesale platform upgrade. This portfolio is built on powerful Fusion design principles, standardizing the priorities and practices of your enterprise computing strategy-saving you significant time and money."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/721-web.gif"},"website":"https://www.oracle.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":731,"name":"Red Hat, LLC.","member_since":"2005-01-26","renewal_date":"2027-03-01","description":{"long":"Red Hat is the open hybrid cloud technology leader, delivering a trusted, consistent and comprehensive foundation for transformative IT innovation and AI applications. Its portfolio of cloud, developer, AI, Linux, automation and application platform technologies enables any application, anywhere—from the datacenter to the edge. As the world's leading provider of enterprise open source software solutions, Red Hat invests in open ecosystems and communities to solve tomorrow's IT challenges. Red Hat helps its partners and customers build, connect, automate, secure and manage their IT environments, supported by consulting services and award-winning training and certification offerings."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/731-web.png"},"website":"https://www.redhat.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"},{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"df911e0adcad1a1c51df","description":"","level":"WGPL","working_group":"asciidoc"},{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":742,"name":"Thales","member_since":"2009-08-28","renewal_date":"2027-04-01","description":{"long":"Thales is a world leader in mission-critical information systems for defense and security, aerospace and transportation."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/742-web.jpg"},"website":"https://www.thalesgroup.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Strategic Member","level":"WGSD","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":758,"name":"Fraunhofer-Gesellschaft","member_since":"2004-01-01","renewal_date":"2027-02-01","description":{"long":"

The Fraunhofer-Gesellschaft, headquartered in Germany, is the worlds leading applied research organization. With its focus on developing key technologies that are vital for the future and enabling the commercial exploitation of this work by business and industry, Fraunhofer plays a central role in the innovation process. As a pioneer and catalyst for groundbreaking developments and scientific excellence, Fraunhofer helps shape society now and in the future. Founded in 1949, the Fraunhofer-Gesellschaft currently operates 75 institutes and research institutions throughout Germany. The majority of the organizations 29,000 employees are qualified scientists and engineers, who work with an annual research budget of 2.8 billion euros. Of this sum, 2.4 billion euros are generated through contract research.

\\r\\n

For several Fraunhofer institutes, open source plays a vital role in many research areas:

\\r\\n

The Fraunhofer Institute for Open Communication Systems FOKUS offers research services ranging from requirements analysis to consulting, feasibility studies, technology development right up to prototypes and pilots in the business segments Digital Public Services, Future Applications and Media, Quality Engineering, Smart Mobility, Software-based Networks, Networked Security, Visual Computing und Analytics. Fraunhofer FOKUS, for example provides the open source simulation environment Eclipse MOSAIC for testing mobility scenarios. In addition, the institute has contributed an IoT-Testware to Eclipse and is interested in AI, Cloud and Edge activities.

\\r\\n\\r\\n

The Fraunhofer Institute for Intelligent Analysis and Information Systems IAIS is one of the leading scientific institutes in Artificial Intelligence, Machine Learning, and Big Data in Germany and Europe. With its more than 300 employees, the institute supports companies in the optimization of products, services, processes and structures and development of new digital business models.

\\r\\n\\r\\n

The Fraunhofer Institute for Experimental Software Engineering IESE supports the digitization of services, systems, and the development of digital ecosystems. Dedicated to open-source software, we create solutions for virtual engineering, safe systems, and Industry 4.0.

\\r\\n\\r\\n

The Fraunhofer Institute for Software and Systems Engineering ISST focuses on designing and developing data spaces that enable sovereign, secure and controllable data sharing across company boundaries. Therefore, Fraunhofer ISST offers technical design, implementation of system components and consultancy services throughout the entire development process.

\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/758-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":760,"name":"Object Management Group, Inc.","member_since":"2004-01-01","renewal_date":"2027-01-01","description":{"long":"OMG Task Forces develop enterprise integration standards for a wide range of technologies and an even wider range of industries. OMG\\'s modeling standards enable powerful visual design, execution and maintenance of software and other processes. For more information, visit www.omg.org. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/760-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":800,"name":"STMicroelectronics International N.V.","member_since":"2020-01-01","renewal_date":"2027-01-01","description":{"long":"At ST, we are 48,000 creators and makers of semiconductor technologies mastering the semiconductor supply chain with state-of-the-art manufacturing facilities. An independent device manufacturer, we work with more than 200,000 customers and thousands of partners to design and build products, solutions, and ecosystems that address their challenges and opportunities, and the need to support a more sustainable world. Our technologies enable smarter mobility, more efficient power and energy management, and the wide-scale deployment of the Internet of Things and 5G technology. ST is committed to becoming carbon neutral by 2027. Further information can be found at www.st.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/800-web.png"},"website":"https://st.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":816,"name":"Vector Informatik GmbH","member_since":"2006-05-12","renewal_date":"2027-05-01","description":{"long":"

\nVector provides tools, software components and engineering services for the networking of electronic systems in the automobile and related industries.\n

The ECU development is supported with tools for the design, test, calibration and diagnostics as well as with software components and development services.

"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/816-web.png"},"website":"https://www.vector.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Platinum Member","level":"WGPLM","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":823,"name":"ARM Limited","member_since":"2006-08-01","renewal_date":"2027-04-01","description":{"long":"Arm designs the technology that lies at the heart of advanced digital products, from wireless, networking and consumer entertainment solutions to imaging, automotive, security and storage devices.\\r\\n
\\r\\nArm\\'s comprehensive product offering includes 16/32-bit RISC microprocessors, data engines, 3D processors, digital libraries, embedded memories, peripherals, software and development tools, as well as analog functions and high-speed connectivity products.\\r\\n
\\r\\nCombined with the company\\'s broad Partner community, they provide a total system solution that offers a fast, reliable path to market for leading electronics companies. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/823-web.png"},"website":"https://www.arm.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":848,"name":"Advanced Micro Devices (AMD)","member_since":"2007-02-27","renewal_date":"2026-07-01","description":{"long":"Advanced Micro Devices, Inc. (NYSE: AMD) is a global leading provider of processors, chipsets and graphics products. To ensure that these products enable solutions for customers, AMD works with the software community, invests in advancements in the software ecosystem and develops tools and libraries to assist in software development. For more information on AMD's software product, efforts and guidance on software development, visit AMD Developer Central at http://developer.amd.com"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/848-web.jpg"},"website":"https://www.amd.com/en/developer.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"}],"is_active_member":true},{"organization_id":863,"name":"OBEO","member_since":"2007-05-29","renewal_date":"2026-06-01","description":{"long":"Obeo is a software provider, specialized in the model driven approach and a key player of the Eclipse platform. It is an actor of the Open Source ecosystem and a strategic member of the Eclipse Foundation; Obeo is one of the major Eclipse contributors, ranking up as one of the top contributing companies every year since it became a member of the Eclipse Foundation.\\r\\n\\r\\nObeo\\'s primary concerns are to provide open technologies allowing users to master the complexity of systems.\\r\\n\\r\\nIts product range include: Sirius (Graphical Designers), Acceleo (code generator), Obeo Designer (custom graphical modeling environment), collaborative add-ons for Eclipse Capella, Obeo SmartEA (Enterprise Architecture), consulting (training, expertise and coaching), and Eclipse Modeling as a foundation stack of any modeling environment.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/863-web.png"},"website":"https://www.obeosoft.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":890,"name":"BlackBerry Limited ","member_since":"2007-12-04","renewal_date":"2026-12-01","description":{"long":"QNX Software Systems Limited, a subsidiary of BlackBerry Limited, is a leading provider of operating systems, middleware, professional services, and Eclipse-based development tools for connected embedded systems. Global leaders such as Audi, Siemens, General Electric, Cisco, and Lockheed Martin depend on QNX technology for their in-car electronics, medical devices, industrial automation systems, network routers, and other mission- or life-critical applications. Visit www.qnx.com and follow @QNX_News on Twitter. For updates on the company\\'s automotive work, follow @QNX_Auto and visit qnxauto.blogspot.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/890-web.png"},"website":"https://blackberry.qnx.com/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":895,"name":"Siemens AG","member_since":"2008-01-16","renewal_date":"2027-02-01","description":{"long":"Siemens is a global powerhouse focusing on the areas of electrification, automation and digitalization. One of the worlds largest producers of energy-efficient, resource-saving technologies, Siemens is a leading supplier of systems for power generation and transmission as well as medical diagnosis. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/895-web.gif"},"website":"https://www.siemens.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":937,"name":"CEA LIST","member_since":"2008-09-18","renewal_date":"2027-01-01","description":{"long":"List, expert on digital systems
\\r\\n
\\r\\nBased in Saclay (Paris region, France), List is a public research institute specialized in digital systems design. Its main mission is based on achieving excellence technological development on behalf of industrial partners for value creation.
\\r\\n
\\r\\n100 industrial collaborations per year
\\r\\n
\\r\\nList institute counts more than 700 partners and every year more than a 100 partnership activities are being conducted with French and foreign industrial companies on applied research projects in four main topics:\\r\\n
    \\r\\n
  • Advanced Manufacturing
  • \\r\\n
  • Embedded systems
  • \\r\\n
  • Ambient intelligence
  • \\r\\n
  • Health ionizing radiations
  • \\r\\n
\\r\\nLabeled as Carnot Institute , List invests every year 25% of its budget into scientific resourcing actions in order to identify better tomorrows technological breakthroughs.
\\r\\n
\\r\\nCEA Tech as CEA (Commissariat a l\\'energie atomique et aux energies alternatives) Technological Research Division, gathers three specialised technological research institutes among which List institute specialised on digital systems.
\\r\\n
\\r\\nAt a world class state-of-the-art
\\r\\n
\\r\\nOur activity is based on three main pillars\\r\\n
    \\r\\n
  • Scientific excellence
  • \\r\\n\\r\\nList research engineers dedicate a 100% of their time to R&D activities and publish their results into international leading conferences and scientific journals. Keeping a strong link with academic research, they base their research on world-wide state of the art.\\r\\n\\r\\n
  • The Culture of Industry
  • \\r\\n\\r\\nOur research teams are enlightened and motivated by a results-driven culture of projects, fixing themselves clear objectives to reach within committed deadlines and budgets. Each project launched by List Institute is fully assigned to permanent and suited human resources. The project management is based on a precise calendar, identified milestones and a clear description of deliverables.
    \\r\\n\\r\\nResearch results confidentiality and intellectual property (patents) are defined by the parties in the collaboration agreement.\\r\\n\\r\\n
  • Opening to the world
  • \\r\\n\\r\\nList Institute is fully integrated into a local and national particularly dynamic ecosystem through strategic academic, institutional and industrial partnerships. In order to maintain the best level internationally in its fields of activity List institute is also involved in more than 200 European collaborative projects, collaborates with leading foreign academic laboratories and conducts research activities at an international level, especially in the USA."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/937-web.png"},"website":"https://list.cea.fr/en/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"ecd63e75a561bffe2ffc","description":"Strategic Member","level":"WGSD","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":954,"name":"Business Systems Integration AG","member_since":"2009-03-26","renewal_date":"2027-04-01","description":{"long":"With its BSI Customer Suite, the Swiss software company BSI provides a comprehensive platform for the digital transformation of customer relationships. It offers everything needed for an outstanding customer experience in the retail, banking, insurance and energy & utility industries. At the core of the innovation is the company’s many years of industry experience. Founded in Baden, Switzerland, in 1996, BSI has about 400 employees and 7 additional offices in Germany and Switzerland. BSI’s customers include companies and organizations such as ADAC, Signal Iduna and HDI and other market-leading companies throughout Europe. Visit BSI"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/954-web.png"},"website":"https://www.bsi-software.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":968,"name":"Eurotech","member_since":"2009-12-10","renewal_date":"2027-01-01","description":{"long":"

    Eurotech integrates hardware, software, solutions, and expertise to deliver embedded computing platforms, sophisticated systems and cloud-based services to leading OEMs, system integrators, and enterprise customers for successful, efficient, and speedy deployment of their products and services.

    \n\n

    Eurotech simplifies pervasive computing, allowing our customers to focus on their core competencies, the products and services only they can deliver, while Eurotech lays the embedded computing foundation to bring those offerings to market as quickly as possible. (1) Minimalist computing, drawing on decades of experience in low power design, miniaturization of platforms, and simplification of application development through modular middleware and toolsets, allows our customers to create the most efficient products and services possible. (2) With strengths in wireless services and communications protocols, we deliver the integrated and connected solutions our customers need to simplify the development and deployment of their products and services, even through the cloud. (3) Combining pervasive technology excellence with domain expertise allows Eurotech to meet the pervasive computing needs of five key market segments including healthcare, security, transportation, energy, and industrial. (4) As a trusted business associate to both our customers and our partners, we are committed to the mutual success of all companies in the value chain for networked solutions.

    \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/968-web.png"},"website":"https://www.eurotech.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":977,"name":"FZI Forschungszentrum Informatik","member_since":"2010-04-12","renewal_date":"2027-04-01","description":{"long":"The FZI Research Centre for Information Technology is an interdisciplinary non-profit research organization, based in Karlsruhe, Germany, whose mission is to facilitate technology transfer of innovative IT solutions and to provide a bridge between academia and industry. FZI offers its customers a unique interdisciplinary environment that fosters joint research among diverse fields of Computer Science, Mechanical and Electrical Engineering, and Economics. \n\nFZI has been a great success story for 25 years now, and using its extensive network of contacts both in the academic and the industrial world, it has been an important catalyst for the development of IT in the Karlsruhe region. \n\nToday, FZI has over 150 employees, mostly young scientists with outstanding experience in both research projects and professional consulting activities.\n\nFZI is a major promoter of Open Source, having among its employees contributors to dozens of open source projects, many of which targeting the Eclipse platform.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/977-web.png"},"website":"https://www.fzi.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":979,"name":"Robert Bosch GmbH","member_since":"2010-04-27","renewal_date":"2027-01-01","description":{"long":"The Bosch Group is a global supplier of technology and services. Its operations are divided into four business sectors: Mobility Solutions, Industrial Technology, Consumer Goods, and Energy and Building Technology. Bosch offers innovative solutions for smart homes, Industry 4.0, and connected mobility. Bosch is pursuing a vision of mobility that is sustainable, safe, and exciting, as well as an open approach to the Software Defined Vehicle technology stack of the future in conjunction with its subsidiary ETAS GmbH. The Bosch Group comprises roughly 440 companies in about 60 countries, employing some 76,100 associates in research and development, around half of which are software engineers."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/979-web.png"},"website":"https://bosch.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":989,"name":"Protos Software GmbH","member_since":"2010-06-23","renewal_date":"2026-07-01","description":{"long":"Protos is a service company that specialized in the development of model-driven, domain-specific tools and applications for Embedded Systems.\\r\\n\\r\\nWe develop tools and applications for our customers and support them with training, consulting and coaching. Most of our projects are based on Eclipse Open Source Tools."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/989-web.png"},"website":"https://protos.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":990,"name":"Sigasi","member_since":"2010-06-24","renewal_date":"2026-07-01","description":{"long":"Sigasi allows FPGA and ASIC designers in the medical, telecom, automotive, defense, and aerospace worlds to achieve their full potential with a powerful Integrated Development Environment (IDE).\n\nSigasi assists design engineers in writing RTL with a mix of VHDL, Verilog, and SystemVerilog, giving them everything from basic editing to advanced features like autocomplete, code navigation, and linting. Most importantly, Sigasi gives hardware designers real-time feedback.\n\nMoreover, Sigasi integrates with existing workflows, including CI/CD checking, allowing teams to safeguard entire code repositories. This is particularly valuable for ASIC design and optimizing hand-off to verification teams."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/990-web.png"},"website":"https://www.sigasi.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":998,"name":"FUNDACIÓN TECNALIA RESEARCH & INNOVATION","member_since":"2010-09-24","renewal_date":"2027-04-01","description":{"long":"

    TECNALIA is the largest center of applied research and technological development in Spain, a benchmark in Europe and a member of the Basque Research and Technology Alliance. We collaborate with companies and institutions to improve their competitiveness, people’s quality of life and achieve sustainable growth. We do it thanks to people who are passionate about technology and committed to building a better society.

    \n

    Our Mission: To transform technological research into prosperity.

    \n

    Our Vision: To be agents of transformation of companies and society for their adaptation to the challenges of a changing future.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/998-web.png"},"website":"https://www.tecnalia.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Supporter Member","level":"WGSM","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1006,"name":"Yatta Solutions GmbH","member_since":"2010-11-29","renewal_date":"2026-12-01","description":{"long":"Yatta is all about software development, engineering and evolution. We started as a developer tool company, transformed into a software vendor and now help build B2B ecosystems for digital products.\n

    \nWe are open-source project lead of the Eclipse Marketplace Client, package maintainer of the Eclipse IDE for Java Developers, and member of the Eclipse IDE working group. We commit and contribute to various other open-source projects as well.\n

    \nOur goal is to keep and sustain Eclipse as an open ecosystem. That's why we have launched the Yatta Checkout for Eclipse."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1006-web.png"},"website":"https://yatta.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1009,"name":"BMW Group","member_since":"2011-01-01","renewal_date":"2027-01-01","description":{"long":"BMW Group is now Eclipse member.\n

    \nThe BMW Group is an automobile manufacturer. With its three brands, BMW, MINI and Rolls-Royce Motor Cars, the BMW Group is focusing on the premium sector of the international automobile market. In addition the BMW Group is also a manufacturer of motorcycles and a provider of financial services.\nSoftware plays an important role in modern cars and is one of the main drivers of innovation in the automobile industry. The Eclipse technology is used by BMW in various forms for the development of in-car electric/electronic (E/E) systems and its accompanying development tasks.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1009-web.png"},"website":"https://www.bmw.com/en/index.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1042,"name":"Virtual Vehicle Research GmbH","member_since":"2012-02-03","renewal_date":"2027-02-01","description":{"long":"Virtual Vehicle Research GmbH (ViF) is a holding company of the COMET K2 research program \\\"K2 Digital-Mobility\\\" an international institution in the field of application-oriented vehicle development."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1042-web.jpg"},"website":"https://www.virtual-vehicle.at/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1069,"name":"Renesas Electronics Corporation","member_since":"2012-11-09","renewal_date":"2026-11-01","description":{"long":"Renesas Electronics Corporation, headquartered in Japan, delivers trusted embedded design innovation with complete semiconductor solutions that enable billions of connected, intelligent devices to enhance the way people work and livesecurely and safely.\\r\\n\\r\\nA global leader in microcontrollers, analog, power and SoC products, Renesas provides the expertise, quality, and comprehensive solutions for a broad range of Automotive, Industrial, Home Electronics (HE), Office Automation (OA) and Information Communication Technology (ICT) applications to help shape a limitless future.\\r\\n\\r\\nRenesas Electronics is one of the leading supplier for the global automotive industry and number one supplier of automotive microcontrollers (MCUs) worldwide with advanced semiconductor solutions, including system-on-chip (SoC). \\r\\n\\r\\nWith Renesas autonomyTM, an open, innovative, and trusted platform for assisted and automated driving, Renesas Electronics gives customers the choice to decide the future of driving will look like.\\r\\n\\r\\nRenesas Electronics is dedicated to support big ideas both locally and globally with its subsidiaries in 20 countries worldwide. More information is available at www.renesas.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1069-web.png"},"website":"https://www.renesas.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1077,"name":"University of Skovde","member_since":"2013-02-28","renewal_date":"2027-02-01","description":{"long":"The University of Skovde is one of the most specialised universities in Sweden and our research is focused on the development and use of advanced information technology systems and models. Areas of expertise include organisational and technological aspects of the ICT area. Over a number of years research has addressed various aspects of openness. We have significant experience with research and practice related to different stakeholder roles (including providers, developers and users) related to Open Source and Open Standards. Previous activities include involvement as partner and leader in several international and national research projects. In collaboration with leading academic partners we conducted rigorous research in the EU FP6 CALIBRE project (2004-2006), which involved extensive interaction with European industry and presented a roadmap for future research on the Open Source phenomenon. As partners in the CALIBRE-project, the ITEA-project COSI and the ITEA2-project OPEES, we have experience of international collaboration, and close collaboration with many leading researchers and practitioners in areas related to the Open Source phenomenon. Current activities include research on various aspects of openness impacting on long-term sustainability of software systems with associated digital assets. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1077-web.jpg"},"website":"https://www.his.se/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1083,"name":"Robotron Datenbank-Software GmbH","member_since":"2013-06-01","renewal_date":"2026-06-01","description":{"long":"Robotron is an innovative IT service provider specializing in the efficient management and analysis of large volumes of data. We support customers in the energy sector, industry and public administration with practical software solutions that optimize business processes and deliver measurable value across the value chain. Our portfolio is complemented by comprehensive consulting, project and operational services – making us a reliable partner who understands both technologies and industry-specific processes."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1083-web.jpg"},"website":"https://www.robotron.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1090,"name":"Open Source Automation Development Lab (OSADL)","member_since":"2022-07-27","renewal_date":"2027-04-01","description":{"long":"The Open Source Automation Development Lab (OSADL) eG is a community for Open Source software in industry and delivers everything a company needs to successfully use Open Source software and especially Linux in industrial products and generally in embedded systems in an efficient and license compliant way. \n\nOSADL is a registered cooperative and accepts members from all over the world. The economical advantage of an OSADL membership is based on the principle of OSADL’s business model: Develop once for the use of many. \n\nMore information at: https://www.osadl.org"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1090-web.png"},"website":"https://www.osadl.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1105,"name":"Lablicate GmbH","member_since":"2013-12-01","renewal_date":"2026-12-01","description":{"long":"Lablicate GmbH is the company behind OpenChrom. Our expertise is software in general and Eclipse technology in special in combination with knowledge of various techniques used in analytical chemistry and related areas. The combination of IT- and Science Know-How is our strength. We are experienced using the benefits of both world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1105-web.png"},"website":"https://www.lablicate.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1106,"name":"AMIQ EDA","member_since":"2013-12-09","renewal_date":"2026-12-01","description":{"long":"AMIQ EDA provides software tools that enable hardware design and verification engineers to increase the speed and quality of new code development, simplify legacy code maintenance, accelerate language and methodology learning, and improve source code reliability."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1106-web.jpg"},"website":"https://www.amiq.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1122,"name":"HiveMQ GmbH","member_since":"2014-05-06","renewal_date":"2027-05-01","description":{"long":"HiveMQ helps companies connect devices to the Internet. Our HiveMQ MQTT platform makes it possible to move data from device to cloud in a secure, reliable and scalable manner. Over 130 customers, including many Fortune 500 companies, rely on HiveMQ in production for mission critical use cases like connected cars, transportation, logistics, Industry 4.0 and connected IoT products. Visit hivemq.com for more details."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1122-web.png"},"website":"https://www.hivemq.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1125,"name":"Kichwa Coders Canada Inc.","member_since":"2014-05-14","renewal_date":"2027-05-01","description":{"long":"Kichwa Coders is a software consultancy specialising in Eclipse open source software for scientific and embedded applications. We help companies adopt and make the most out of open source software."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1125-web.png"},"website":"https://www.kichwacoders.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1134,"name":"Mercedes-Benz Tech Innovation GmbH","member_since":"2014-06-18","renewal_date":"2027-01-01","description":{"long":"We develop IT for tomorrow's mobility: We are a fully owned subsidiary of Mercedes-Benz Group AG. As an equal IT partner, we work within the Mercedes-Benz Group AG to shape the digital path to future mobility."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1134-web.png"},"website":"https://www.mercedes-benz-techinnovation.com/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1135,"name":"Canonical Group Limited","member_since":"2014-06-12","renewal_date":"2026-06-01","description":{"long":"

    Canonical is the company behind Ubuntu, the leading OS for container, cloud, scale-out and hyperscale computing. 65% of large-scale OpenStack deployments are on Ubuntu, using both KVM and the pure-container LXD hypervisor for the worlds fastest private clouds. Canonical provides enterprise support and services for commercial users of Ubuntu.

    \\r\\n\\r\\n

    Canonical leads the development of Juju, the model-driven operations system, and MAAS (Metal-as-a-Service), which creates a physical server cloud and IPAM for amazing data centre operational efficiency. Established in 2004, Canonical is a privately held company.

    \\r\\n\\r\\n

    Canonical leads the development of the snap universal Linux packaging system for secure, transactional device updates and app stores. Ubuntu Core is an all-snap OS, perfect for devices and appliances. Established in 2004, Canonical is a privately held company.

    \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1135-web.png"},"website":"https://www.ubuntu.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"},{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1138,"name":"Universite Grenoble Alpes (UGA)","member_since":"2014-07-03","renewal_date":"2026-07-01","description":{"long":"As the world is becoming more and more competitive, our institution aims to better respond to the challenges the world poses universities today and in the future, and to be more visible and attractive internationally.\\r\\n\\r\\nThe Universit Grenoble Alpes already features in the top 100 and top 200 universities in major international rankings (Reuters, Shanghai, Times Higher Education and QS for example) for some of its scientific fields. The UGA rivals the best universities in the world thanks to the strength of its research and the numerous educational innovations it has implemented."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1138-web.png"},"website":"https://www.univ-grenoble-alpes.fr/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1144,"name":"DB Systel GmbH","member_since":"2014-08-01","renewal_date":"2027-03-01","description":{"long":"

    \\r\\nDB Group offers globally mobility and logistical services and operates in over 130 countries world-wide. Every day, more than 300,000 employees, of which about 195,000 are located in Germany, are committed to ensuring that customers are provided with mobility and logistical services and that the related rail, road, ocean and air traffic networks are operated and controlled efficiently.\\r\\n

    \\r\\n

    \\r\\nThe companys core business is the railway in Germany with more than 5,5 million customers every day in the passenger transport segment, and about 596 thousand tons of freight shipped via rail. More than 1.8 million customers travel via DB buses in Germany every day. Deutsche Bahn operates more than 40,000 train runs daily on its more than 33,300 kilometer-long, modern rail network, which is also open to competition. The number of train stations is 5.681.\\r\\n

    \\r\\n

    \\r\\nFrom electronic signal boxes to online ticketing and computerized route planning \\r\\noperating today\\'s highly complex mobility and traffic networks is simply unimaginable\\r\\nwithout information and communication technology (ICT). DB Systel, a wholly owned subsidiary of the DB Group, is the digitalisation partner for all Deutsche Bahn companies. As an integrated and value-adding company within the DB Group, DB Systel offers a comprehensive range of customised solutions and services that meets the highest IT standards and picks up on the latest trends. It does so by incorporating its extensive railway and IT expertise and, as a long-term vendor-neutral partner, by pursuing the Groups common objective.\\r\\n

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1144-web.png"},"website":"https://www.dbsystel.de/dbsystel","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1147,"name":"Mueller-BBM VibroAkustik Systeme GmbH","member_since":"2014-10-01","renewal_date":"2026-10-01","description":{"long":"As one of the world\\'s leading suppliers of vibroacoustic measurement technology, Mueller-BBM VibroAkustik Systeme is focussed on the acquisition, analysis, evaluation and management of dynamic data. \nOur tight partnership with the various industries as well as our recognized expertise in acoustics and vibration results in innovative solutions and establishes us as a strong partner for your noise, vibration and harshness (NVH) measurement and analysis requirements. Our PAK system seamlessly integrates into laboratory, production and field environments."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1147-web.png"},"website":"https://www.mbbm-vas.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1156,"name":"Neuron Engineering Tools GmbH","member_since":"2015-01-08","renewal_date":"2027-01-01","description":{"long":"Neuron Engineering Tools GmbH, with locations in Austria, Germany and Hungary, has been developing software tools and platforms for industrial automation since 1987. Key solutions include the IEC 61131-3 programming system of the Neuron Engineer series, the portable runtime system RTS (scalable from microcontrollers to multi-core IPCs), and the documentation tool logi.DOC. Over 30,000 engineers worldwide use Neuron software to automate systems such as power plants, steel mills, machines, and more — creating, testing, and managing efficient, high-quality solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1156-web.png"},"website":"https://www.neuron-automation.eu/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1164,"name":"Gradle Inc","member_since":"2015-02-24","renewal_date":"2027-03-01","description":{"long":"Gradle Inc. is the company behind the leading software solution for improving developer productivity called Gradle Enterprise and the popular open-source Java build automation system called Gradle Build Tool.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1164-web.png"},"website":"https://gradle.org","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1166,"name":"Azul Systems, Inc","member_since":"2015-05-07","renewal_date":"2027-05-01","description":{"long":"Azul Systems is the world\\'s only company that is 100% focused on Java and Java runtime technology. We believe that we can help the IoT developers take advantage of the power and productivity of Java by reducing the frictions (licensing costs, field-of-use restrictions) and perceptions (footprint, etc.) gating widespread adoption of the language throughout the IoT.\nAs members of the Eclipse community we are bringing Zulu and Zulu Embedded - our 100% open source JDKs, to the IoT. Our Zulu products are certified builds of OpenJDK and meet the Java SE standards for Java 8, 7 and 6. Each release of Zulu and Zulu Embedded has passed the thousands of tests in OpenJDK Technology Compatibility Kit (TCK) as well as extensive in-house verification suite. Zulu runs on many Linux distros, on Windows and the Mac.\nZulu is a complete Java Development Kit, and Zulu Enterprise provides designers with a choice of storage footprint, bitness (32 or 64-bit configurations), headless or headful, and both development and runtime-only options.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1166-web.jpg"},"website":"https://www.azul.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1194,"name":"TypeFox GmbH","member_since":"2016-02-02","renewal_date":"2027-02-01","description":{"long":"TypeFox is a team of software pioneers building the languages and IDEs that modern engineering teams rely on. We’re the inventors behind open source projects such as Langium, Theia, Sprotty, and Open VSX — technologies that have become the backbone of custom development environments and domain-specific tooling across industries.\n\nWe help projects move from idea to working product with clarity and technical depth. Whether it’s a cloud-ready IDE, a tailored DSL, or a complex graph visualization, we build solutions that adapt to your workflows instead of the other way around. And because our technology base is open source, you benefit from extensible foundations designed for long-term impact."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1194-web.png"},"website":"https://www.typefox.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"}],"is_active_member":true},{"organization_id":1196,"name":"Microsoft Corp.","member_since":"2016-01-15","renewal_date":"2026-06-01","description":{"long":"At Microsoft, our developer mission is to deliver experiences that empower any developer, building any application, on any OS. And this mission requires us to be open, flexible, and interoperable: to meet developers and development teams where they are, and provide tools, services and platforms that help them take ideas into production. Supporting the Eclipse Foundation enables us to collaborate more closely with the Eclipse community, deliver a great set of tools and services for all development teams, and continuously improve our cloud services, SDKs and tools."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1196-web.png"},"website":"https://www.microsoft.com/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1208,"name":"Universitat Oberta De Catalunya","member_since":"2016-04-07","renewal_date":"2027-04-01","description":{"long":"

    A state-of-the art technological university with a highly innovative learning model, providing a benchmark for quality in both teaching and R&D. This is the philosophy of the Universitat Oberta de Catalunya (UOC, Open University of Catalonia), created in 1994 as one of the worlds very first completely online higher education establishments and that currently has more than 50,000 students.

    \\r\\n

    The UOCs core goal is to be the university of the knowledge society, promoting innovative education, personalised learning, technological leadership, R&D work on the information society and e-learning and the dissemination of knowledge. The UOC promotes R&D activities via 10 groups linked the Internet Interdisciplinary Institute (IN3), specialising in the study of the networked society and the knowledge economy, network technologies and specific software areas. Over the last five years, the UOC has participated in more than 260 R&D projects, either national or European. What is more, the UOC works to promote knowledge transfer and has, over the last four years, signed more than 1000 agreements to this end. The UOC forms part of more than 30 international networks, including the European University Association (EUA), the International Council for Open and Distance Education (ICDE) and the IMS Global Learning Consortium

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1208-web.png"},"website":"https://www.uoc.edu/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1219,"name":"Fondazione Bruno Kessler","member_since":"2016-10-04","renewal_date":"2026-10-01","description":{"long":"Fondazione Bruno Kessler - FBK - is a private no profit research institution based in Trento, Italy. \\r\\nFBK is divided in several centres and its mission is to develop both knowledge and expertise in the fields of Information and Communication Technology, Microsystems/Microelectronics and Social science, aiming to conduct technology transfer at the local, national and international industrial level. \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1219-web.png"},"website":"https://www.fbk.eu/en/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1220,"name":"Salesforce.com, Inc.","member_since":"2016-10-05","renewal_date":"2027-01-01","description":{"long":"Salesforce is a customer relationship management solution that brings companies and customers together. It\\'s one integrated CRM platform that gives all your departments including marketing, sales, commerce, and service a single, shared view of every customer."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1220-web.png"},"website":"https://opensource.salesforce.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1221,"name":"Webtide LLC","member_since":"2016-10-10","renewal_date":"2026-10-01","description":{"long":"Webtide was founded with one goal in mind: to provide the very best service and support for developer teams of all sizes who want to work with Eclipse Jetty and CometD. Whether your project is small or large, weve worked with companies around the world to make sure that their Jetty and CometD projects are a success.\\r\\n\\r\\nUnlike some other software companies, Webtides focus is on service, not on growth we value stability over size. We dont over-promise or under-deliver; our support is terrific and our products do just what they say theyll do. We have worked with some of the biggest names in technology and have a portfolio of satisfied customers. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1221-web.png"},"website":"https://webtide.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1228,"name":"OFFIS e.V","member_since":"2016-11-11","renewal_date":"2026-11-01","description":{"long":"Knowlegdge Transfer

    A fast knowledge transfer from research into the economy is the crucial foundation for the economic, as well as the social well-being of a country. We have made this transfer our task: As an associated institute of the Carl von Ossietzky University in Oldenburg, OFFIS has, since its formation in 1991, converted scientific know-how from computer science into prototypes which are then developed further into marketable products by commercial partners. Hereby, OFFIS provides research and prototype developments for companies and institutions and this at the highest international level."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1228-web.png"},"website":"https://www.offis.de/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1235,"name":"Deutsches Zentrum fuer Luft- und Raumfahrt e.V. (DLR)","member_since":"2017-01-02","renewal_date":"2027-01-01","description":{"long":"

    \\r\\nDLR is the national aeronautics and space research centre of the Federal Republic of Germany. Its extensive research and development work in aeronautics, space, energy, transport and security is integrated into national and international cooperative ventures. In addition to its own research, as Germanys space agency, DLR has been given responsibility by the federal government for the planning and implementation of the German space programme. DLR is also the umbrella organisation for the nations largest project management agency.\\r\\n

    \\r\\n

    \\r\\nDLR has approximately 8000 employees at 20 locations in Germany: Cologne (headquarters), Augsburg, Berlin, Bonn, Braunschweig, Bremen, Bremerhaven, Dresden, Goettingen, Hamburg, Jena, Juelich, Lampoldshausen, Neustrelitz, Oberpfaffenhofen, Oldenburg, Stade, Stuttgart, Trauen, and Weilheim. DLR also has offices in Brussels, Paris, Tokyo and Washington D.C.\\r\\n

    \\r\\n

    \\r\\nDLRs mission comprises the exploration of Earth and the Solar System and research for protecting the environment. This includes the development of environment-friendly technologies for energy supply and future mobility, as well as for communications and security. DLRs research portfolio ranges from fundamental research to the development of products for tomorrow. In this way, DLR contributes the scientific and technical expertise that it has acquired to the enhancement of Germany as a location for industry and technology. DLR operates major research facilities for its own projects and as a service for clients and partners. It also fosters the development of the next generation of researchers, provides expert advisory services to government and is a driving force in the regions where its facilities are located.\\r\\n

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1235-web.png"},"website":"https://www.dlr.de/DE/Home/home_node.html","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1238,"name":"Payara Services Limited","member_since":"2017-01-31","renewal_date":"2027-02-01","description":{"long":"Payara Server - Robust, Reliable, Supported\\r\\n

    \\r\\nPayara Server is a fully supported, developer-friendly, open source application server. Payara Servers architecture is innovative, cloud-native and optimized for production deployments.\\r\\n

    \\r\\nMonthly releases, bug fixes and a 10-year support lifecycle optimizes Payara Server for production deployments. Payara Server is aggressively compatible with common ecosystem components and ensures future compliance with Jakarta EE. \\r\\n

    \\r\\nThe application server, compatible with Eclipse MicroProfile, is built and supported by a team of DevOps engineers dedicated to the continued development and maintenance of the open source software and committed to optimizing Payara Server as the best option for production Java EE applications.\\r\\n

    \\r\\n

    \\r\\nPayara Micro - Small, Simple, Serious\\r\\n

    \\r\\nPayara Micro is the open source, lightweight middleware platform of choice for containerized Java EE (Jakarta EE) microservices deployments. Less than 70MB in size, Payara Micro requires no installation or configuration and no need for code rewrites so you can build and deploy a fully working app within minutes.\\r\\n

    \\r\\nCompatible with Eclipse MicroProfile, Payara Micro is the microservices-ready version of Payara Server. You can run war files from the command line without any application server installation. Automatic and elastic clustering makes Payara Micro ideal for running Java EE applications in a modern virtualized infrastructure.\\r\\n

    \\r\\nPayara Micro also comes with a Java API so it can be embedded and launched from your own Java applications.\\r\\n

    \\r\\n

    \\r\\nPayara Enterprise - Software. Security. Stability. Support.\\r\\n

    \\r\\nPayara Enterprise lets you decide when to migrate from one release to the next with a 10-year support lifecycle and access to extra release streams. Youll maintain the security and stability of your applications environment from the JVM on up.\\r\\n

    \\r\\nOur global engineers go beyond the support help desk, offering fast issue resolution and 24-hour support options for your production Payara Server environment, while also giving customers priority on bug fixes and new features requests.\\r\\n

    \\r\\nPayara Enterprise customers enjoy a choice of 105 or 247 support, unlimited tickets, access to a private customer knowledge base and use of fully-supported builds of OpenJDK through our partnership with Azul."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1238-web.png"},"website":"https://www.payara.fish/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1239,"name":"SSI Schaefer IT Solutions GmbH","member_since":"2017-02-09","renewal_date":"2027-02-01","description":{"long":"

    The SSI Schaefer Group is the worlds leading provider of modular warehousing and logistics solutions. It employs approximately 10,500 people at its group headquarters in Neunkirchen (Germany), at more than ten domestic and international production sites, and at approximately 70 worldwide operative subsidiaries. Across six continents, SSI Schaefer develops and implements innovative industry-specific answers to its customers unique challenges. As a result, it plays a key role in shaping the future of intralogistics.

    \\r\\n\\r\\n

    SSI Schaefer designs, develops and manufactures systems for warehouses, industrial plants, workshops and offices. Its portfolio includes manual and automated solutions for warehousing, conveying, picking and sorting, plus technologies for waste management and recycling. In addition, SSI Schaefer is now a leading provider of modular, regularly updated software for in-house material flows. Its IT team, with a headcount in excess of 1,100, develops high-performance applications, and provides customers with in-depth advice on the intelligent combination of software with intralogistics equipment. SSI Schaefers broad IT offering, including its own WAMAS and SAP products, delivers seamless support for all warehouse and material flow management processes. Solutions from SSI Schaefer improve the productivity and efficiency of customer organizations not least through the highly precise monitoring, visualization and analysis of operational metrics for proactive intralogistics management.

    \\r\\n\\r\\n

    SSI Schaefer offers highly sophisticated, turnkey systems. As an international player, it can deliver one-stop solutions to all four corners of the earth. Its comprehensive portfolio encompasses design, planning, consulting, and customer-specific aftersales services and maintenance.

    \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1239-web.png"},"website":"https://www.ssi-schaefer.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1244,"name":"Associacao de Usuarios da Tecnologia Java, SouJava","member_since":"2017-03-14","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1244-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1246,"name":"PTA GmbH","member_since":"2017-04-10","renewal_date":"2027-04-01","description":{"long":"The range of services of the PTA GmbH meets the requirements of digitalization for companies in various industries (ranging from process management, ERP, CRM and industry systems to the development of individual software and hosting solutions \\\"Made in Germany\\\" as well as IT security). Since 1969, the PTA Group has been working with more than 400 employees for long-term customer and employee relationships and is distinguished by its independence from capital markets and manufacturers as a family-run company."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1246-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1248,"name":"Tomitribe Corporation","member_since":"2017-05-01","renewal_date":"2027-05-01","description":{"long":"It\\'s Tomitribe\\'s mission to provide support for consumers, educate people on TomEE, Open Source and Java EE and contribute to the success of everyone in the community. We believe Open Source is an ecosystem and everyone in that ecosystem has a role to play, from the people who produce it to the companies who use it.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1248-web.png"},"website":"https://tomitribe.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1251,"name":"M3S Research Unit at the University of Oulu","member_since":"2017-06-06","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1251-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1269,"name":"Calypso Networks Association","member_since":"2017-12-20","renewal_date":"2027-01-01","description":{"long":"Calypso technology has been designed to ensure interoperability between transportation networks equipments and is open to all manufacturers providers. It has been deployed for 20 years in 25 countries without any hacking reported since now and work with any kind of NFC portable objects: Smart Cards, Secures elements, Sim cards or HCE in Smart Phones.\\r\\n\\r\\nCNA is established in Brussels and has been founded in 2003, with the founder members of the european Calypso project : \\r\\nOTLIS, Ticketing operator of Lisbon\\r\\nACTV, Transport operator of Venice\\r\\nSTIB, Transport operator of Brussels\\r\\nLKRKN, Landrat of Constance\\r\\nRATP, Transport operator of Paris area\\r\\nSNCF, French national trainrail\\r\\n\\r\\nCNA is open to all actors playing a role in the Calypso environment, whether they are user of Calypso or a provider of Calypso. CNA has 80 active members and its main objectives are to define and direct the reference specifications, to implement a certification policy, to guarantee the compatibility of all current and future product, to establish a Calypso label issued by an independent organization, to promote Calypso to operators and manufacturers to yield its distribution, to contribute to the international standardization process, to facilitate and harmonize the shared members\\' needs and expriences. \\r\\n\\r\\nCNA is currently working on developping a full open source SDK for generic contactless Ticketing, which provides a library functions to developers, manages security and masks the complexity of a Calypso transaction.\\r\\n\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1269-web.png"},"website":"https://www.calypsonet-asso.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1286,"name":"Kynetics","member_since":"2018-03-21","renewal_date":"2027-04-01","description":{"long":"Kynetics offers a suite of Android and Linux operating systems (OS) for embedded systems, featuring popular application processors from NXP, Qualcomm, Mediatek and NVIDIA.\nKynetics empowers embedded system providers and manufacturers by offering a also comprehensive suite of products on top of its engineering services.\nDevelopment Tools for extending and simplifying the development and deployment process, allowing engineers to focus on core functionalities of their embedded applications.\nUpdate Factory enables secure and efficient remote updates and management of remote devices. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1286-web.png"},"website":"https://www.kynetics.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1308,"name":"The Cloud Native Computing Foundation","member_since":"2018-04-26","renewal_date":"2027-05-01","description":{"long":"Cloud native technologies empower organizations to build and run\\r\\nscalable applications in modern, dynamic environments such as public,\\r\\nprivate, and hybrid clouds. Containers, service meshes, microservices,\\r\\nimmutable infrastructure, and declarative APIs exemplify this\\r\\napproach.\\r\\n\\r\\nThese techniques enable loosely coupled systems that are resilient,\\r\\nmanageable, and observable. Combined with robust automation, they\\r\\nallow engineers to make high-impact changes frequently and predictably\\r\\nwith minimal toil.\\r\\n\\r\\nThe Cloud Native Computing Foundation seeks to drive adoption of this\\r\\nparadigm by fostering and sustaining an ecosystem of open source,\\r\\nvendor-neutral projects. We democratize state-of-the-art patterns to\\r\\nmake these innovations accessible for everyone."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1308-web.png"},"website":"https://www.cncf.io/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1309,"name":"London Jamocha Community","member_since":"2017-01-09","renewal_date":"2027-05-01","description":{"long":"The LJC is a broad community of technologists and other associate with Java and JVM related technologies. Although it is based in London, UK - it has strong international membership due to its global programmes (such as Adopt a JSR and Adopt OpenJDK).\\r\\n\\r\\nThe LJC hosts regular events including:\\r\\n\\r\\n
      \\r\\n
    • Casual catch-ups in a cafe
    • \\r\\n
    • Hack days, evening talks
    • \\r\\n
    • un-conferences
    • \\r\\n
    • workshops
    • \\r\\n
    • mentoring
    • \\r\\n
    • demo days
    • \\r\\n
    • career mentoring by Londons Java specialists
    • \\r\\n
    • and much more!
    • \\r\\n
    \\r\\n\\r\\nThe LJC acts as a voice for Java engineers in London UK as well as globally. This includes but is not limited to helping run a build farm for Java, representing Java developers worldwide on the JCP (aka the Java standards body) as well as the Jakarta EE and MicroProfile communities."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1309-web.png"},"website":"https://www.meetup.com/Londonjavacommunity/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1310,"name":"Cirrus Link Solutions , LLC","member_since":"2018-05-01","renewal_date":"2027-05-01","description":{"long":"Cirrus Link Solutions provide secure and reliable IIOT software solutions enabled with MQTT that integrates process information throughout the organization bridging the IT / OT gap while supplying a superior OT solution. \\r\\n

    \\r\\nWith over 30 years of SCADA and Telemetry experience and the co-inventor of MQTT where M2M and IoT started, Cirrus Links understands the technology requirements to help companies achieve their business objectives. Our experiences and ingenuity has been integral in developing the technology to enable and effectively manage data assets for real-time controls to big data analytics for AI and predictive maintenance. We pride ourselves with our software delivering real solutions for IIOT and SCADA that are tried, tested and ready for production today.\\r\\n

    \\r\\nCirrus Link puts your business data to work faster and smarter. Break out of the information silo created by traditional software and use machines to share in real time with anyone in your company. With Cirrus Link machine to machine (M2M) technology, your people get on-time, real-time access to critical information. Allowing your business can make more informed, smarter decisions.\\r\\n

    \\r\\nLearn more at www.cirrus-link.com"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1310-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1312,"name":"Istanbul JUG","member_since":"2018-05-02","renewal_date":"2027-05-01","description":{"long":"The JUG IST acts as a voice for software engineers in Turkey as well as globally. The JUG Istanbul is a non-profit, big community of technologists associated with Java and JVM related technologies based in Istanbul, Turkey. List of our activities;\\r\\n\\r\\n

    \\r\\n
      \\r\\n
    • JavaDay Istanbul
    • \\r\\n
    • meetups, evening talks
    • \\r\\n
    • un-conferences
    • \\r\\n
    • workshops
    • \\r\\n
    • mentoring
    • \\r\\n
    • coding sessions
    • \\r\\n
    \\r\\n

    \\r\\nand much more!\\r\\n\\r\\nTwitter: @jug_istanbul\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1312-web.png"},"website":"https://www.jugistanbul.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1317,"name":"Inductive Automation","member_since":"2018-06-08","renewal_date":"2026-06-01","description":{"long":"Inductive Automation creates industrial software that empowers organizations to swiftly turn great ideas into reality by removing all technological and economic obstacles. \\r\\n\\r\\nBy cross-pollinating IT with SCADA technologies, Inductive Automation created Ignition software, the first universal industrial application platform with unlimited potential. Ignition empowers industrial organizations around the world and in virtually every industry, with an outstanding software platform and top-notch support."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1317-web.png"},"website":"https://inductiveautomation.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1319,"name":"Karakun AG","member_since":"2018-07-04","renewal_date":"2026-07-01","description":{"long":"Karakun is a growing team of very experienced software engineers developing agilely custom solutions for enterprises offering an optimal user experience. This includes portals (B2E, B2B, B2C), dashboards, and specialized solutions for numerous industries.\\r\\n\\r\\nOur offering includes full-stack development of custom software solutions especially for the cloud. Consequently, we are also engaging with activities around Jakarta EE.\\r\\n\\r\\nWe especially deliver platforms and applications for the integrated management of measurement data to our customers. Therefore, we are contributing to the openMDM working group (https://www.openmdm.org/) and its associated projects.\\r\\n\\r\\nAnd, finally, Karakun offers technology and solutions for semantic enterprise search with high security requirements."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1319-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1320,"name":"Liferay International Limited","member_since":"2025-05-06","renewal_date":"2027-05-01","description":{"long":"Liferay makes software that helps companies create digital experiences on web, mobile and connected devices. Our platform is open source, which makes it more reliable, innovative and secure. We try to leave a positive mark on the world through business and technology. Hundreds of organizations in financial services, healthcare, government, insurance, retail, manufacturing and multiple other industries use Liferay."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1320-web.png"},"website":"https://www.liferay.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1321,"name":"iJUG Interessenverbund der Java-User Groups e V","member_since":"2018-07-10","renewal_date":"2026-07-01","description":{"long":"The interest group of Java User Groups iJUG e.V. is a coalition of approximately 40 Java User Groups from Germany, Switzerland and Austria. The organization promotes the common interests of its members to developers, manufacturers, distributors and the general public."},"logos":{"print":"https://membership.eclipse.org/organization/images/1321-print.eps","web":"https://membership.eclipse.org/organization/images/1321-web.png"},"website":"https://www.ijug.eu/en/home/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Participant Member","level":"WGAPS","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1329,"name":"Advantest Europe GmbH","member_since":"2018-08-10","renewal_date":"2026-08-01","description":{"long":"A world-class technology company, Advantest is the leading producer of automatic test equipment (ATE) for the semiconductor industry and a premier manufacturer of measuring instruments used in the design and production of electronic instruments and systems. Its leading-edge systems and products are integrated into the most advanced semiconductor production lines in the world. The company also focuses on R&D for emerging markets that benefit from advancements in nanotech and terahertz technologies, and has introduced multi-vision metrology scanning electron microscopes essential to photomask manufacturing, as well as groundbreaking 3D imaging and analysis tools. Founded in Tokyo in 1954, Advantest established its first subsidiary in 1982, in the USA, and now has subsidiaries worldwide. More information is available at www.advantest.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1329-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1330,"name":"kuehn & weyh Software GmbH","member_since":"2018-09-01","renewal_date":"2026-09-01","description":{"long":"kwsoft is a medium-sized software manufacturer and solution provider, with corporate headquarters in Freiburg, Germany.\\r\\n

    \\r\\nThe CCM solution Serie M/ enables high-quality customer communication that is precisely tailored to the recipient in terms of content, form and medium. The solution gives administrators the greatest possible control over their document processes because it offers a standardized solution from a single vendor - from document composition and creation to multichannel output management."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1330-web.png"},"website":"https://kwsoft.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1339,"name":"OpenDevise Inc","member_since":"2018-12-29","renewal_date":"2027-01-01","description":{"long":"

    OpenDevise helps organizations achieve faster growth through better documentation.

    \\r\\n

    OpenDevise: Tools. Workflows. Information Architecture.

    \\r\\n

    We develop automated tools and build processes that take the complexity, human effort, and anxiety out of deploying documentation sites. OpenDevise is the creator of Antora, a documentation site generator that enables technical writers to create, manage, remix, and publish documentation sites from AsciiDoc-based content sourced from a selection of versioned content repositories.

    \\r\\n

    DevOps for Documentation Teams

    \\r\\n

    We upgrade documentation teams to a modern, agile workflow for creating, reviewing, testing, and publishing documentation composed in the lightweight markup language AsciiDoc. As the maintainers of the leading AsciiDoc processor, Asciidoctor, we have a deep understanding of how to best integrate and adapt AsciiDoc into your documentation teams workflow. OpenDevise helps teams save time, minimize risk, and increase their writing and publishing productivity. A few of the ways we assist are through toolchain configuration, publishing pipeline architecture, UI design, and extension development.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1339-web.png"},"website":"https://opendevise.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"df911e0adcad1a1c51df","description":"","level":"WGPL","working_group":"asciidoc"}],"is_active_member":true},{"organization_id":1345,"name":"Linux Foundation","member_since":"2019-04-02","renewal_date":"2027-04-01","description":{"long":"Founded in 2000, the Linux Foundation is supported by more than 1,000 members and is the worlds leading home for collaboration on open source software, open standards, open data, and open hardware. Linux Foundations projects are critical to the worlds infrastructure including Linux, Kubernetes, Node.js, and more. The Linux Foundations methodology focuses on leveraging best practices and addressing the needs of contributors, users and solution providers to create sustainable models for open collaboration. For more information please visit us at www.linuxfoundation.org."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1345-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1349,"name":"Eteration A.S","member_since":"2019-05-31","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1349-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1352,"name":"AVL List GmbH","member_since":"2019-06-17","renewal_date":"2026-07-01","description":{"long":"AVL is the world\\'s largest independent company for the development, simulation and testing of powertrain systems (hybrid, combustion engine, transmission, electric drive, batteries, fuel cell and control technology) for passenger cars, commercial vehicles, construction, large engines and their integration into the vehicle. The company has decades of experience in the development and optimization of powertrain systems for all industries. As a global technology leader, AVL provides complete and integrated development environments, measurement and test systems as well as state-of-the-art simulation methods. As a pioneer in the field of innovative solutions, such as diverse electrification strategies for powertrains, AVL is increasingly taking on new tasks in the field of autonomous driving, especially on the basis of subjective human sensations (driveability, connectivity, ADAS, etc.). In the competition of technologies internal combustion engine, battery/electric drive and fuel cell and their combinations, AVL is working intensively and with the same priorities. AVL has digitized the vehicle development process with state-of-the art and highly scalable IT, software and technology platforms, and creates new customer solutions in the areas of big data, artificial intelligence, simulation and embedded systems in an agile and integrated development environment."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1352-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1367,"name":"Information Systems & Databases (DBIS,Informatik 5) of RWTH Aachen University","member_since":"2024-03-12","renewal_date":"2027-03-01","description":{"long":"Across the world and for many decades, the Laboratory for Machine Tools and Production Engineering (WZL) of RWTH Aachen University has stood for successful and forward-thinking research and innovation in the area of production engineering.\\r\\n\\r\\nUnder the leadership of four professors, Thomas Bergs, Christian Brecher, Robert Schmitt and Guenther Schuh, the WZL is conducting research in six areas - production technology, machine tools, production systems, transmission technology, production metrology and quality management - on the future-oriented design of production in high-wage countries. \\r\\n\\r\\nTogether with industry partners from various sectors, the WZL develops solutions for a wide variety of production scenarios in both publicly funded and bilateral projects. \\r\\n\\r\\nThese activities are being consolidated on the RWTH Aachen Campus in the Cluster Production Engineering."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1367-web.png"},"website":"https://www.wzl.rwth-aachen.de/go/id/sijq/?lidx=1","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1374,"name":"Lulea University of Technology","member_since":"2019-09-25","renewal_date":"2026-10-01","description":{"long":"Lule University of Technology is experiencing strong growth with world-leading competence in several areas of research. Our research is conducted in close collaboration with industries such as Bosch, Ericsson, Scania, LKAB, SKF and leading international universities. Lule University of Technology has a total turnover of 190M per year. We currently have 1800 employees and 16 500 students.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1374-web.png"},"website":"https://www.ltu.se/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1376,"name":"Cedalo GmbH","member_since":"2019-10-07","renewal_date":"2026-10-01","description":{"long":"Streamsheets are a powerful no-code platform to build applications for industrial automation, connectivity and event stream processing.\\r\\n\\r\\nThanks to the familiar spreadsheet user interface also non-programmers create full-fledged applications and services to process data from machines, sensors, apps, APIs and more. With Streamsheets users build customized digital solutions on the edge, on-premises and in the cloud. \\r\\n\\r\\nThe Mosquitto Project is one of the most popular Message Brokers and highly suitable for a broad range of application areas in the Internet of Things and beyond."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1376-web.png"},"website":"https://cedalo.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1380,"name":"Huawei Technologies Co., LTD.","member_since":"2015-06-23","renewal_date":"2026-10-01","description":{"long":"Huawei is a leading global information and communications technology (ICT) solutions provider. Driven by a commitment to sound operations, ongoing innovation, and open collaboration, we have established a competitive ICT portfolio of end-to-end solutions in telecom and enterprise networks, devices, and cloud technology and services. Our ICT solutions, products, and services are used in more than 170 countries and regions, serving over one-third of the world\\'s population. With more than 180,000 employees, Huawei is committed to enabling the future information society, and building a Better Connected World."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1380-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Strategic Member","level":"WGSD","working_group":"oniro"}],"is_active_member":true},{"organization_id":1382,"name":"Software Institute, Università della Svizzera italiana","member_since":"2019-11-26","renewal_date":"2026-12-01","description":{"long":"At the Software Institute, we discover, design, and develop new ideas that ease the conception of modern software systems. Our research is rooted both in sound theoretical models as well as practical, real-life questions that impact modern society."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1382-web.png"},"website":"https://si.usi.ch","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1383,"name":"Bird Software Solutions Ltd","member_since":"2019-11-27","renewal_date":"2026-12-01","description":{"long":"BIRD Software Solutions Ltd provides solutions and consultancy to support the use of the Banks Integrated Reporting Directory (BIRD) project which is managed by the European Central Bank. (https://www.ecb.europa.eu/stats/ecb_statistics/co-operation_and_standards/reporting/html/bird_dedicated.en.html ) "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1383-web.png"},"website":"https://www.birdsoftwaresolutions.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1384,"name":"CANARY LABS INC.","member_since":"2019-12-03","renewal_date":"2026-12-01","description":{"long":"Considering most operations have thousands (if not hundreds of thousands) of data points, how you collect and store your data is vitally important to your success.\\r\\n\\r\\nAt Canary, we believe making your data easy to store and recall makes you more successful. We\\'ve spent over 20 years building a time series database that sets the standard in any industry.\\r\\n\\r\\nThe Canary System allows you to:
    \\r\\n\\r\\nCollect and store billions of data values.
    \\r\\nSpend less time on database management.
    \\r\\nNever worry about performance or losing your data.
    \\r\\n\\r\\nPaired with the MQTT Sparkplug B protocol, you can easily scale your organization from just few tags to millions without spending months of man hours."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1384-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1387,"name":"DENSO AUTOMOTIVE Deutschland GmbH","member_since":"2019-12-16","renewal_date":"2027-01-01","description":{"long":"DENSO AUTOMOTIVE Deutschland GmbH is a subsidiary of DENSO Corporation which is a global automotive supplier company."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1387-web.png"},"website":"https://www.denso.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1390,"name":"OSB Alliance- Bundesverband für digitale Souveränität e.V.","member_since":"2020-01-01","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1391,"name":"TmaxSoft Co., Ltd","member_since":"2020-02-01","renewal_date":"2027-02-01","description":{"long":"TmaxSoft was founded on the principle that there is always a better way. Nothing will stop us from creating better solutions that improve your business in ways that other companies cant. Or wont. A global software innovator focused on cloud, infrastructure and legacy modernization, we give you the freedom to take control of your technology. Our complete stack of software solutions help you efficiently manage and fully leverage your critical data. This provides global IT customers with software-defined mainframe rehosting, middleware and RDBMS technology that enables IT to actively and effectively contribute to achieving business objectives. With our remarkable technology, fresh perspective, collaborative spirit, and unusual clarity and transparency, youll finally have the choice you deserve. Along with freedom from status quo technology, more opportunities and faster ways to innovate, reduced risk of change, greater cost savings, and a better customer experience. \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1391-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1397,"name":"Kingdee Apusic Cloud Computing Co.,Ltd","member_since":"2020-02-15","renewal_date":"2027-02-01","description":{"long":"Kingdee Apusic cloud computing Co., Ltd. was founded in 2000, formerly known as Kingdee middleware Co., Ltd., which is a subsidiary of Kingdee group and a member of China Electronics Technology Group Taiji Co., Ltd. It is a key software enterprise in the national planning and layout and a leading cloud service provider of digital government, basic software service provider, and public financial management software service provider of China."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1397-web.png"},"website":"https://www.apusic.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1399,"name":"NEC Corporation","member_since":"2021-10-14","renewal_date":"2026-08-01","description":{"long":"NEC provides products for business, ranging from terminals to network and computer equipment, software products and service platforms, as well as integrated platforms based on them. We deliver labor-saving and efficient platforms for customers, while at the same time creating new value such as IoT platforms based on ICT as we contribute to the expansion of solutions for society."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1399-web.png"},"website":"https://www.nec.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1401,"name":"Primeton Information Technologies, Inc","member_since":"2020-02-18","renewal_date":"2027-03-01","description":{"long":"Primeton was established on March 36, 2003 and changed from a limited liability company to a joint stock company in 2010. The company has obtained a number of national honor certifications, such as National Enterprise Technology Center, Postdoctoral Research Station, and continuously passed the International Software Capability Maturity Model Integration (CMMI) Level 5 Certification and ISO9001 Quality Management System Certification. It has mastered 41 key and major core technologies and a number of reserve technologies in the field of software foundation platforms, 27 invention patents and172 software copyrights. The company participated in two important SOA international technical specifications of SCA / SDO and 11 national technical standards Formulation.\\r\\nPrimeton is a professional software foundation platform provider. It provides independent, controllable, safe and reliable software foundation platforms and application software development services for large and medium-sized users in the financial, government, energy, telecommunications, manufacturing and other industries.\\r\\nSince its establishment, the company has continued to cultivate the field of software foundation platforms. After more than ten years of technology and experience, it has established a \\\"standard product + platform customization + application development\\\" business model, which includes the sales and maintaining service of standard software products of the software foundation platform, platform customization and application development services.\\r\\nPrimeton has been committed to the construction of independent research and development and innovation capabilities of the core technology of the software foundation platform. It has created a component-based technology platform and core technology combination, and formed a systematic technology research and development capability, the platformized capability of product development and comprehensive project implementation methodology. Based on core technologies and innovation capabilities, Primeton provides customers with software products and technical services, helping customers flexibly and quickly respond to complex and changing business scenarios and successfully achieve business transformation under new generation information technologies such as cloud computing and big data.\\r\\nAfter more than ten years of focused development, Primeton enjoys high brand awareness in the field of software foundation platforms. In 2018, there were 120 Chinese companies in the Fortune Global 500, 44 of which chose Primeton Informations software platform products or technical solutions. The technical performance, maturity and safety and reliability of the company\\'s products and technical solutions have been verified in thousands of large-scale and key projects in national economic key areas such as finance, government affairs, energy, telecommunications, and manufacturing. Primeton has a China Registration and Clearing Corporation , Shanghai Gold Exchange, China Mobile, General Administration of Customs and other large and medium-sized customers in the industry are all Primetons regular customers. Primeton has gradually changed the absolute dominant position of international brands in the domestic software infrastructure platform market."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1401-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1405,"name":"Barcelona Supercomputing Center (BSC)","member_since":"2020-03-05","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1405-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1409,"name":"Futurewei Technologies, Inc.","member_since":"2020-03-06","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1409-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Silver Member","level":"WGHLP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1423,"name":"University of Bologna","member_since":"2021-10-14","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1423-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1427,"name":"openKONSEQUENZ eG","member_since":"2020-03-09","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1427-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1428,"name":"Alibaba Cloud","member_since":"2020-05-01","renewal_date":"2027-05-01","description":{"long":"As a business unit of Alibaba Group (NYSE: BABA), Alibaba Cloud provides a comprehensive suite of global cloud computing services to power both our international customers online businesses and Alibaba Groups own e-commerce ecosystem. In January 2017, Alibaba Cloud became the official Cloud Services Partner of the International Olympic Committee.\\r\\nBy harnessing, and improving on, the latest cloud technology and security systems, we tirelessly work towards our vision - to make it easier for you to do business anywhere, with anyone in the world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1428-web.png"},"website":"https://www.alibabacloud.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1434,"name":"Polytechnique Montreal","member_since":"2020-03-27","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1434-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1436,"name":"ETH Zurich","member_since":"2020-04-02","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1436-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1437,"name":"Broadcom","member_since":"2008-02-28","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1437-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1441,"name":"Topio Networks","member_since":"2020-04-28","renewal_date":"2027-05-01","description":{"long":"Topio Networks, an industry research platform, \\r\\naccelerates markets and businesses by providing \\r\\ndetailed information about use cases, verticals \\r\\nand industries. \\r\\n\\r\\nTopio Networks offers detailed data insights and natural language analysis about the shape, structure and sizing of the thousands of use cases, verticals and \\r\\ntechnologies that are the building blocks of the fourth \\r\\nindustrial revolution. Our data is constantly fed by \\r\\nthe daily insights generated by our taxonomy driven, \\r\\nhuman curated AI Platform. \\r\\n\\r\\nThe Topio Networks Market Intelligence Center provides free access to our industry research with detailed data about market sizing, innovations, funding and marketing activities for each specific use cases, industries and emerging technologies. \\r\\n\\r\\nIn addition, Topio Networks offers acceleration \\r\\nservices to businesses by providing the content \\r\\nnecessary to develop their go to market strategies, by \\r\\ntracking the company content and mapping it to the \\r\\nbest practices of the industry and providing market \\r\\naccess through events and lead generation.\\r\\nTo learn more about how Topio Networks applies \\r\\nAI and Natural Language Processing to create \\r\\ncomprehensive research about thousands of use \\r\\ncases,"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1441-web.png"},"website":"https://www.topionetworks.com","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1442,"name":"Chevron Technical Center","member_since":"2020-04-29","renewal_date":"2027-05-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1442-web.png"},"website":"https://www.chevron.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1443,"name":"Open Source Robotics Foundation","member_since":"2020-05-06","renewal_date":"2027-05-01","description":{"long":"We offer robotics R&D, consulting, custom engineering, and application development services to industry and government. We work with companies large and small and public agencies around the world. Whether you want to learn more about Gazebo, need to streamline your ROS-based product development, or are looking for a partner for your next R&D program, we\\'re here to help. The unifying theme of our team and our work is openness. We use and we build open systems. To the greatest extent possible, we freely distribute our work product, whether software, hardware, or documentation, under an open source license."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1443-web.png"},"website":"https://www.openrobotics.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1451,"name":"Institut für angewandte Systemtechnik Bremen Gmbh","member_since":"2020-06-18","renewal_date":"2026-06-01","description":{"long":"What is ATB?
    \\r\\nATB is an application oriented research institute founded jointly by the Free Hanseatic City of Bremen and several leading industrial enterprises in Bremen area in 1991.\\r\\n

    \\r\\nATB is a part of the long-term strategy of the Free Hanseatic City of Bremen to sustain economy in northern Germany and, particularly, in Bremen by strengthening innovation potentials of industrial enterprises and other organisations.\\r\\n

    \\r\\nATB is a highly innovative and efficient technology centre providing system technology related services to a wide spectrum of enterprises and organisations, thereby increasing their ability to remain competitive. ATB has developed into a dynamically expanding research institute operating successfully on the national, European and world-wide market and offering to partners a high level of expertise in several technological domains.\\r\\n

    \\r\\nWhat does ATB offer?
    \\r\\nATB offers\\r\\n

      \\r\\n
    • services in process/product innovation activities based on advanced Information and Communication Technology solutions
    • \\r\\n
    • flexibility of a dynamic, performance and application oriented research institute
    • \\r\\n
    • remarkable competencies in both
    • \\r\\n
        \\r\\n
      • technical and research domains
      • \\r\\n
      • management of complex technical projects
      • \\r\\n
      \\r\\n
    • High expertise in several domains based on effective team-building of staff members with long-term experience and agile young researchers
    • \\r\\n
    \\r\\nThe basis for all projects is a cooperative partnership with clients, allowing for a collaborative and effective approach to achieve the clients innovation targets.\\r\\n
    \\r\\nATB provides its services within:\\r\\n
      \\r\\n
    • Application oriented research projects supported by regional, national, European and other international funding schemes
    • \\r\\n
    • Direct research projects with clients
    • \\r\\n
    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1451-web.png"},"website":"https://www.atb-bremen.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1453,"name":"University of Oslo, Dept of Informatics","member_since":"2020-07-07","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1458,"name":"Beijing Tongtech Co., Ltd","member_since":"2020-07-21","renewal_date":"2026-08-01","description":{"long":"Beijing Tongtech Co., Ltd (Tongtech) is an industry leading infrastructure software and IT solutions provider. With its state of the art technology and products, Tongtech provides its customers with a complete family of application infrastructure products ranging from middleware, information security solutions to intelligent transportation system (ITS) solutions. Over the years, Tongtechs products and solutions has helped its customers leverage the power of internet to upgrade their businesses in a safe and effective manner.\\r\\n\\r\\nTongtech has been named as one of the \\\"National Key Software Enterprises\\\" for 12 consecutive years, and was granted AAA credit ratings by the Ministry of Commerce as well as the State-owned Asset Supervision and Administration Commission of the State Council (SASAC). In the field of technology, Tongtech is the core member of the Java Community Process Program (JCP) and the National Information Technology Standardization Committee, and has participated in developing industry standards for JavaEE, SOA/middleware, IEC smart city and other international and domestic standards organizations. Our company is also a research center for Major National Science and Technology Programs and has won the \\\"National Science and Technology Progress Award\\\" granted by the State Council for our achievements and efforts.\\r\\n\\r\\nAs a pioneer in the middleware software industry, our software products and solutions are widely used in all kinds of industries in China, with more than 2,000 enterprise users spreading across industries such as finance, communication, government, energy, and transportation. Tongtech also enjoyed good partnership with 500 partners."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1458-web.png"},"website":"https://www.tongtech.com/sy.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1465,"name":"RIOS Lab","member_since":"2020-09-18","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1465-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1469,"name":"Atlanta Java Users Group, Inc","member_since":"2020-10-05","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1469-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1473,"name":"Circuitsutra Technologies Pvt Ltd","member_since":"2020-10-19","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1473-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1474,"name":"Apex.AI, Inc","member_since":"2020-10-19","renewal_date":"2026-11-01","description":{"long":"Apex.AI was founded in 2017 in Palo Alto to build robust, reliable, safe, secure, and certified software for autonomous mobility systems. \\r\\n
    \\r\\n\\r\\nCore products:\\r\\n
    \\r\\n1. Apex.Grace is a runtime software environment, which is built on ROS 2 (Robot Operating System) and provides a production-grade safety-certified realtime framework for developing safe and secure applications. \\r\\n
    \\r\\n2. Apex.Ida is a highly optimized communication middleware based on Eclipse iceoryx and Eclipse Cyclone DDS"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1474-web.png"},"website":"https://www.apex.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1476,"name":"Data In Motion Consulting GmbH","member_since":"2020-11-10","renewal_date":"2026-11-01","description":{"long":"

    Founded in 2010, in Jena (Thuringia, Germany), Data In Motion Consulting GmbH provides a strong consolidated experience in the fields of Modeling, Software Engineering, Architecture and Consulting.

    \\r\\n

    We assist our customers in the development of their projects, guiding them trough the whole process, while providing them with the required strategies and tools to be able to \\\"walk on their own\\\" in the future.

    \\r\\n

    Our skill set goes from the more technical expertise in model-driven software development and architecture, data analysis and independent R&D, to more managerial experience in project and product management, and moderation of the whole business process.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1476-web.png"},"website":"https://www.datainmotion.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1480,"name":"AICAS GmbH","member_since":"2020-11-30","renewal_date":"2027-01-01","description":{"long":"aicas embraces the mission to bring intelligence to devices and unlock realtime data. The international high-tech company creates embedded IoT and edge-to-cloud solutions.\n\nAcross the globe, aicas connects over 25 million devices and vehicles to the cloud, simplifying access and control of edge devices and their data. Large industrial companies and leading automotive manufacturers use aicas EdgeSuite and JamaicaVM to master their digital transformation and open up new business models.\n\nCreating, deploying and operating edge-to-cloud solutions: aicas makes it happen. \nFast. Simple. Reliable."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1480-web.png"},"website":"https://www.aicas.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"}],"is_active_member":true},{"organization_id":1481,"name":"Beijing Thunisoft Information Technology Co., Ltd","member_since":"2020-11-30","renewal_date":"2026-12-01","description":{"long":"Thunisoft adheres to the enterprise spirit of \\\"Self-discipline and Social Commitment\\\", adheres to the values of honesty and integrity, takes \\\"Continuous innovation,to serve for customers\\' success\\\" as its mission, focuses on software and information services, providing customers with a full range of solutions and services for their informatization business, and is your trusted expert in intelligent information services."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1481-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1482,"name":"Makewave AB","member_since":"2020-12-09","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1482-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"}],"is_active_member":true},{"organization_id":1485,"name":"Garden State Java User Group (GSJUG)","member_since":"2021-01-06","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1485-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Guest Member","level":"WGSAP","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1486,"name":"The Johns Hopkins University","member_since":"2021-01-11","renewal_date":"2026-11-01","description":{"long":"Founded in 1876 as the nation’s first research university, Johns Hopkins has been advancing knowledge and bringing discoveries to the world for nearly 150 years."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1486-web.png"},"website":"https://www.jhu.edu/about/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1487,"name":"Shandong Cvicse Middleware Co.,Ltd","member_since":"2021-01-11","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1487-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1488,"name":"SignalFire Telemetry ","member_since":"2021-01-18","renewal_date":"2027-01-01","description":{"long":"The SignalFire wireless platform is offered with 900Mhz or with LTE-M1 for flexibility and cost effectiveness. The architecture provides for long-range wireless networks designed for remote monitoring and control in challenging outdoor environments. The nodes are integrated with a variety of sensors to work with level, pressure, temperature and flow meters, as well as offering critical asset control of valves, pumps, fans, heaters and an array of other devices.\\r\\n\\r\\nThe SignalFire wireless system has been deployed in thousands of installations in oil & gas fields and pipelines, petrochemical processing plants, crop and irrigation monitoring systems, transportation monitoring systems, and municipal infrastructure monitoring and control systems, as well as a variety of other applications.\\r\\n\\r\\nOur nodes can provide both communications and power to your sensors, making your application truly wireless. A wide range of sensor types are compatible, including 4-20 mA, 1.5V, Modbus, Hart, Digital I/O and other analog and digital interfaces.\\r\\n\\r\\nTo find out more, contact SignalFire and tell us about your toughest monitoring and control challenge."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1488-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1489,"name":"Netherlands Organisation for applied scientific research TNO","member_since":"2021-01-21","renewal_date":"2027-02-01","description":{"long":"

    About TNO

    \\r\\n

    The Netherlands Organization for Applied Scientific Research (TNO) is an independent research organization. We connect people and knowledge to create innovations that boost the sustainable competitive strength of industry and well-being of society. Now and in the future. This is our mission and it is what drives us, the over 3.000 professionals at TNO, in our work every day. We work in collaboration with partners and focus on transitions or changes in nine social themes that we have identified together with our stakeholders.

    \\r\\n\\r\\n

    Information & Communication Technology: \\'Interpreting and accelerating digital transformation\\'

    \\r\\n

    TNOs Information & Communication Technology unit aims to assist its clients, partners and other TNO units through complex digital transformations by leveraging its know-how in ICT, policy and business models. In concrete terms, we work in three main areas: data-driven innovations, robust networks, and integrated computer systems. We operate in domains such as ICT, telecoms, defence & security, high-tech industry, the energy sector, mobility and logistics. \\r\\n

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1489-web.png"},"website":"https://www.tno.nl/en/focus-areas/information-communication-technology/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1491,"name":"CSEM SA","member_since":"2021-01-28","renewal_date":"2027-02-01","description":{"long":"We are a public-private, non-profit technology innovation center. Dedicated to transforming brilliant ideas into industrial reality. With the support of the Swiss Federal government our mission is to secure our nation’s status as a global tech and innovation leader."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1491-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1492,"name":"The University of Sheffield","member_since":"2021-02-02","renewal_date":"2027-02-01","description":{"long":"The University of Sheffield Advanced Manufacturing Research Centre (AMRC) is a network of world-leading research and innovation centres working with manufacturing companies of any size from around the globe.\\r\\n\\r\\nWe specialise in carrying out world-leading research into advanced machining, manufacturing and materials, which is of practical use to industry.\\r\\nWe transform industrial and economic performance by making step changes in productivity, increasing competitiveness, developing new products and processes and training new talent and skills.\\r\\n\\r\\nOur 125-plus industrial partners range from global giants like Boeing, Rolls-Royce, BAE Systems and Airbus to small companies. Businesses can work with us on a one-off project, or join us as a member for long-term collaboration.\\r\\nOur operations have grown significantly since we were founded in 2001 and in 2003 we became the anchor tenant on the Advanced Manufacturing Park at Catcliffe, South Yorkshire.\\r\\n\\r\\nThe AMRC now employs over 500 highly qualified researchers and engineers from around the globe, on the Advanced Manufacturing Park and Sheffield Business Park in South Yorkshire, as well as in Broughton and Preston."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1492-web.png"},"website":"https://www.amrc.co.uk","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1494,"name":"Adobe","member_since":"2021-02-05","renewal_date":"2027-02-01","description":{"long":"Adobe"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1494-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Participant Member","level":"WGAPS","working_group":"osgi"}],"is_active_member":true},{"organization_id":1501,"name":"Opto 22","member_since":"2021-04-08","renewal_date":"2027-01-01","description":{"long":"For over 45 years, OEMs, machine builders, system integrators, and IT and operations personnel have looked to us for reliable products that deliver cutting-edge innovation at an affordable price.\\r\\n\\r\\nToday, we design and manufacture industrial control and IIoT products, like groov EPIC and groov RIO, that bridge the gap between IT and OT, following a core philosophy of open, standards-based technology.\\r\\n\\r\\nOpto 22 products are deployed worldwide in industrial automation, process control, building automation, industrial refrigeration, remote monitoring, and data acquisition applications through our global network of distributors and system integrators.\\r\\n\\r\\nOpto 22\\'s groov family of industrial edge controllers and I/O is designed from the ground up with integrated control, connectivity, and security tools to help you connect automation, enterprise, and cloud data.\\r\\n\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1501-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1503,"name":"Flow Software, Inc.","member_since":"2021-04-22","renewal_date":"2027-05-01","description":{"long":"The Flow Information Platform simplifies the creation and sharing of operational and strategic decision support information across your organization.\\r\\n\\r\\nCombine and transform data from multiple sources into a single namespace representing your \\\"single version of the truth\\\". Share this truth with people via configurable dashboards or with systems via configurable integrations.\\r\\n\\r\\nFlow is an \\\"ETL for OT\\\", a \\\"DataOps\\\" platform, that ingests and transforms complex data into KPIs, making it accessible when it is needed the most. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1503-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1504,"name":"Interuniversitair Micro-Electronica Centrum vzm (IMEC)","member_since":"2021-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1504-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"68db2919ffe553250ae8","description":"Guest Member","level":"WGSAP","working_group":"osgi"},{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1505,"name":"The Apache Software Foundation","member_since":"2021-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1505-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1506,"name":"Beijing Baolande Software Corporation","member_since":"2021-05-14","renewal_date":"2027-05-01","description":{"long":"Beijing Baolande Software Corporation founded in 2008, is a high-tech software enterprise focusing on basic software development and promotion."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1506-web.png"},"website":"https://www.bessystem.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1512,"name":"Fondazione LINKS","member_since":"2021-07-20","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1512-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1513,"name":"Trialog ","member_since":"2021-08-10","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1513-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1515,"name":"NOI Techpark","member_since":"2021-08-26","renewal_date":"2026-09-01","description":{"long":"We are NOI. South Tyrol's innovation district.\nInnovation, research, development. 1.000+ entrepreneurs, researchers, start-ups and students are working at NOI for an ecological and economic conversion of society. At NOI, research is practice-oriented. The needs of companies give rise to scientific work. \nAt NOI, we focus on four technology fields: Green, Food, Digital, Automotive & Automation. We are rooted in South Tyrol and in South Tyrolean society. At the same time, we work with an international slant. \nFor R&D projects we offer services and knowhow through our dataspaces platform Open Data Hub https://opendatahub.com and the Free Software Lab https://freesoftwarelab.noi.bz.it "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1515-web.png"},"website":"https://noi.bz.it/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Supporter Member","level":"WGSM","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Silver Member","level":"WGHLP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1519,"name":"European Space Agency","member_since":"2021-09-20","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1519-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[],"is_active_member":true},{"organization_id":1520,"name":"Volkswagen Aktiengesellschaft","member_since":"2021-10-04","renewal_date":"2026-06-01","description":{"long":"The Volkswagen Group comprises ten brands from five European countries: Volkswagen, Volkswagen Commercial Vehicles, ŠKODA, SEAT, CUPRA, Audi, Lamborghini, Bentley, Porsche and Ducati. On our way to becoming a sustainable mobility provider with a role model function in the areas of environment, safety and integrity, Volkswagen Group Innovation rely on a cross-brand and efficient research network. This network connects experts, enables partnership-based cooperation at eye level, creates an innovative working environment and bundles activities in order to increase synergies and efficiencies across the Volkswagen group"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1520-web.png"},"website":"https://www.volkswagen.de/de.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"}],"is_active_member":true},{"organization_id":1521,"name":"Industrial Digital Twin Association","member_since":"2021-10-06","renewal_date":"2026-10-01","description":{"long":"The IDTA is the first point of contact for the standardised Digital Twin and offers all industrial organisations a platform for participation. The aim is to establish the Digital Twin for components, machines, plants and entire factories as an open source technology and to develop it further together with industry.\nThe core technology for the implementation is the Asset Administration Shell (AAS), that enables quick and easy access to data over the entire life cycle thanks to standardised software structure, interfaces and semantics using current security mechanisms. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1521-web.png"},"website":"https://industrialdigitaltwin.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1524,"name":"University of Saskatchewan","member_since":"2021-10-15","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1524-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1525,"name":"University of California, Santa Barbara","member_since":"2021-10-15","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1530,"name":"Institute of Software Chinese Academy of Sciences","member_since":"2021-10-15","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1530-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1532,"name":"Asiainfo Technologies limited","member_since":"2024-04-15","renewal_date":"2026-11-01","description":{"long":"Started in 1993, AsiaInfo Technologies Limited is a leading provider of information technology products and services and a pioneering provider of full-stack digital intelligence capabilities. AsiaInfo provides end-to-end and full-link digital intelligence services for hundreds of industries based on its full-stack digital intelligence capabilities such as consulting and planning, product R&D, product delivery, system integration, data operation, intelligent decision-making, customer services. \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1532-web.png"},"website":"https://www.asiainfo.com/en_us/index.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1540,"name":"Amadeus S.A.S.","member_since":"2021-11-23","renewal_date":"2026-11-01","description":{"long":"Travel powers progress. Amadeus powers travel. Amadeus solutions connect travelers to the journeys they want through travel agents, search engines, tour operators, airlines, airports, hotels, cars and railways.\\r\\nWe have developed our technology in partnership with the travel industry for over 30 years. We combine a deep understanding of how people travel with the ability to design and deliver the most complex, trusted, critical systems our customers need. In 2019, we helped connect over 1.9 billion people to local travel providers in over 190 countries. We help connect over 1.6 billion people a year to local travel providers in over 190 countries.\\r\\n

    We are one company, with a global mindset and a local presence wherever our customers need us.

    \\r\\n

    Our purpose is to shape the future of travel. We are passionate in our pursuit of better technology that makes better journeys.

    \\r\\nAmadeus is an IBEX 35 company, listed on the Spanish Stock Exchange under AMS.MC. The company has also been recognized by the Dow Jones Sustainability Index for the last ten years.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1540-web.png"},"website":"https://amadeus.com/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1541,"name":"Scheidt & Bachmann System Technik GmbH","member_since":"2021-11-29","renewal_date":"2026-12-01","description":{"long":"

    System manufacturer for software and hardware systems for control and safety technology for the railway domain. Innovative solutions for control and administration of rail-bound traffic.

    \\r\\n

    The developers at the site in Kiel-Melsdorf complement the SIL 4 signalling-department of Mönchengladbach, Germany, with the ZSB2000 interlocking system and the BUES2000 level-crossing. This especially includes complex traffic-control-systems for large international inter-city-railways and metro-customers (on basis of the control centers of the DB Netz AG, the product Travis and the train detection system ZNP801D), an operation and interlocking simulation (\\\"Betriebs- und Stellwerkssimulation\\\", BEST), next to a modern tooling ecosystem for supporting planning, configuration, development and quality assurance.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1541-web.png"},"website":"https://www.scheidt-bachmann.de/de/signalling-systems/home","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1542,"name":"Nokia","member_since":"2021-11-29","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1542-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"}],"is_active_member":true},{"organization_id":1543,"name":"AURA","member_since":"2021-12-16","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1544,"name":"Data Intelligence Offensive (DIO)","member_since":"2021-12-21","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1545,"name":"Frontgrade Gaisler","member_since":"2021-12-21","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1545-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1547,"name":"Array","member_since":"2022-01-05","renewal_date":"2027-01-01","description":{"long":"Array is a law firm dedicated to IT matters, with a specific focus on Free and Open Source Software and other field of open technology, data, science and society. Founded by Carlo Piana, a renown lawyer and advocate in the FOSS space since early 2000's, it includes high-quality experts in the field and mentioned by the Who's Who Legal for IT in Italy. The members of Array have a deep knowledge of the legal and technical aspects of the IT world. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1547-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Guest Member","level":"WGSAP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1550,"name":"Accenture GmbH","member_since":"2022-02-04","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1550-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1551,"name":"Capgemini","member_since":"2022-02-15","renewal_date":"2027-02-01","description":{"long":"Capgemini is a global leader in partnering with companies to transform and manage their business by harnessing the power of technology. The Group is guided everyday by its purpose of unleashing human energy through technology for an inclusive and sustainable future. It is a responsible and diverse organization of over 325,000 team members more than 50 countries. With its deep industry expertise, Capgemini is trusted by its clients to address the entire breadth of their business needs, from strategy and design to operations, fueled by the innovative world of cloud, data, AI, connectivity, software, digital engineering and platforms. The Group reported in 2021 global revenues of €18 billion."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1551-web.jpg"},"website":"https://www.capgemini.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1553,"name":"ZF Friedrichshafen AG","member_since":"2022-02-25","renewal_date":"2027-03-01","description":{"long":" ZF is a global technology company supplying systems for passenger cars, commercial vehicles and industrial technology, enabling the next generation of mobility. ZF allows vehicles to see, think and act. In the four technology domains of Vehicle Motion Control, Integrated Safety, Automated Driving, and Electric Mobility, ZF offers comprehensive product and software solutions for established vehicle manufacturers and newly emerging transport and mobility service providers. ZF electrifies a wide range of vehicle types. With its products, the company contributes to reducing emissions, protecting the climate and enhancing safe mobility."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1553-web.png"},"website":"https://www.zf.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1554,"name":"AUMOVIO Germany GmbH","member_since":"2022-02-28","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1554-web.png"},"website":"https://www.aumovio.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1555,"name":"Reycom AG, a Swiss corporation","member_since":"2022-02-28","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1555-web.png"},"website":"https://www.reycom.swiss/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1559,"name":"ZettaScale Technology SARL","member_since":"2022-03-03","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1559-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1561,"name":"ESOP- Empresas SW OS Portuguesas","member_since":"2022-03-25","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1566,"name":"Sustainable Digital Infrastructure Alliance","member_since":"2022-05-11","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1568,"name":"ETAS GmbH","member_since":"2022-05-25","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1568-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1570,"name":"CARIAD SE","member_since":"2022-05-31","renewal_date":"2026-06-01","description":{"long":"CARIAD is an automotive software company in the Volkswagen Group that develops a leading tech stack for the automotive industry with the mission to make the automotive experience safer, more sustainable and more comfortable in a new way – for everyone, everywhere. \nCARIAD builds a uniform software platform for all brands of Volkswagen Group, which includes a unified and scalable architecture, an operating system and automotive cloud. CARIAD’s Headquarter is located in Germany, and co-operates with international Volkswagen Group teams in the US and China. \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1570-web.png"},"website":"https://cariad.technology/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1571,"name":"Omnifish OU","member_since":"2022-06-24","renewal_date":"2026-07-01","description":{"long":"At OmniFish, we specialize in providing professional services for Jakarta EE technologies. Our seasoned team of experts excels in Java application development and Java middleware production support. As dedicated contributors to the Eclipse GlassFish project and active members of the Jakarta EE Working Group, we are committed to modernizing the GlassFish server and contributing to Jakarta EE specifications. Customer success is our top priority. We work closely with our clients and partners to help them craft exceptional applications and services, ensuring our customers a safe journey filled with joy. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1571-web.png"},"website":"https://omnifish.ee","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1572,"name":"Elektrobit Automotive GmbH","member_since":"2022-07-05","renewal_date":"2026-07-01","description":{"long":"Elektrobit is an award-winning and visionary global vendor of embedded and connected software products and services for the automotive industry. A leader in automotive software with over 35 years serving the industry, Elektrobit's software powers over five billion devices in more than 600 million vehicles and offers flexible, innovative solutions for car infrastructure software, connectivity & security, automated driving and related tools, and user experience. Elektrobit is a wholly-owned, independently-operated subsidiary of Continental."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1572-web.png"},"website":"https://www.elektrobit.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1575,"name":"Dipartimento di Elettronica, Informazione e Bioingegneria - Politecnico di Milano","member_since":"2022-07-28","renewal_date":"2026-08-01","description":{"long":"The Dipartimento di Elettronica, Informazione e Bioingengeria of the Politecnico di Milano is one of the largest European ICT departments. With nearly 1000 members, researchers, collaborators, PhD students, and technical and administrative staff, the Department is a vital institution capable of promoting education, fundamental and applied research, and technology transfer to companies. The six department sections bring together consolidated competencies in systems and control, computer science and engineering, electronics, telecommunications, bioengineering, and electrical engineering."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1575-web.png"},"website":"https://www.deib.polimi.it/ita/home","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Guest Member","level":"WGSAP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1579,"name":"Shenzhen Ping An Communication Technology Co.,Ltd","member_since":"2022-08-11","renewal_date":"2026-08-01","description":{"long":"We are a technology solution expert of Ping An group\n\nPractice the corporate mission of \"science and technology enable finance and science and technology drive ecology\"\n\nEmpowering the group's financial services, medical and health services, automobile services, and smart city ecosystem construction\n\nCommitted to becoming an international leading technology company"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1579-web.png"},"website":"https://tech.pingan.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1580,"name":"Bloomberg L.P.","member_since":"2022-08-23","renewal_date":"2026-09-01","description":{"long":"Bloomberg is a global leader in business and financial information, delivering trusted data, news, and insights that bring transparency, efficiency, and fairness to markets. The company helps connect influential communities across the global financial ecosystem via reliable technology solutions that enable our customers to make more informed decisions and foster better collaboration. Our 7,000+ engineers, developers, data scientists and technologists are the ones who make this happen, creating and advancing solutions and systems that solve complex, real-world problems for customers across the global capital markets."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1580-web.png"},"website":"https://www.TechAtBloomberg.com/opensource","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"}],"is_active_member":true},{"organization_id":1582,"name":"FUJIFILM Italia S.p.A","member_since":"2022-09-02","renewal_date":"2026-09-01","description":{"long":"FUJIFILM Italia - Medical Informatics Research & Development Unit\nMain activities of the Unit are Technological Research in the IT field, Design and Development of Software Products and Applications, Consulting on Digital Solutions for the Healthcare."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1582-web.png"},"website":"https://www.fujifilm.com/it/en/about/us/offices/fujifilm-italia-unita-operativa-locale-di-bolzano","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1584,"name":"Harvey Mudd College","member_since":"2022-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1584-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1587,"name":"Oklahoma State University","member_since":"2022-09-13","renewal_date":"2026-09-01","description":{"long":"Oklahoma State University is a public land-grant research university in Stillwater, Oklahoma, United States. The university was established in 1890 under the legislation of the Morrill Act."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1587-web.png"},"website":"https://go.okstate.edu/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1588,"name":"PlanV GmbH","member_since":"2022-09-16","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1588-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1589,"name":"T-Systems International GmbH","member_since":"2022-09-20","renewal_date":"2026-09-01","description":{"long":"With locations in more than 20 countries and over 27,000 employees (December 31, 2022), as well as annual revenues of around EUR 4.0 billion (2022), T-Systems is one of the leading providers of digital services in Europe. The Deutsche Telekom subsidiary is headquartered in Germany and has a presence in Europe as well as in selected core markets and strategic production locations. T-Systems offers integrated end-to-end IT solutions, driving the digital transformation of companies in all industries and the public sector. T-Systems’ focus industries are automotive, the public sector, healthcare and transport. For these areas, T-Systems develops industry-specific solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1589-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1591,"name":"Universidad de Cantabria","member_since":"2022-09-23","renewal_date":"2026-08-01","description":{"long":"

    The University of Cantabria (UC) offers official university study courses in the self-governed region of Cantabria (Spain).

    \n\n

    The Software Engineering and Real-Time Group (Ingeniería del Software y Tiempo Real, ISTR) has kept a continuous research activity in the theory and application of Software Engineering to Distributed Embedded Real-Time Systems, Model-Driven Engineering, Databases and Business Intelligence, and Security in Information Systems. The group also actively participates in the development of standards: Real-time POSIX operating systems, the UML-MARTE profile of OMG, and the standardization process of the Ada language.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1591-web.jpg"},"website":"https://web.unican.es/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1592,"name":"Google LLC","member_since":"2022-10-12","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1592-web.png"},"website":"","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1594,"name":"Quantyss","member_since":"2022-10-18","renewal_date":"2026-10-01","description":{"long":"QUANTYSS is a startup company created to share senior expertise to innovative entrepreneurs of SMEs, startups and midcaps, in the field of technology. We provide specialized insight and relevant industry expertise to help them take their business further.\nWe are actively driving, together with Eclipse members, the Edge Computing Working Group of the French Embedded France Association. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1594-web.png"},"website":"https://quantyss.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1595,"name":"Rivos Inc","member_since":"2022-10-18","renewal_date":"2026-10-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1595-web.png"},"website":"https://www.rivosinc.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"}],"is_active_member":true},{"organization_id":1597,"name":"Kentyou","member_since":"2022-10-25","renewal_date":"2026-11-01","description":{"long":"Kentyou is an innovative startup company helping cities in their digital transformation to face their environmental social and economic challenges more efficiently. By leveraging the open source Eclipse sensiNact platform, it provides a data hub that collects data from various data sources including IoT, mobile apps and open data portals, unifies and analyses that data to extract actionable information. Kentyou also provides a visualisation and impact monitoring tool to help cities making data-driven decisions with desirable effects with the help of emerging AI technologies. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1597-web.jpg"},"website":"https://kentyou.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Participant Member","level":"WGAPS","working_group":"osgi"}],"is_active_member":true},{"organization_id":1599,"name":"SOTEC GmbH+Co KG","member_since":"2022-11-02","renewal_date":"2026-11-01","description":{"long":"SOTEC is an internationally active provider of software development and hardware solutions for the retail, automotive, industrial automation, manufacturing, and energy industries. SOTEC has been supporting its customers with advanced technology and development services for over 40 years. Services range from specialized hardware and embedded systems development to cloud architectures and solution implementations.\nAs a specialist for IoT (IIoT), Machine Learning, Industrie 4.0 and Cloud technologies, SOTEC supports customers in building digital platforms and thus in the digital transformation of their companies."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1599-web.png"},"website":"https://www.sotec.eu/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1600,"name":"Open Elements GmbH","member_since":"2022-11-08","renewal_date":"2026-12-01","description":{"long":"Open Elements is an IT company whose main focus is on the two points of Open Source Software (OSS) and Java. By focusing on these two points, we can provide our customers with expert advice and support in the development and use of Open Source Software. By specializing in Java-based OSS, we are members of the leading committees and foundations on these topics and actively contribute to the further development of critical open source systems in the Java ecosystem."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1600-web.png"},"website":"https://open-elements.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Participant Member","level":"WGAPS","working_group":"adoptium"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1604,"name":"Stellenbosch University","member_since":"2022-12-01","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1605,"name":"Micro Stream Software GmbH","member_since":"2022-12-16","renewal_date":"2026-12-01","description":{"long":"MicroStream connects Java seamlessly with the cloud. To do this, we create new innovations in Java, the JVM ecosystem, Android, data storage, and the cloud and work on standards together with other vendors and the strong open-source community. \n\nOur business is to support companies and organizations that use open source for their mission-critical projects commercially with enterprise add-ons, extended testing, custom-builds, first-class enterprise-grade support, and manpower."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1605-web.png"},"website":"https://microstream.one/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1606,"name":"Schaeffler","member_since":"2022-12-20","renewal_date":"2027-05-01","description":{"long":"The Schaeffler Group has been driving forward groundbreaking inventions and developments in the field of motion technology for over 75 years. With innovative technologies, products, and services for electric mobility, CO2-efficient drives, chassis solutions and renewable energies, the company is a reliable partner for making motion more efficient, intelligent, and sustainable – over the entire life cycle. We pioneer motion."},"logos":{"print":"https://membership.eclipse.org/organization/images/1606-print.eps","web":"https://membership.eclipse.org/organization/images/1606-web.png"},"website":"https://www.schaeffler.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1607,"name":"Valeo","member_since":"2022-12-20","renewal_date":"2027-01-01","description":{"long":"https://www.valeo.com/en/"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1607-web.png"},"website":"https://www.valeo.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1608,"name":"Cummins Inc","member_since":"2023-01-05","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1608-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1609,"name":"N3uron Connectivity Systems","member_since":"2023-01-10","renewal_date":"2027-01-01","description":{"long":"N3uron software is an Industrial Edge Platform for IIoT and DataOps that streamlines the flow of data between industrial systems and business applications, either on-premise or in the cloud. N3uron provides an out-of-the-box solution for data standardization, normalization and contextualization, seamless integration with industrial and IT systems, efficient information management, and unparalleled scalability and security. The N3uron platform makes it easier for operations teams to aggregate, manage and analyze industrial data, resulting in enhanced productivity and informed decision-making."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1609-web.png"},"website":"https://n3uron.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1611,"name":"NOUVELLE-AQUITAINE OPEN SOURCE","member_since":"2023-01-16","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1612,"name":"IAV ","member_since":"2023-01-18","renewal_date":"2027-02-01","description":{"long":"As one of the globally leading engineering partners, IAV develops the mobility of the future. Regardless of the specific manufacturer, our engineering proves itself in vehicles and technologies all over the world.\n\nWith more than 35 years of experience and an unsurpassed range of expertise, we combine the best of many different worlds: automotive and IT, hardware and software, products and services. With our workforce of more than 7,600 employees and first-class technical resources, we help our customers to implement their projects, from the concept right through to SOP. Our goal: better mobility.\n\nIAV offers outstanding engineering expertise and combines the best of many different worlds.\n\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1612-web.png"},"website":"https://www.iav.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1613,"name":"10xEngineers","member_since":"2023-01-24","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1613-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1614,"name":"SCANOSS","member_since":"2023-01-26","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1614-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1616,"name":"Start North ry","member_since":"2023-02-02","renewal_date":"2027-02-01","description":{"long":"Start North accelerates the learning and implementation of the latest technology in order to improve the productivity of companies and promote the world's sustainable development. Together with its university and business partners, Start North plans and implements programs and projects and implements 5G Mokki Tech Space learning, innovation, remote work and service environments for university campuses and wherever know-how, work and services are needed."},"logos":{"print":null,"web":null},"website":"https://www.startnorth.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1619,"name":"Gaia-x European Association for Data and Cloud.","member_since":"2023-02-27","renewal_date":"2027-03-01","description":{"long":"The Gaia-X European Association for Data and Cloud AISBL\nInnovation through digital sovereignty – that’s the goal of Gaia-X. We achieve this by establishing an ecosystem in which data is made available, collated and shared in a trustworthy environment. The users always retain sovereignty over their data. So, what emerges is not a cloud but a federated system that links many cloud services providers and users together."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1619-web.png"},"website":"https://gaia-x.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1620,"name":"Beijing Institute of Open Source Chip","member_since":"2023-03-16","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1620-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1621,"name":"LG Electronics, Inc","member_since":"2023-03-21","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1621-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1625,"name":"Open Forum Europe AISBL","member_since":"2023-04-13","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1625-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1629,"name":"Posit Software, PBC","member_since":"2023-05-04","renewal_date":"2027-05-01","description":{"long":"Posit helps people understand and improve the world through data. We build tools that enable robust and reproducible data analysis through a code-first approach, paired with tools that make it easy to share insights. Our core software is open source, freely available to anyone. Our professional software equips individuals and teams to develop and share their work at scale."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1629-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1630,"name":"Reutlingen University","member_since":"2023-05-10","renewal_date":"2027-05-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1630-web.png"},"website":"https://www.reutlingen-university.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1631,"name":"Litmus Automation Inc.","member_since":"2023-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1631-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1632,"name":"Qualcomm Innovation Center","member_since":"2023-05-24","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1632-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1633,"name":"KU Leuven","member_since":"2023-06-12","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1633-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1634,"name":"Ferdinand-Steinbeis-Institut","member_since":"2023-06-14","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1634-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1635,"name":"Energy Telecommunications & Electrical Association","member_since":"2023-06-28","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1635-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1636,"name":"Politecnico di Torino","member_since":"2023-07-06","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1638,"name":"Integration Objects","member_since":"2023-10-02","renewal_date":"2026-10-01","description":{"long":"Integration Objects empowers businesses to accelerate their digital transformation through robust and reliable solutions. We offer a wide range of applications including, Industrial IoT (IIoT), cyber security, Big Data Analytics, C4ISR, and process automation for Defense and Governmental Institutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1638-web.png"},"website":"https://integrationobjects.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1640,"name":"GPS BY DESIGN CENTRE","member_since":"2023-10-12","renewal_date":"2026-10-01","description":{"long":"Our mission is to spread the word on how to operationalize Privacy by Design, especially given its inclusion in the new E.U. General Data Protection Regulation. "},"logos":{"print":null,"web":null},"website":"https://gpsbydesigncentre.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1641,"name":"International Data Spaces e. V","member_since":"2023-11-02","renewal_date":"2026-10-01","description":{"long":"The International Data Spaces Association (IDSA) is on a mission to create the future of the global, digital economy. Its 170+ member companies and institutions have created the International Data Spaces (IDS) standard: a secure system of sovereign and trusted data sharing in which all participants can realize the full value of their data. IDS enables new smart services and innovative business processes to work across companies and industries while ensuring that the control of data remains in the hands of data providers. We call this data sovereignty."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1641-web.jpg"},"website":"https://internationaldataspaces.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1642,"name":"PX5","member_since":"2023-11-03","renewal_date":"2026-11-01","description":{"long":"Expert Professional Support for THREADX RTOS and middleware!\n\nWith decades of THREADX domain experience, our team delivers professional, fully ticketed, and tracked support for individual projects through entire enterprises. Being the original authors, nobody knows the THREADX technology more than us. We are committed to taking care of you!\n\nhttps://rtosx.com\n\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1642-web.png"},"website":"https://rtosx.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1643,"name":"iSHARE Foundation","member_since":"2023-11-08","renewal_date":"2026-11-01","description":{"long":"Non-profit trust and participant governance framework for data exchange between organisations in data spaces. Bringing organisational and trust interoperability. \n\nTrust derived from Legal, Operational and Technical credentials and specifications. \n\nGoverned by the data spaces that build on iSHARE and licence the specifications and operational and legal documentation to govern data spaces. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1643-web.jpg"},"website":"https://ishare.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1645,"name":"Amazon Europe Core SARL","member_since":"2023-11-16","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1645-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1646,"name":"Cypherbridge Systems LLC","member_since":"2023-11-15","renewal_date":"2026-11-01","description":{"long":"Cypherbridge develops and deploys purpose-built IoT security software solutions to meet industry standards, regulation, and cybersecurity requirements throughout the product lifecycle.\n\t\nFrom concept to product, Cypherbridge delivers solutions for Eclipse ThreadX platforms, including secure boot, connectivity, security, and IoT Cloud Computing. We offer SDKPac for Eclipse ThreadX, porting and design services, and long term technical support for complete solution delivery and software lifecycle."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1646-web.jpg"},"website":"https://www.cypherbridge.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1648,"name":"co4e GmbH","member_since":"2024-01-01","renewal_date":"2027-01-01","description":{"long":"The Consultancy for Engineers (co4e) GmbH is a software tool vendor and consultancy service provider. It was founded in 2019 as a spin-off from the German Aerospace Center (DLR). The co4e GmbH head office located in the heart of Berlin (Kreuzberg), Germany.

    Established with a vision to address the complexities of transportation systems, we bring together a team of experts and enthusiasts who are passionate about creating sustainable, efficient, and intelligent mobility solutions. At the heart of our endeavors are SESAM, a cloud platform designed for mobility simulations, and ASSIST, a tool suite to automate the design of safety-critical systems."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1648-web.png"},"website":"https://www.co4e.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1649,"name":"Sonatype Inc.","member_since":"2023-12-07","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1649-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1651,"name":"Johannes Kepler University Linz","member_since":"2023-12-12","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1651-web.png"},"website":"https://www.jku.at","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1653,"name":"Nordic Institute for Interoperability Solutions","member_since":"2024-01-05","renewal_date":"2027-01-01","description":{"long":"Nordic Institute for Interoperability Solutions (NIIS) ensures the development and strategic management of digital government solutions that allow NIIS members to provide excellent digital public services.\n\nNIIS is both a network and cooperation platform and executioner of IT developments in members’ common interests. The institute focuses on practical collaboration, sharing of experience and promoting innovation. The operating model of the institute is something unique in the world.\n\nThe republics of Estonia, Finland and Iceland are members of NIIS, and the Faroe Islands and the Government of Åland are partners of NIIS."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1653-web.png"},"website":"https://www.niis.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1654,"name":"Harman International","member_since":"2024-01-08","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1654-web.jpg"},"website":"https://www.harman.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1655,"name":"The Matrix.org Foundation C.I.C.","member_since":"2024-01-19","renewal_date":"2027-02-01","description":{"long":"Matrix is an open protocol for decentralised, secure communications. The Matrix.org Foundation exists to act as a neutral custodian for Matrix and to nurture it as efficiently as possible as a single unfragmented standard, for the greater benefit of the whole ecosystem, not benefiting or privileging any single player or subset of players."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1655-web.png"},"website":"https://matrix.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1656,"name":"Catena-X Automotive Network e.V","member_since":"2024-02-06","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1656-web.png"},"website":"https://catena-x.net/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1659,"name":"Lunatech Labs B.V.","member_since":"2024-02-27","renewal_date":"2027-03-01","description":{"long":"Lunatech, established in 1993, is a distinguished software development consultancy renowned for its expertise in crafting tailored solutions to address intricate challenges. Specialising in the design, development, deployment, and ongoing operation of custom software, Lunatech excels in delivering comprehensive services.\n\nWith a team of experts proficient in Java and Scala, Lunatech excels in various domains including system integration, legacy transformation, and continuous maintenance. With three decades of experience under our belt, we have empowered our clients to streamline their IT operations and achieve their business objectives seamlessly."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1659-web.png"},"website":"https://www.lunatech.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1661,"name":"FEV.io GmbH","member_since":"2026-03-01","renewal_date":"2027-02-01","description":{"long":""},"logos":{"print":"https://membership.eclipse.org/organization/images/1661-print.eps","web":"https://membership.eclipse.org/organization/images/1661-web.png"},"website":"https://www.fev.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1663,"name":"Instituto Tecnológico de Informática","member_since":"2024-03-12","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1663-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1666,"name":"Stadt Jena","member_since":"2024-03-21","renewal_date":"2027-04-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1666-web.png"},"website":"https://www.jena.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1667,"name":"TOSIT Association","member_since":"2024-03-25","renewal_date":"2027-04-01","description":{"long":"TOSIT (The Open Source I Trust) is an association under the French Law of 1901 of major end-users, with the following aims:\n\n* Provide a forum for its members to meet and discuss Open Source solutions\n\n* Encourage the sharing of feedback and best practice in Open Source\n\n* Gather and identify the needs of its members in terms of Open Source solutions\n\n* Carry out strategic or technical studies and monitoring related to Open Source solutions\n\n* Promote Open Source solutions judged to be the most effective in various areas of interest\n\n* Carry out communication and publication initiatives related to Open Source \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1667-web.png"},"website":"https://tosit.fr","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1669,"name":"Ferrous Systems GmbH","member_since":"2024-04-08","renewal_date":"2027-05-01","description":{"long":"Ferrous Systems is worlds leading Rust company. From tooling, to support, to training. They are the first one to implement and certify a fully open source Rust compiler usable in safety, by ISO 26262 and IEC 61508.\n\nMembers of the company have been in Rust Foundation and Rust Project leadership for a long while."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1669-web.png"},"website":"https://ferrous-systems.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1670,"name":"Rust Foundation","member_since":"2024-04-11","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1670-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1672,"name":"DIN e.V.","member_since":"2024-04-30","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1673,"name":"Python Software Foundation","member_since":"2024-05-01","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1673-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1674,"name":"The PHP Foundation (Open Source Collective)","member_since":"2024-05-06","renewal_date":"2027-05-01","description":{"long":"We support, advance, and develop the PHP Language."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1674-web.png"},"website":"https://thephp.foundation","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1675,"name":"OpenSSL Software Foundation Inc","member_since":"2024-05-22","renewal_date":"2027-05-01","description":{"long":"The OpenSSL Foundation works to ensure that everyone, including nonprofits, academics, and independent developers, has access to fundamental data privacy and security tools that are the backbone of internet protection, quietly safeguarding millions of users. We do this to help build a safer internet — one that serves the public interest and upholds privacy and security as foundational rights."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1675-web.png"},"website":"https://openssl-foundation.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1676,"name":"OWASP Foundation, Inc.","member_since":"2024-05-26","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1676-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1677,"name":"THE COMETBID SOFTWARE FOUNDATION","member_since":"2024-05-30","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1678,"name":"XITASO GmbH","member_since":"2024-06-03","renewal_date":"2026-06-01","description":{"long":"As a digitization partner and expert for high-end software engineering, XITASO provides advice to B2B customers, identifies digitization potentials, optimizes business processes and create digital strategies and solutions. Based on an agile mindset, we design and develop individual solutions with outstanding expertise in the areas of Industry 4.0, Internet of Things (IoT), Robotics, Digital Twin, Data Science, Artificial Intelligence and Augmented Reality. XITASO serves customers throughout Germany from various industries, in particular from mechanical and plant engineering as well as the healthcare sector."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1678-web.png"},"website":"https://xitaso.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1679,"name":"Michelin","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"Michelin is building a world-leading manufacturer of life-changing composites and experiences.\n\nPioneering engineered materials for more than 130 years, Michelin is uniquely positioned to make decisive contributions to human progress and a more sustainable world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1679-web.png"},"website":"https://www.michelin.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1680,"name":"Stichting Blender Foundation","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1680-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1681,"name":"Clever Cloud SAS","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"Founded in 2010, Clever Cloud is a French company based in Nantes, specialising in IT automation. It creates and supplies the software building blocks needed to deploy applications on self-service PaaS architectures. Its customers include such big names as Airbus, Great Place to Work, MAIF, Cegid, Docaposte, Fairphone, Solocal and TBWA."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1681-web.png"},"website":"https://www.clever.cloud/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1682,"name":"CodeDay","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"There's a place in tech for everyone. CodeDay is a non-profit providing welcoming, hands-on opportunities for under-served students to explore a future in tech and beyond through opportunities to contribute to open-source software."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1682-web.png"},"website":"https://www.codeday.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Guest Member","level":"WGSAP","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1683,"name":"ZHAW, Institute of Mechatronic Systems (IMS)","member_since":"2024-06-13","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1684,"name":"The Document Foundation","member_since":"2024-06-13","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1684-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1685,"name":"Open Infrastructure Foundation","member_since":"2024-06-17","renewal_date":"2026-06-01","description":{"long":"The Open Infrastructure Foundation (previously known as the OpenStack Foundation) is a global non-profit organization providing a neutral, open environment for organizations, developers, and users to build open source infrastructure software together.\n\nStrong of more than 110,000 individual members representing 700+ organizations in 180+ countries, our Foundation is the home for several open source infrastructure projects, including OpenStack, Kata Containers and StarlingX."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1685-web.png"},"website":"https://openinfra.dev","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1686,"name":"Stichting NLnet Labs","member_since":"2024-06-19","renewal_date":"2026-06-01","description":{"long":"Founded in 1999, NLnet Labs is an independent, non-profit, public benefit foundation based in the Netherlands. Our mission is to make the core of the Internet a better, safer place by developing open-source software, through applied research and by promoting and contributing to open standards."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1686-web.png"},"website":"https://nlnetlabs.nl","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1688,"name":"FreeBSD Foundation","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":"The FreeBSD Foundation is a 501(c)(3) non-profit organization supporting the FreeBSD Project and community. Accepting donations from individuals and businesses, the Foundation uses funds to develop features, employ software engineers, improve build and test infrastructure, advocate for FreeBSD through in-person and online events, and provide training and educational material. Representing the FreeBSD Project in legal affairs, the Foundation is the recognized entity for contracts, licenses, and other legal arrangements and is entirely donation-supported. Learn more at freebsdfoundation.org"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1688-web.png"},"website":"https://www.freebsdfoundation.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1689,"name":"Yildiz Technical University","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":"Established in 1911, Yildiz Technical University (YTU) is one of Turkey's oldest and most prestigious technical universities. With around 35,000 students and over 1,500 academic staff, YTU offers interdisciplinary programs in engineering, natural sciences, social sciences, and arts. Our modern campus supports student-centered learning, enriched by student clubs and research facilities. Internationally recognized for research, YTU collaborates on various national and global projects, aiming to advance education, research, and innovation to tackle global challenges."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1689-web.png"},"website":"https://www.yildiz.edu.tr/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1690,"name":"useblocks GmbH","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1690-web.png"},"website":"https://useblocks.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1691,"name":"3DS Outscale","member_since":"2024-06-26","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1693,"name":"Qorix GmbH","member_since":"2024-07-08","renewal_date":"2026-07-01","description":{"long":"Qorix is a leading provider of middleware software and engineering services with a specialized focus on the\nautomotive industry. Our offerings are:\n1- Qorix Classic stack\n2- Qorix Adaptive stack\n3- Qorix Performance stack\n4- Qorix Developer: Designer & SDK\n5- Engineering Services: maintenance, support & customization."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1693-web.png"},"website":"https://www.qorix.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1695,"name":"L&T Technology Services Ltd","member_since":"2024-08-22","renewal_date":"2026-09-01","description":{"long":"L&T Technology Services Limited (LTTS) is a global leader in Engineering and R&D (ER&D) services. With 1,343 patents filed for 57 of the Global Top 100 ER&D spenders, LTTS lives and breathes engineering. Our innovations speak for themselves – World’s 1st Autonomous Welding Robot, Solar ‘Connectivity’ Drone, and the Smartest Campus in the World, to name a few.\nLTTS’ expertise in engineering design, product development, smart manufacturing, and digitalization touches every area of human lives. With 108 Innovation and R&D design centers globally, we specialize in disruptive technology spaces such as NexGen Comms, Artificial Intelligence, Digital Factory, and Autonomous Transport."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1695-web.jpg"},"website":"https://www.ltts.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1696,"name":"Allison Transmission, Inc.","member_since":"2024-08-22","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1696-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1697,"name":"ekxide IO GmbH","member_since":"2024-09-04","renewal_date":"2026-10-01","description":{"long":"ekxide is the innovative force behind iceoryx and iceoryx2. Founded by the core maintainers and creators of iceoryx, the company was established to propel the development and ensure the continued success of the open-source project. ekxide provides a range of services focused on iceoryx, including commercial extensions and tooling, accelerated development, safety certification, priority bug-fixing, and expert training and consulting. These services are designed to enhance the performance, reliability, and safety of iceoryx-based solutions. ekxide supports clients with tailored solutions to meet their specific needs in this area."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1697-web.png"},"website":"https://ekxide.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1698,"name":"Instituto de Telecomunicações","member_since":"2024-09-06","renewal_date":"2026-09-01","description":{"long":"Instituto de Telecomunicações (IT) is a private, not-for-profit organization, of public interest, a partnership of nine institutions with research and development in the field of Telecommunications.\n\nIT is actively involved in fundamental and applied research both at national and international levels. IT also plays its role towards public society with public awareness initiatives, knowledge transfer to industry, and by providing consulting services on a non-competing basis."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1698-web.png"},"website":"https://it.pt","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1699,"name":"I Machines, Inc","member_since":"2024-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1699-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1700,"name":"Ruby Central, Inc.","member_since":"2024-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1700-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1702,"name":"Ejad for Engineering Systems","member_since":"2024-09-13","renewal_date":"2026-09-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1702-web.jpg"},"website":"https://www.ejad.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1703,"name":"Software Heritage Foundation - Inria Foundation","member_since":"2024-09-20","renewal_date":"2026-10-01","description":{"long":"Software Heritage is a non-profit initiative dedicated to collecting, preserving, and sharing all publicly available source code for the long term. Launched by Inria, supported by UNESCO, Software Heritage operates as the largest archive of open-source software, hosting over 50 billion software artifacts. Its mission is to ensure that software, a vital part of our digital heritage, is safeguarded and accessible to future generations. By enabling traceability and fostering collaboration, Software Heritage serves as an invaluable resource for research, industry, and society at large."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1703-web.png"},"website":"https://softwareheritage.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1704,"name":"Open Source Initiative","member_since":"2024-09-23","renewal_date":"2026-10-01","description":{"long":"The OSI is the authority that defines Open Source, recognized globally by individuals, companies, and by public institutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1704-web.jpg"},"website":"https://opensource.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1705,"name":"Ostfalia University","member_since":"2024-10-15","renewal_date":"2026-10-01","description":{"long":"The Faculty of Computer Science has existed for 30 years and has grown continuously with 24 professors and over 1000 students. Our range of courses includes courses that require typical on-campus study as well as courses that are offered in a purely online format. At the Faculty of Computer Science one can study five Bachelor programs and two Master degree programs. The online format offers two Bachelor and two Master degree programs."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1705-web.png"},"website":"https://www.ostfalia.de/cms/de/i/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Guest Member","level":"WGSAP","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1707,"name":"Tekniker","member_since":"2024-10-24","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1708,"name":"Navigation Data Standard (NDS) e.V.","member_since":"2024-10-24","renewal_date":"2026-11-01","description":{"long":"The NDS Association provides the global standard for map data within automotive ecosystems. Its members include car manufacturers, application developers, compiler developers, as well as map and service providers.\n\nThe NDS.Live standard enables the transmission of dynamic, cloud-connected data. It addresses the increasing size of map data by ensuring that only necessary updates are transmitted over data connections. NDS.Live has a highly modular architecture and supports various types of data, making it adaptable for a range of automotive applications."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1708-web.png"},"website":"https://nds-association.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1709,"name":"Acatech - Deutsche Akademie der Technikwissenschaften e.V.","member_since":"2024-10-31","renewal_date":"2026-11-01","description":{"long":""},"logos":{"print":null,"web":null},"website":"https://www.acatech.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1710,"name":"AboutCode Europe ASBL","member_since":"2024-11-05","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1710-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1711,"name":"KPIT Technologies Ltd","member_since":"2024-11-08","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1711-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1713,"name":"Cyberismo","member_since":"2024-11-25","renewal_date":"2026-12-01","description":{"long":"Cyberismo is a cybersecurity solution company dedicated to fortifying the digital landscape. We base our approach on the open-source Cyberismo solution, open collaboration, cybersecurity consulting, and the courage to focus on delivering impactful results. We simplify and optimise cybersecurity management while aiding teams in integrating cybersecurity into their daily operations."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1713-web.png"},"website":"https://cyberismo.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1714,"name":"OpenNebula Systems SL","member_since":"2024-12-03","renewal_date":"2027-01-01","description":{"long":"First released in Spain in 2008 as the outcome of a research project, OpenNebula has evolved into the main European open source cloud & edge management platform. As a Virtualized Infrastructure Manager (VIM) and IaaS solution, it unifies support for virtual machines, containers, and Kubernetes clusters, while providing federation, multi-tenancy, and automated provisioning across datacenter, cloud, and edge environments."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1714-web.png"},"website":"https://opennebula.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1716,"name":"Tauri","member_since":"2024-12-17","renewal_date":"2027-01-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1719,"name":"Double Open","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":"Double Open combines specialized compliance knowledge with the transparency of the industry's leading open toolset."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1719-web.png"},"website":"https://www.doubleopen.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1720,"name":"Welotec GmbH","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":"Founded in 1969 with headquarters in Germany, Welotec boasts a strong team with a deep understanding of the needs of machine builders. We specialize in Edge Computing, Cloud Integration, and are committed to Open Source solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1720-web.png"},"website":"https://www.welotec.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1721,"name":"GEA Group AG","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1721-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1722,"name":"Codethink Ltd.","member_since":"2025-01-02","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1722-web.png"},"website":"","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1723,"name":"Vates","member_since":"2024-12-19","renewal_date":"2027-01-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1724,"name":"Erlang Ecosystem Foundation","member_since":"2025-01-06","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1724-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1726,"name":"Overnet Solutions S.r.l","member_since":"2025-01-24","renewal_date":"2027-02-01","description":{"long":"With over 30 years of experience in ICT training, Overnet is a leader in Italy’s ICT education sector. We offer the broadest range of official IT training and continuously update our programs to address all aspects of digital transformation. Companies and professionals looking to excel in the tech evolution trust us to develop their digital skills.\n\nOvernet is your fast track to Open Source Cloud Adoption. Our solutions enable your team to seamlessly adopt open source technologies across existing and new cloud providers, embracing hybrid and portable cloud workloads."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1726-web.png"},"website":"https://overnet.education/open-source-cloud-adoption","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1728,"name":"Associação 101010","member_since":"2025-01-30","renewal_date":"2027-02-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1729,"name":"Transcality AG","member_since":"2025-02-06","renewal_date":"2027-02-01","description":{"long":"We build a digital replica of traffic to evaluate the present and plan the future."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1729-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1736,"name":"Cofinity-X GmbH","member_since":"2025-02-18","renewal_date":"2027-03-01","description":{"long":"Cofinity-X is a joint venture established by several major companies, including BMW, Mercedes-Benz, SAP, BASF and ZF, to create a secure and efficient data exchange network in the automotive industry. This initiative aims to address the growing need for seamless and secure data sharing among automotive manufacturers, suppliers and other stakeholders. Cofinity-X represents a significant step forward in addressing the complexities and challenges of data management in the modern industry. Its collaborative approach and use of cutting-edge technology position it as a key player in the future of data exchange."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1736-web.png"},"website":"https://www.cofinity-x.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1737,"name":"Hyundai Mobis","member_since":"2025-02-20","renewal_date":"2027-03-01","description":{"long":"As a global auto parts vendor, we focus on autonomous driving, connectivity and electrification to be a leader in the era of smart mobility. Based on three modular auto components (i.e. chassis, cockpit and front-end), we work to make driving safer and easier and also offer service parts that can best serve the purpose.\n\nOur vision is to be a provider of differentiated mobility solutions that combine software and hardware in the upcoming mobility industry. To make this vision a reality, we have expanded our business areas to include smart mobility, UAM and robotics based on our R&D capability and production capacity."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1737-web.png"},"website":"https://www.mobis.com/en/index.do","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1738,"name":"Ant Blockchain Technology (Shanghai) Co., Ltd","member_since":"2025-02-26","renewal_date":"2027-03-01","description":{"long":"Ant Digital Technology is an independent section of Ant Group's technology commercialization, which began independent operations in April 2024. Ant Digital Technology started with Ant Chain and has the world's largest number of leading technologies and patents in the blockchain field. In addition, it has continuously developed multiple commercial product brands, including ZOLOZ, mPaaS, SofaStack, Ant Shield, and Ant Tianjian.As of now, Ant Digital Technology has collaborated with over 300 partners to serve more than 10,000 enterprise customers."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1738-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1740,"name":"Universidad Politécnica de Madrid","member_since":"2025-02-27","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1740-web.png"},"website":"https://upm.es","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1741,"name":"Drupal Association","member_since":"2025-02-27","renewal_date":"2027-03-01","description":{"long":"The Drupal Association is the non-profit organization focused on accelerating Drupal, fostering the growth of the Drupal community, and supporting the project’s vision to create a safe, secure, and open web for everyone. The Drupal Association also administers Drupal.org on behalf of the Drupal community."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1741-web.png"},"website":"https://www.drupal.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1742,"name":"Capabilities Limited","member_since":"2025-03-05","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1742-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1744,"name":"Debian France","member_since":"2025-03-20","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1745,"name":"APELL ASBL","member_since":"2025-04-03","renewal_date":"2027-04-01","description":{"long":"APELL – The European Open Source Software Business Association is the umbrella organisation for national Open Source business associations in Europe. Founded in 2020, it aims to increase opportunities for the members of the Association’s member organisations, and to raise awareness for the strategic importance of Open Source for Europe. APELL promotes a sovereign, in­clu­sive, ethical digital market."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1745-web.png"},"website":"https://apell.info/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1746,"name":"the School of ECE of NTUA","member_since":"2025-04-09","renewal_date":"2027-04-01","description":{"long":"School of Electrical and Computer Engineering of the National Technical University of Athens"},"logos":{"print":null,"web":null},"website":"https://www.ece.ntua.gr/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1747,"name":"Liebherr-Digital Development Center GmbH","member_since":"2025-04-23","renewal_date":"2027-04-01","description":{"long":"The Liebherr Group is a family-run technology company with a highly diversified product programme. The company is one of the largest construction equipment manufacturers in the world. It also provides high-quality, user-oriented products and services in a wide range of other areas. The Liebherr Group includes over 150 companies across all continents. In 2023, it employed more than 50,000 staff and achieved combined revenues of over 14 billion euros."},"logos":{"print":"https://membership.eclipse.org/organization/images/1747-print.eps","web":"https://membership.eclipse.org/organization/images/1747-web.png"},"website":"https://www.liebherr.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1748,"name":"The IO Foundation","member_since":"2025-04-24","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1748-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1749,"name":"EGI Foundation","member_since":"2025-05-06","renewal_date":"2026-06-01","description":{"long":"The EGI Foundation is the coordinating body of the EGI Federation. It offers a federation and management platform that enables service providers to harmonise interfaces and connect to a common hub.\nThe EGI Federation is the scalable digital infrastructure resulting from this coordination, serving thousands of researchers across disciplines. It provides advanced computing and data analytics capabilities through hundreds of public and private service providers, offering distributed computing, storage solutions, co-development opportunities, expert support, and training to propel scientific collaboration and innovation."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1749-web.png"},"website":"https://www.egi.eu","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"df911e0adcad1a1c51df","description":"Guest Member","level":"WGSAP","working_group":"asciidoc"}],"is_active_member":true},{"organization_id":1751,"name":"Stichting Connekt","member_since":"2025-05-09","renewal_date":"2027-05-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1752,"name":"Open Source Matters Inc.","member_since":"2025-06-11","renewal_date":"2026-06-01","description":{"long":"Open Source Matters (OSM) is a not-for-profit organisation, incorporated in the United States, created to serve the financial and legal interests of the Joomla project. OSM has been designed to be flexible and change as the needs of Joomla! expand. At all times, OSM is fashioned to suit the needs of the Joomla project. OSM will also engage in regular self-assessment to ensure it is accountable to Joomla!, acting in Joomla!'s interest and ensuring that it is the right shape and size to support Joomla!."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1752-web.png"},"website":"https://www.joomla.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1754,"name":"GitHub","member_since":"2025-07-08","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1754-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1755,"name":"Engineering Ingegneria Informatica","member_since":"2025-07-22","renewal_date":"2026-08-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1755-web.png"},"website":"https://eng.it/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1756,"name":"ONERA DTIS","member_since":"2025-07-24","renewal_date":"2026-08-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1758,"name":"ifrOSS","member_since":"2025-09-02","renewal_date":"2026-09-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1760,"name":"Validas AG","member_since":"2025-09-09","renewal_date":"2026-09-01","description":{"long":"Validas is the driving force behind safe tools, libraries, and basic software. For 25 years, we have been supporting our international customers from the automotive, aerospace, and semiconductor industries with the qualification of tools, libraries, and basic software, as well as powerful qualification kits for code generators, compilers, and simulators. This ensures that the software used in cars, airplanes, or complex technical systems meets the highest safety requirements and common safety standards such as ISO 26262 or IEC 61508."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1760-web.png"},"website":"https://www.validas.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1761,"name":"Open Source Society Malta","member_since":"2025-09-24","renewal_date":"2026-09-01","description":{"long":"OSSMalta.eu is the premier open source community in Malta, fostering collaboration and knowledge-sharing. It promotes the adoption of open source technologies through educational initiatives and community building. As a member of the Eclipse Foundation's Open Regulatory Compliance Working Group (ORC WG), OSSMalta contributes to developing best practices and guidelines for open source actors to meet evolving regulatory requirements, such as those from the European Cyber Resilience Act. This membership reinforces our commitment to ensuring open source remains a viable and compliant option for developers and businesses across Europe."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1761-web.png"},"website":"https://ossmalta.eu","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1762,"name":"Brightskies","member_since":"2025-10-02","renewal_date":"2026-10-01","description":{"long":"Brightskies is a digital transformation enabler and market leader founded in 2012 with more than 400 employees. With over a decade of experience working closely with more than 50 clients, we guarantee exceptional results to help your business succeed and stand out.\nOur Automotive Services team has very strong experience developing safety-critical automotive systems to most of the car makers around the globe from the classical car makers where safety, security and certification represent the core principals to the disruptive ones where performance, technology and software-defined features are the main theme."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1762-web.png"},"website":"https://brightskiesinc.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1763,"name":"RT-RK DOO Novi Sad","member_since":"2025-10-06","renewal_date":"2026-10-01","description":{"long":"RT-RK is a premium embedded engineering company with over 30 years of experience and 600+ engineers. We help global leaders in the automotive, consumer electronics, and semiconductor industries turn complex ideas into dependable real-time systems. With expertise in both hardware and software development, RT-RK provides scalable technology and resource solutions that enable faster innovation, higher efficiency, and products built to perform at scale."},"logos":{"print":"https://membership.eclipse.org/organization/images/1763-print.eps","web":"https://membership.eclipse.org/organization/images/1763-web.png"},"website":"https://rt-rk.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1764,"name":"ZIUR Foundation","member_since":"2025-10-14","renewal_date":"2026-10-01","description":{"long":"Industrial Cybersecurity Center of Gipuzkoa\nWe are a public initiative created by the Gipuzkoa Provincial Council to help industrial companies reinforce their protection and that of their products or services against cyberattacks.\n\nWe live in a connected world that advances at a great speed. From ZIUR we help you go through that road of opportunities and threats with greater security.\n\nWe want to promote greater safety barriers against cyberthreats in the industrial field, to revitalize the sector of cybersecurity and to contribute to the competitiveness of the companies of our territory"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1764-web.png"},"website":"https://www.ziur.eus","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1767,"name":"Infosys Limited","member_since":"2025-10-27","renewal_date":"2026-11-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1767-web.png"},"website":"https://infosys.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1768,"name":"SignPath Foundation","member_since":"2025-11-10","renewal_date":"2026-11-01","description":{"long":"The SignPath Foundation supports open source projects by providing code signing certificates and a secure signing process through SignPath.io. We verify that binaries are built from the project’s public repository, eliminating the need for personal identity checks. Private keys are securely generated and stored on our HSM, enabling simple integration into automated build pipelines. Our goal is to make trustworthy software delivery accessible to OSS projects, and all services are free of charge."},"logos":{"print":"https://membership.eclipse.org/organization/images/1768-print.eps","web":"https://membership.eclipse.org/organization/images/1768-web.png"},"website":"https://signpath.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1769,"name":"WirelessCar","member_since":"2025-11-17","renewal_date":"2026-11-01","description":{"long":"WirelessCar is a leading innovator of digital vehicle services, accelerating the transformation toward software-defined mobility. With over 25 years of experience, we turn connected vehicle data into business value through scalable, cloud-based solutions spanning connectivity, journey intelligence, safety, and EV services. Connecting more than 17 million vehicles in over 100 countries, WirelessCar collaborates with global OEMs and industry partners to leverage the full value of connected services to empower future mobility."},"logos":{"print":"https://membership.eclipse.org/organization/images/1769-print.eps","web":"https://membership.eclipse.org/organization/images/1769-web.jpg"},"website":"https://www.wirelesscar.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1770,"name":"Libelium","member_since":"2025-11-18","renewal_date":"2026-11-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Participant Member","level":"WGAPS","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1771,"name":"mtrail Deutschland GmbH","member_since":"2025-11-24","renewal_date":"2026-11-01","description":{"long":"mtrail GmbH is a specialized Swiss engineering and software company that develops technology solutions for the international railway industry. Their services focus on traffic management, infrastructure modeling, and AI-based image recognition, notably through products like \"TrainVision\" and the \"RCS\" (Rail Control System) family. They cater primarily to major European railway operators and infrastructure managers, including Swiss Federal Railways (SBB), Deutsche Bahn (DB), and Infrabel."},"logos":{"print":"https://membership.eclipse.org/organization/images/1771-print.eps","web":"https://membership.eclipse.org/organization/images/1771-web.jpg"},"website":"http://www.mtrail.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1775,"name":"Openchip & Software Technologies S.L.","member_since":"2025-12-11","renewal_date":"2026-12-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1776,"name":"TRATON AB","member_since":"2025-12-21","renewal_date":"2027-01-01","description":{"long":"With its brands Scania, MAN, International, and Volkswagen Truck & Bus, the TRATON GROUP is one of the world’s leading commercial vehicle manufacturers. The Group’s product portfolio comprises trucks, buses, and light-duty commercial vehicles. “Transforming Transportation Together. For a sustainable world.”: this intention underlines the Company’s ambition to have a lasting and sustainable impact on the commercial vehicle business and on the Group’s commercial growth."},"logos":{"print":"https://membership.eclipse.org/organization/images/1776-print.eps","web":"https://membership.eclipse.org/organization/images/1776-web.png"},"website":"https://traton.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1777,"name":"LG CNS","member_since":"2025-12-21","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1777-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1778,"name":"Fondazione CHIPS-IT","member_since":"2026-01-02","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1778-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1779,"name":"Associação TICE.PT","member_since":"2026-01-05","renewal_date":"2027-01-01","description":{"long":"TICE.PT is the Portuguese national cluster for Information, Communication, and Electronic Technologies, bringing together companies, universities, research centers, and other relevant entities in the sector. Officially recognized since 2009, the cluster acts as a collaborative platform that promotes innovation, knowledge transfer, and technological development, strengthening the competitiveness of the digital economy in Portugal.\n\nThrough cooperation among its members, TICE.PT seeks to enhance the national technological offering, support research and development projects, stimulate the creation of innovative products and services, and boost the internationalization of Portuguese companies."},"logos":{"print":"https://membership.eclipse.org/organization/images/1779-print.eps","web":"https://membership.eclipse.org/organization/images/1779-web.jpg"},"website":"https://tice.pt/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1780,"name":"Nilux GmbH","member_since":"2026-01-07","renewal_date":"2027-01-01","description":{"long":"Nilux GmbH is a Germany-based automotive software partner driving the transition toward Software-Defined Vehicles. We enable OEMs and Tier-1s to evolve from legacy, ECU-centric systems to scalable SDV architectures through AUTOSAR Classic & Adaptive, middleware, vehicle abstraction, cloud integration, and automotive cybersecurity. As an Eclipse SDV supporting member, Nilux positions itself as a pioneer service partner for SDV strategy, migration, and industrialization, translating open-source SDV innovation into production-ready, safety-compliant vehicle platforms."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1780-web.png"},"website":"https://nilux-gmbh.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1781,"name":"lowRISC C.I.C.","member_since":"2026-01-19","renewal_date":"2027-02-01","description":{"long":"Open Silicon Everywhere™\n\nlowRISC® C.I.C. (Community Interest Company) is a regulated not-for-profit company with a mission to help make open-source silicon a reality, commercially relevant, and widely adopted throughout the industry. \nWe aim to bring to semiconductors the enormous benefits that open-source already provides to software: transparency, reuse and collaboration.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1781-web.png"},"website":"https://lowrisc.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1782,"name":"ACTIA Group","member_since":"2026-01-21","renewal_date":"2027-02-01","description":{"long":"Founded in 1986, ACTIA Group is a mid-sized, family-owned international company designing and manufacturing electronic systems for demanding sectors including mobility, aerospace, space and energy. ACTIA supports its customers throughout the full product lifecycle, from design to production and services. The Group delivers robust, high-performance and competitive solutions, with strong industrial capabilities and supply chain expertise. Its organization enables responsiveness and execution across international markets, making ACTIA a reliable partner for complex electronic programs."},"logos":{"print":"https://membership.eclipse.org/organization/images/1782-print.eps","web":"https://membership.eclipse.org/organization/images/1782-web.png"},"website":"https://www.actia.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1784,"name":"AINekko, Co.","member_since":"2026-02-24","renewal_date":"2027-03-01","description":{"long":"Ainekko develops RISC-V–based compute platforms for AI applications on the edge and contributes to the open hardware ecosystem through collaboration with the OpenHW Group and the broader RISC-V community."},"logos":{"print":"https://membership.eclipse.org/organization/images/1784-print.eps","web":"https://membership.eclipse.org/organization/images/1784-web.png"},"website":"https://nekko.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1785,"name":"Appraid-tech","member_since":"2026-02-24","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":"https://membership.eclipse.org/organization/images/1785-print.eps","web":"https://membership.eclipse.org/organization/images/1785-web.png"},"website":"https://www.appraid-tech.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1786,"name":"Applied Intuition Inc.","member_since":"2026-02-25","renewal_date":"2027-03-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1788,"name":"42dot Inc.","member_since":"2026-03-09","renewal_date":"2027-03-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1789,"name":"Beijing Academy of Artificial Intelligence (BAAI)","member_since":"2026-03-10","renewal_date":"2027-03-01","description":{"long":"Beijing Academy of Artificial Intelligence(BAAI) is a non-profit new research and development institution established in November 2018. It is committed to becoming a leader in artificial intelligence innovation, creating the best academic and technological innovation ecosystem globally, tackling the most fundamental and critical problems, and serving as the source of academic ideas, basic theories, top talents, enterprise innovation, and development policies for artificial intelligence worldwide, thereby promoting sustainable development for humanity, the environment, and intelligence."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1789-web.png"},"website":"https://www.baai.ac.cn","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1790,"name":"Open Culture Foundation","member_since":"2026-04-09","renewal_date":"2027-04-01","description":{"long":"Open Culture Foundation is a non-profit organization. Through promoting open technology and cross-field collaboration, we continue to connect tech communities and other public and private entities in Taiwan. By doing so, we work to promote open co-creation and protect digital rights, and thereby support a more transparent and inclusive digital civil society.\nSince 2014, we have functioned as a legal entity and supported over 30 open technology communities in Taiwan. Throughout this process, we have not only continued to promote the idea of open technology, we have also become involved in policy advocacy and spoken up for the public's digital rights."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1790-web.png"},"website":"https://ocf.tw/en/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1791,"name":"Mosaic SoC","member_since":"2026-04-14","renewal_date":"2027-04-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1792,"name":"Fundación para la Transparencia del Software","member_since":"2026-04-16","renewal_date":"2027-04-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1793,"name":"AUTOSOL, LP","member_since":"2026-05-07","renewal_date":"2027-05-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true}] \ No newline at end of file +[{"organization_id":656,"name":"IBM","member_since":"2002-02-21","renewal_date":"2027-01-01","description":{"long":"IBM and Eclipse\r\n
    \r\nIBM is proud to be among the founders of the Eclipse project. Beginning in 2001, both IBM and Rational Software were founding members of the Eclipse consortium and the not for profit Eclipse Foundation. Rational Software was acquired by IBM in 2003, and today IBM Rational continues as a Strategic Member of the Eclipse Foundation.\r\n

    \r\nEclipse continues to be core to dozens of IBM offerings from Rational, WebSphere, Lotus, Tivoli, and Information Management. IBM Rational software provides an Eclipse-based software development platform that improves the speed, quality, and predictability of software projects. This full life-cycle solution combines software engineering best practices, market-leading tools, and services.

    \r\n\r\nThe Rational Software Delivery Platform\r\n
    \r\nThe Rational Software Delivery Platform helps align all aspects of development and engineering operations with business needs. This highly collaborative environment supports IT as well as systems engineering efforts, and spans the entire project lifecycle with a complete, integrated set of products, services, and best practices.\r\n

    \r\nA key component of the Rational portfolio is Jazz, a technology platform for collaborative software delivery. Uniquely attuned to global and distributed teams, the Jazz platform is designed to transform how people work together to build software -- making software delivery more collaborative, productive, and transparent.\r\n

    \r\nThe IBM Rational Software Development Platform is the industry\\'s most complete, open, standards-based software development environment, and it enables our clients to more easily govern their software and systems development and delivery. Ninety-three of the Fortune Top 100 companies use Rational software.\r\n

    \r\nAdditional information is available at ibm.com/rational"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/656-web.gif"},"website":"https://www.ibm.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":665,"name":"SAP SE","member_since":"2004-01-01","renewal_date":"2027-02-01","description":{"long":"SAP has a rich history of innovation and growth that has made us the recognized leader in providing collaborative business solutions for all types of industries in every major market. \\r\\n\\r\\nAs a market leader in enterprise application and digital transformation software, SAP helps companies of all sizes and industries run better. From back office to boardroom, warehouse to storefront, desktop to mobile devices, SAP empowers people and organizations to work together more efficiently by utilizing cloud, analytics, machine learning, Big Data, IoT and other insights more effectively to stay ahead of the competition. SAP applications and open cloud platform services enable more than 296,000 customers in 190 countries to operate profitably, adapt continuously, and grow sustainably.\\r\\n\\r\\nSAP has been a strategic member of the Eclipse Foundation since its inception."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/665-web.png"},"website":"https://www.sap.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Platinum Member","level":"WGPLM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":682,"name":"Ericsson AB","member_since":"2004-01-14","renewal_date":"2027-02-01","description":{"long":"At Ericsson, we strive to connect everyone, wherever they may be. Because by being connected, people can take part in the emerging global collaboration that is the Networked Society - a society in which every person and every industry is empowered to reach their full potential.\\r\\nOur services, software and infrastructure - especially in mobility, broadband and the cloud - are enabling the communications industry and other sectors to do better business, increase efficiency, improve their users\\' experience and capture new opportunities.\\r\\nBy enabling the Networked Society, we make a real difference to people\\'s lives, and the world we live in.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/682-web.png"},"website":"https://www.ericsson.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":685,"name":"Fujitsu Limited","member_since":"2004-04-28","renewal_date":"2027-04-01","description":{"long":"We provide software and services to help companies continuously visualize and optimize their business processes and applications to improve and innovate while creating leaner, more efficient operations. With market conditions changing rapidly, organizations need to be equipped to iteratively develop, deploy, and optimize business processes and applications to meet these business demands - without compromising on business governance."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/685-web.png"},"website":"https://www.fujitsu.com/global/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":687,"name":"Genuitec, LLC","member_since":"2008-08-31","renewal_date":"2027-01-01","description":{"long":"Genuitec's products enable developers to build anything from anywhere with anyone.\n

    \nMyEclipse, our flagship professional IDE, is the world-wide leader in its class for enterprise Java and web development. Premium toolset. Fair pricing.\n

    \nCodeTogether, our cross-IDE live sharing system, enables users of Eclipse, VS Code, IntelliJ, and the IDEs based on those, to code together collaboratively using all the tools they prefer.\n

    \nDevStyle with Darkest Dark makes millions of Eclipse installations look their very best, in dark or light themes, with stunning custom icons. Free in the marketplace."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/687-web.png"},"website":"https://genuitec.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":690,"name":"EclipseSource","member_since":"2007-03-01","renewal_date":"2027-03-01","description":{"long":"EclipseSource has well over a decade of experience in designing, developing and enhancing tools for a variety of domains and based on all major technology platforms. Whether it is a classic IDE for software engineering, a modeling tool for your domain experts or a domain-specific solution for engineers, whether the tool is a web-based, a desktop-based application, a tool based on Eclipse Theia or a plugin for Eclipse, EclipseSource can support you in implementing the best possible solution for your use case. We provide a complete range of services including conception, evaluation, training, support, and consulting/implementation all with a special focus on framework adoption, creation, and (long-term) maintenance. EclipseSource is a major contributor to a large number of open source projects inside and outside the Eclipse ecosystem. EclipseSource is distributed over multiple locations in Europe and serves a truly global customer base from various domains, ranging from Fortune 100 corporations to individual developers"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/690-web.png"},"website":"https://eclipsesource.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":721,"name":"Oracle","member_since":"2004-01-27","renewal_date":"2027-02-01","description":{"long":"Oracle\\'s business is information how to manage it, use it, share it, protect it. The world\\'s largest enterprise software company, Oracle is the only vendor to offer solutions for every tier of your business-database, middleware, business intelligence, business applications, and collaboration. With Oracle, you get information that helps you measure results, improve business processes, and communicate a single truth to your constituents.\\r\\n\\r\\nOracle\\'s next-generation enterprise computing platform Fusion is being designed to enable incremental adoption of a powerful, flexible, service-oriented IT infrastructure without the disruption associated with a wholesale platform upgrade. This portfolio is built on powerful Fusion design principles, standardizing the priorities and practices of your enterprise computing strategy-saving you significant time and money."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/721-web.gif"},"website":"https://www.oracle.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":731,"name":"Red Hat, LLC.","member_since":"2005-01-26","renewal_date":"2027-03-01","description":{"long":"Red Hat is the open hybrid cloud technology leader, delivering a trusted, consistent and comprehensive foundation for transformative IT innovation and AI applications. Its portfolio of cloud, developer, AI, Linux, automation and application platform technologies enables any application, anywhere—from the datacenter to the edge. As the world's leading provider of enterprise open source software solutions, Red Hat invests in open ecosystems and communities to solve tomorrow's IT challenges. Red Hat helps its partners and customers build, connect, automate, secure and manage their IT environments, supported by consulting services and award-winning training and certification offerings."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/731-web.png"},"website":"https://www.redhat.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"},{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"df911e0adcad1a1c51df","description":"","level":"WGPL","working_group":"asciidoc"},{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":742,"name":"Thales","member_since":"2009-08-28","renewal_date":"2027-04-01","description":{"long":"Thales is a world leader in mission-critical information systems for defense and security, aerospace and transportation."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/742-web.jpg"},"website":"https://www.thalesgroup.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Strategic Member","level":"WGSD","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":758,"name":"Fraunhofer-Gesellschaft","member_since":"2004-01-01","renewal_date":"2027-02-01","description":{"long":"

    The Fraunhofer-Gesellschaft, headquartered in Germany, is the worlds leading applied research organization. With its focus on developing key technologies that are vital for the future and enabling the commercial exploitation of this work by business and industry, Fraunhofer plays a central role in the innovation process. As a pioneer and catalyst for groundbreaking developments and scientific excellence, Fraunhofer helps shape society now and in the future. Founded in 1949, the Fraunhofer-Gesellschaft currently operates 75 institutes and research institutions throughout Germany. The majority of the organizations 29,000 employees are qualified scientists and engineers, who work with an annual research budget of 2.8 billion euros. Of this sum, 2.4 billion euros are generated through contract research.

    \\r\\n

    For several Fraunhofer institutes, open source plays a vital role in many research areas:

    \\r\\n

    The Fraunhofer Institute for Open Communication Systems FOKUS offers research services ranging from requirements analysis to consulting, feasibility studies, technology development right up to prototypes and pilots in the business segments Digital Public Services, Future Applications and Media, Quality Engineering, Smart Mobility, Software-based Networks, Networked Security, Visual Computing und Analytics. Fraunhofer FOKUS, for example provides the open source simulation environment Eclipse MOSAIC for testing mobility scenarios. In addition, the institute has contributed an IoT-Testware to Eclipse and is interested in AI, Cloud and Edge activities.

    \\r\\n\\r\\n

    The Fraunhofer Institute for Intelligent Analysis and Information Systems IAIS is one of the leading scientific institutes in Artificial Intelligence, Machine Learning, and Big Data in Germany and Europe. With its more than 300 employees, the institute supports companies in the optimization of products, services, processes and structures and development of new digital business models.

    \\r\\n\\r\\n

    The Fraunhofer Institute for Experimental Software Engineering IESE supports the digitization of services, systems, and the development of digital ecosystems. Dedicated to open-source software, we create solutions for virtual engineering, safe systems, and Industry 4.0.

    \\r\\n\\r\\n

    The Fraunhofer Institute for Software and Systems Engineering ISST focuses on designing and developing data spaces that enable sovereign, secure and controllable data sharing across company boundaries. Therefore, Fraunhofer ISST offers technical design, implementation of system components and consultancy services throughout the entire development process.

    \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/758-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":760,"name":"Object Management Group, Inc.","member_since":"2004-01-01","renewal_date":"2027-01-01","description":{"long":"OMG Task Forces develop enterprise integration standards for a wide range of technologies and an even wider range of industries. OMG\\'s modeling standards enable powerful visual design, execution and maintenance of software and other processes. For more information, visit www.omg.org. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/760-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":800,"name":"STMicroelectronics International N.V.","member_since":"2020-01-01","renewal_date":"2027-01-01","description":{"long":"At ST, we are 48,000 creators and makers of semiconductor technologies mastering the semiconductor supply chain with state-of-the-art manufacturing facilities. An independent device manufacturer, we work with more than 200,000 customers and thousands of partners to design and build products, solutions, and ecosystems that address their challenges and opportunities, and the need to support a more sustainable world. Our technologies enable smarter mobility, more efficient power and energy management, and the wide-scale deployment of the Internet of Things and 5G technology. ST is committed to becoming carbon neutral by 2027. Further information can be found at www.st.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/800-web.png"},"website":"https://st.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":816,"name":"Vector Informatik GmbH","member_since":"2006-05-12","renewal_date":"2027-05-01","description":{"long":"

    \nVector provides tools, software components and engineering services for the networking of electronic systems in the automobile and related industries.\n

    The ECU development is supported with tools for the design, test, calibration and diagnostics as well as with software components and development services.

    "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/816-web.png"},"website":"https://www.vector.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Platinum Member","level":"WGPLM","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":823,"name":"ARM Limited","member_since":"2006-08-01","renewal_date":"2027-04-01","description":{"long":"Arm designs the technology that lies at the heart of advanced digital products, from wireless, networking and consumer entertainment solutions to imaging, automotive, security and storage devices.\\r\\n
    \\r\\nArm\\'s comprehensive product offering includes 16/32-bit RISC microprocessors, data engines, 3D processors, digital libraries, embedded memories, peripherals, software and development tools, as well as analog functions and high-speed connectivity products.\\r\\n
    \\r\\nCombined with the company\\'s broad Partner community, they provide a total system solution that offers a fast, reliable path to market for leading electronics companies. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/823-web.png"},"website":"https://www.arm.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":848,"name":"Advanced Micro Devices (AMD)","member_since":"2007-02-27","renewal_date":"2026-07-01","description":{"long":"Advanced Micro Devices, Inc. (NYSE: AMD) is a global leading provider of processors, chipsets and graphics products. To ensure that these products enable solutions for customers, AMD works with the software community, invests in advancements in the software ecosystem and develops tools and libraries to assist in software development. For more information on AMD's software product, efforts and guidance on software development, visit AMD Developer Central at http://developer.amd.com"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/848-web.jpg"},"website":"https://www.amd.com/en/developer.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"}],"is_active_member":true},{"organization_id":863,"name":"OBEO","member_since":"2007-05-29","renewal_date":"2026-06-01","description":{"long":"Obeo is a software provider, specialized in the model driven approach and a key player of the Eclipse platform. It is an actor of the Open Source ecosystem and a strategic member of the Eclipse Foundation; Obeo is one of the major Eclipse contributors, ranking up as one of the top contributing companies every year since it became a member of the Eclipse Foundation.\\r\\n\\r\\nObeo\\'s primary concerns are to provide open technologies allowing users to master the complexity of systems.\\r\\n\\r\\nIts product range include: Sirius (Graphical Designers), Acceleo (code generator), Obeo Designer (custom graphical modeling environment), collaborative add-ons for Eclipse Capella, Obeo SmartEA (Enterprise Architecture), consulting (training, expertise and coaching), and Eclipse Modeling as a foundation stack of any modeling environment.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/863-web.png"},"website":"https://www.obeosoft.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":890,"name":"BlackBerry Limited ","member_since":"2007-12-04","renewal_date":"2026-12-01","description":{"long":"QNX Software Systems Limited, a subsidiary of BlackBerry Limited, is a leading provider of operating systems, middleware, professional services, and Eclipse-based development tools for connected embedded systems. Global leaders such as Audi, Siemens, General Electric, Cisco, and Lockheed Martin depend on QNX technology for their in-car electronics, medical devices, industrial automation systems, network routers, and other mission- or life-critical applications. Visit www.qnx.com and follow @QNX_News on Twitter. For updates on the company\\'s automotive work, follow @QNX_Auto and visit qnxauto.blogspot.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/890-web.png"},"website":"https://blackberry.qnx.com/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":895,"name":"Siemens AG","member_since":"2008-01-16","renewal_date":"2027-02-01","description":{"long":"Siemens is a global powerhouse focusing on the areas of electrification, automation and digitalization. One of the worlds largest producers of energy-efficient, resource-saving technologies, Siemens is a leading supplier of systems for power generation and transmission as well as medical diagnosis. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/895-web.gif"},"website":"https://www.siemens.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":937,"name":"CEA LIST","member_since":"2008-09-18","renewal_date":"2027-01-01","description":{"long":"List, expert on digital systems
    \\r\\n
    \\r\\nBased in Saclay (Paris region, France), List is a public research institute specialized in digital systems design. Its main mission is based on achieving excellence technological development on behalf of industrial partners for value creation.
    \\r\\n
    \\r\\n100 industrial collaborations per year
    \\r\\n
    \\r\\nList institute counts more than 700 partners and every year more than a 100 partnership activities are being conducted with French and foreign industrial companies on applied research projects in four main topics:\\r\\n
      \\r\\n
    • Advanced Manufacturing
    • \\r\\n
    • Embedded systems
    • \\r\\n
    • Ambient intelligence
    • \\r\\n
    • Health ionizing radiations
    • \\r\\n
    \\r\\nLabeled as Carnot Institute , List invests every year 25% of its budget into scientific resourcing actions in order to identify better tomorrows technological breakthroughs.
    \\r\\n
    \\r\\nCEA Tech as CEA (Commissariat a l\\'energie atomique et aux energies alternatives) Technological Research Division, gathers three specialised technological research institutes among which List institute specialised on digital systems.
    \\r\\n
    \\r\\nAt a world class state-of-the-art
    \\r\\n
    \\r\\nOur activity is based on three main pillars\\r\\n
      \\r\\n
    • Scientific excellence
    • \\r\\n\\r\\nList research engineers dedicate a 100% of their time to R&D activities and publish their results into international leading conferences and scientific journals. Keeping a strong link with academic research, they base their research on world-wide state of the art.\\r\\n\\r\\n
    • The Culture of Industry
    • \\r\\n\\r\\nOur research teams are enlightened and motivated by a results-driven culture of projects, fixing themselves clear objectives to reach within committed deadlines and budgets. Each project launched by List Institute is fully assigned to permanent and suited human resources. The project management is based on a precise calendar, identified milestones and a clear description of deliverables.
      \\r\\n\\r\\nResearch results confidentiality and intellectual property (patents) are defined by the parties in the collaboration agreement.\\r\\n\\r\\n
    • Opening to the world
    • \\r\\n\\r\\nList Institute is fully integrated into a local and national particularly dynamic ecosystem through strategic academic, institutional and industrial partnerships. In order to maintain the best level internationally in its fields of activity List institute is also involved in more than 200 European collaborative projects, collaborates with leading foreign academic laboratories and conducts research activities at an international level, especially in the USA."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/937-web.png"},"website":"https://list.cea.fr/en/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"ecd63e75a561bffe2ffc","description":"Strategic Member","level":"WGSD","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":954,"name":"Business Systems Integration AG","member_since":"2009-03-26","renewal_date":"2027-04-01","description":{"long":"With its BSI Customer Suite, the Swiss software company BSI provides a comprehensive platform for the digital transformation of customer relationships. It offers everything needed for an outstanding customer experience in the retail, banking, insurance and energy & utility industries. At the core of the innovation is the company’s many years of industry experience. Founded in Baden, Switzerland, in 1996, BSI has about 400 employees and 7 additional offices in Germany and Switzerland. BSI’s customers include companies and organizations such as ADAC, Signal Iduna and HDI and other market-leading companies throughout Europe. Visit BSI"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/954-web.png"},"website":"https://www.bsi-software.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":968,"name":"Eurotech","member_since":"2009-12-10","renewal_date":"2027-01-01","description":{"long":"

      Eurotech integrates hardware, software, solutions, and expertise to deliver embedded computing platforms, sophisticated systems and cloud-based services to leading OEMs, system integrators, and enterprise customers for successful, efficient, and speedy deployment of their products and services.

      \n\n

      Eurotech simplifies pervasive computing, allowing our customers to focus on their core competencies, the products and services only they can deliver, while Eurotech lays the embedded computing foundation to bring those offerings to market as quickly as possible. (1) Minimalist computing, drawing on decades of experience in low power design, miniaturization of platforms, and simplification of application development through modular middleware and toolsets, allows our customers to create the most efficient products and services possible. (2) With strengths in wireless services and communications protocols, we deliver the integrated and connected solutions our customers need to simplify the development and deployment of their products and services, even through the cloud. (3) Combining pervasive technology excellence with domain expertise allows Eurotech to meet the pervasive computing needs of five key market segments including healthcare, security, transportation, energy, and industrial. (4) As a trusted business associate to both our customers and our partners, we are committed to the mutual success of all companies in the value chain for networked solutions.

      \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/968-web.png"},"website":"https://www.eurotech.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":977,"name":"FZI Forschungszentrum Informatik","member_since":"2010-04-12","renewal_date":"2027-04-01","description":{"long":"The FZI Research Centre for Information Technology is an interdisciplinary non-profit research organization, based in Karlsruhe, Germany, whose mission is to facilitate technology transfer of innovative IT solutions and to provide a bridge between academia and industry. FZI offers its customers a unique interdisciplinary environment that fosters joint research among diverse fields of Computer Science, Mechanical and Electrical Engineering, and Economics. \n\nFZI has been a great success story for 25 years now, and using its extensive network of contacts both in the academic and the industrial world, it has been an important catalyst for the development of IT in the Karlsruhe region. \n\nToday, FZI has over 150 employees, mostly young scientists with outstanding experience in both research projects and professional consulting activities.\n\nFZI is a major promoter of Open Source, having among its employees contributors to dozens of open source projects, many of which targeting the Eclipse platform.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/977-web.png"},"website":"https://www.fzi.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":979,"name":"Robert Bosch GmbH","member_since":"2010-04-27","renewal_date":"2027-01-01","description":{"long":"The Bosch Group is a global supplier of technology and services. Its operations are divided into four business sectors: Mobility Solutions, Industrial Technology, Consumer Goods, and Energy and Building Technology. Bosch offers innovative solutions for smart homes, Industry 4.0, and connected mobility. Bosch is pursuing a vision of mobility that is sustainable, safe, and exciting, as well as an open approach to the Software Defined Vehicle technology stack of the future in conjunction with its subsidiary ETAS GmbH. The Bosch Group comprises roughly 440 companies in about 60 countries, employing some 76,100 associates in research and development, around half of which are software engineers."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/979-web.png"},"website":"https://bosch.com","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":989,"name":"Protos Software GmbH","member_since":"2010-06-23","renewal_date":"2026-07-01","description":{"long":"Protos is a service company that specialized in the development of model-driven, domain-specific tools and applications for Embedded Systems.\\r\\n\\r\\nWe develop tools and applications for our customers and support them with training, consulting and coaching. Most of our projects are based on Eclipse Open Source Tools."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/989-web.png"},"website":"https://protos.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":990,"name":"Sigasi","member_since":"2010-06-24","renewal_date":"2026-07-01","description":{"long":"Sigasi allows FPGA and ASIC designers in the medical, telecom, automotive, defense, and aerospace worlds to achieve their full potential with a powerful Integrated Development Environment (IDE).\n\nSigasi assists design engineers in writing RTL with a mix of VHDL, Verilog, and SystemVerilog, giving them everything from basic editing to advanced features like autocomplete, code navigation, and linting. Most importantly, Sigasi gives hardware designers real-time feedback.\n\nMoreover, Sigasi integrates with existing workflows, including CI/CD checking, allowing teams to safeguard entire code repositories. This is particularly valuable for ASIC design and optimizing hand-off to verification teams."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/990-web.png"},"website":"https://www.sigasi.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":998,"name":"FUNDACIÓN TECNALIA RESEARCH & INNOVATION","member_since":"2010-09-24","renewal_date":"2027-04-01","description":{"long":"

      TECNALIA is the largest center of applied research and technological development in Spain, a benchmark in Europe and a member of the Basque Research and Technology Alliance. We collaborate with companies and institutions to improve their competitiveness, people’s quality of life and achieve sustainable growth. We do it thanks to people who are passionate about technology and committed to building a better society.

      \n

      Our Mission: To transform technological research into prosperity.

      \n

      Our Vision: To be agents of transformation of companies and society for their adaptation to the challenges of a changing future.

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/998-web.png"},"website":"https://www.tecnalia.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Supporter Member","level":"WGSM","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1006,"name":"Yatta Solutions GmbH","member_since":"2010-11-29","renewal_date":"2026-12-01","description":{"long":"Yatta is all about software development, engineering and evolution. We started as a developer tool company, transformed into a software vendor and now help build B2B ecosystems for digital products.\n

      \nWe are open-source project lead of the Eclipse Marketplace Client, package maintainer of the Eclipse IDE for Java Developers, and member of the Eclipse IDE working group. We commit and contribute to various other open-source projects as well.\n

      \nOur goal is to keep and sustain Eclipse as an open ecosystem. That's why we have launched the Yatta Checkout for Eclipse."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1006-web.png"},"website":"https://yatta.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1009,"name":"BMW Group","member_since":"2011-01-01","renewal_date":"2027-01-01","description":{"long":"BMW Group is now Eclipse member.\n

      \nThe BMW Group is an automobile manufacturer. With its three brands, BMW, MINI and Rolls-Royce Motor Cars, the BMW Group is focusing on the premium sector of the international automobile market. In addition the BMW Group is also a manufacturer of motorcycles and a provider of financial services.\nSoftware plays an important role in modern cars and is one of the main drivers of innovation in the automobile industry. The Eclipse technology is used by BMW in various forms for the development of in-car electric/electronic (E/E) systems and its accompanying development tasks.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1009-web.png"},"website":"https://www.bmw.com/en/index.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1042,"name":"Virtual Vehicle Research GmbH","member_since":"2012-02-03","renewal_date":"2027-02-01","description":{"long":"Virtual Vehicle Research GmbH (ViF) is a holding company of the COMET K2 research program \\\"K2 Digital-Mobility\\\" an international institution in the field of application-oriented vehicle development."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1042-web.jpg"},"website":"https://www.virtual-vehicle.at/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1069,"name":"Renesas Electronics Corporation","member_since":"2012-11-09","renewal_date":"2026-11-01","description":{"long":"Renesas Electronics Corporation, headquartered in Japan, delivers trusted embedded design innovation with complete semiconductor solutions that enable billions of connected, intelligent devices to enhance the way people work and livesecurely and safely.\\r\\n\\r\\nA global leader in microcontrollers, analog, power and SoC products, Renesas provides the expertise, quality, and comprehensive solutions for a broad range of Automotive, Industrial, Home Electronics (HE), Office Automation (OA) and Information Communication Technology (ICT) applications to help shape a limitless future.\\r\\n\\r\\nRenesas Electronics is one of the leading supplier for the global automotive industry and number one supplier of automotive microcontrollers (MCUs) worldwide with advanced semiconductor solutions, including system-on-chip (SoC). \\r\\n\\r\\nWith Renesas autonomyTM, an open, innovative, and trusted platform for assisted and automated driving, Renesas Electronics gives customers the choice to decide the future of driving will look like.\\r\\n\\r\\nRenesas Electronics is dedicated to support big ideas both locally and globally with its subsidiaries in 20 countries worldwide. More information is available at www.renesas.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1069-web.png"},"website":"https://www.renesas.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"},{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1077,"name":"University of Skovde","member_since":"2013-02-28","renewal_date":"2027-02-01","description":{"long":"The University of Skovde is one of the most specialised universities in Sweden and our research is focused on the development and use of advanced information technology systems and models. Areas of expertise include organisational and technological aspects of the ICT area. Over a number of years research has addressed various aspects of openness. We have significant experience with research and practice related to different stakeholder roles (including providers, developers and users) related to Open Source and Open Standards. Previous activities include involvement as partner and leader in several international and national research projects. In collaboration with leading academic partners we conducted rigorous research in the EU FP6 CALIBRE project (2004-2006), which involved extensive interaction with European industry and presented a roadmap for future research on the Open Source phenomenon. As partners in the CALIBRE-project, the ITEA-project COSI and the ITEA2-project OPEES, we have experience of international collaboration, and close collaboration with many leading researchers and practitioners in areas related to the Open Source phenomenon. Current activities include research on various aspects of openness impacting on long-term sustainability of software systems with associated digital assets. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1077-web.jpg"},"website":"https://www.his.se/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1083,"name":"Robotron Datenbank-Software GmbH","member_since":"2013-06-01","renewal_date":"2026-06-01","description":{"long":"Robotron is an innovative IT service provider specializing in the efficient management and analysis of large volumes of data. We support customers in the energy sector, industry and public administration with practical software solutions that optimize business processes and deliver measurable value across the value chain. Our portfolio is complemented by comprehensive consulting, project and operational services – making us a reliable partner who understands both technologies and industry-specific processes."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1083-web.jpg"},"website":"https://www.robotron.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1090,"name":"Open Source Automation Development Lab (OSADL)","member_since":"2022-07-27","renewal_date":"2027-04-01","description":{"long":"The Open Source Automation Development Lab (OSADL) eG is a community for Open Source software in industry and delivers everything a company needs to successfully use Open Source software and especially Linux in industrial products and generally in embedded systems in an efficient and license compliant way. \n\nOSADL is a registered cooperative and accepts members from all over the world. The economical advantage of an OSADL membership is based on the principle of OSADL’s business model: Develop once for the use of many. \n\nMore information at: https://www.osadl.org"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1090-web.png"},"website":"https://www.osadl.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1105,"name":"Lablicate GmbH","member_since":"2013-12-01","renewal_date":"2026-12-01","description":{"long":"Lablicate GmbH is the company behind OpenChrom. Our expertise is software in general and Eclipse technology in special in combination with knowledge of various techniques used in analytical chemistry and related areas. The combination of IT- and Science Know-How is our strength. We are experienced using the benefits of both world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1105-web.png"},"website":"https://www.lablicate.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1106,"name":"AMIQ EDA","member_since":"2013-12-09","renewal_date":"2026-12-01","description":{"long":"AMIQ EDA provides software tools that enable hardware design and verification engineers to increase the speed and quality of new code development, simplify legacy code maintenance, accelerate language and methodology learning, and improve source code reliability."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1106-web.jpg"},"website":"https://www.amiq.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1122,"name":"HiveMQ GmbH","member_since":"2014-05-06","renewal_date":"2027-05-01","description":{"long":"HiveMQ helps companies connect devices to the Internet. Our HiveMQ MQTT platform makes it possible to move data from device to cloud in a secure, reliable and scalable manner. Over 130 customers, including many Fortune 500 companies, rely on HiveMQ in production for mission critical use cases like connected cars, transportation, logistics, Industry 4.0 and connected IoT products. Visit hivemq.com for more details."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1122-web.png"},"website":"https://www.hivemq.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1125,"name":"Kichwa Coders Canada Inc.","member_since":"2014-05-14","renewal_date":"2027-05-01","description":{"long":"Kichwa Coders is a software consultancy specialising in Eclipse open source software for scientific and embedded applications. We help companies adopt and make the most out of open source software."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1125-web.png"},"website":"https://www.kichwacoders.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1134,"name":"Mercedes-Benz Tech Innovation GmbH","member_since":"2014-06-18","renewal_date":"2027-01-01","description":{"long":"We develop IT for tomorrow's mobility: We are a fully owned subsidiary of Mercedes-Benz Group AG. As an equal IT partner, we work within the Mercedes-Benz Group AG to shape the digital path to future mobility."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1134-web.png"},"website":"https://www.mercedes-benz-techinnovation.com/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1135,"name":"Canonical Group Limited","member_since":"2014-06-12","renewal_date":"2026-06-01","description":{"long":"

      Canonical is the company behind Ubuntu, the leading OS for container, cloud, scale-out and hyperscale computing. 65% of large-scale OpenStack deployments are on Ubuntu, using both KVM and the pure-container LXD hypervisor for the worlds fastest private clouds. Canonical provides enterprise support and services for commercial users of Ubuntu.

      \\r\\n\\r\\n

      Canonical leads the development of Juju, the model-driven operations system, and MAAS (Metal-as-a-Service), which creates a physical server cloud and IPAM for amazing data centre operational efficiency. Established in 2004, Canonical is a privately held company.

      \\r\\n\\r\\n

      Canonical leads the development of the snap universal Linux packaging system for secure, transactional device updates and app stores. Ubuntu Core is an all-snap OS, perfect for devices and appliances. Established in 2004, Canonical is a privately held company.

      \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1135-web.png"},"website":"https://www.ubuntu.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"},{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1138,"name":"Universite Grenoble Alpes (UGA)","member_since":"2014-07-03","renewal_date":"2026-07-01","description":{"long":"As the world is becoming more and more competitive, our institution aims to better respond to the challenges the world poses universities today and in the future, and to be more visible and attractive internationally.\\r\\n\\r\\nThe Universit Grenoble Alpes already features in the top 100 and top 200 universities in major international rankings (Reuters, Shanghai, Times Higher Education and QS for example) for some of its scientific fields. The UGA rivals the best universities in the world thanks to the strength of its research and the numerous educational innovations it has implemented."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1138-web.png"},"website":"https://www.univ-grenoble-alpes.fr/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1144,"name":"DB Systel GmbH","member_since":"2014-08-01","renewal_date":"2027-03-01","description":{"long":"

      \\r\\nDB Group offers globally mobility and logistical services and operates in over 130 countries world-wide. Every day, more than 300,000 employees, of which about 195,000 are located in Germany, are committed to ensuring that customers are provided with mobility and logistical services and that the related rail, road, ocean and air traffic networks are operated and controlled efficiently.\\r\\n

      \\r\\n

      \\r\\nThe companys core business is the railway in Germany with more than 5,5 million customers every day in the passenger transport segment, and about 596 thousand tons of freight shipped via rail. More than 1.8 million customers travel via DB buses in Germany every day. Deutsche Bahn operates more than 40,000 train runs daily on its more than 33,300 kilometer-long, modern rail network, which is also open to competition. The number of train stations is 5.681.\\r\\n

      \\r\\n

      \\r\\nFrom electronic signal boxes to online ticketing and computerized route planning \\r\\noperating today\\'s highly complex mobility and traffic networks is simply unimaginable\\r\\nwithout information and communication technology (ICT). DB Systel, a wholly owned subsidiary of the DB Group, is the digitalisation partner for all Deutsche Bahn companies. As an integrated and value-adding company within the DB Group, DB Systel offers a comprehensive range of customised solutions and services that meets the highest IT standards and picks up on the latest trends. It does so by incorporating its extensive railway and IT expertise and, as a long-term vendor-neutral partner, by pursuing the Groups common objective.\\r\\n

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1144-web.png"},"website":"https://www.dbsystel.de/dbsystel","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1147,"name":"Mueller-BBM VibroAkustik Systeme GmbH","member_since":"2014-10-01","renewal_date":"2026-10-01","description":{"long":"As one of the world\\'s leading suppliers of vibroacoustic measurement technology, Mueller-BBM VibroAkustik Systeme is focussed on the acquisition, analysis, evaluation and management of dynamic data. \nOur tight partnership with the various industries as well as our recognized expertise in acoustics and vibration results in innovative solutions and establishes us as a strong partner for your noise, vibration and harshness (NVH) measurement and analysis requirements. Our PAK system seamlessly integrates into laboratory, production and field environments."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1147-web.png"},"website":"https://www.mbbm-vas.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1156,"name":"Neuron Engineering Tools GmbH","member_since":"2015-01-08","renewal_date":"2027-01-01","description":{"long":"Neuron Engineering Tools GmbH, with locations in Austria, Germany and Hungary, has been developing software tools and platforms for industrial automation since 1987. Key solutions include the IEC 61131-3 programming system of the Neuron Engineer series, the portable runtime system RTS (scalable from microcontrollers to multi-core IPCs), and the documentation tool logi.DOC. Over 30,000 engineers worldwide use Neuron software to automate systems such as power plants, steel mills, machines, and more — creating, testing, and managing efficient, high-quality solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1156-web.png"},"website":"https://www.neuron-automation.eu/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1164,"name":"Gradle Inc","member_since":"2015-02-24","renewal_date":"2027-03-01","description":{"long":"Gradle Inc. is the company behind the leading software solution for improving developer productivity called Gradle Enterprise and the popular open-source Java build automation system called Gradle Build Tool.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1164-web.png"},"website":"https://gradle.org","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1166,"name":"Azul Systems, Inc","member_since":"2015-05-07","renewal_date":"2027-05-01","description":{"long":"Azul Systems is the world\\'s only company that is 100% focused on Java and Java runtime technology. We believe that we can help the IoT developers take advantage of the power and productivity of Java by reducing the frictions (licensing costs, field-of-use restrictions) and perceptions (footprint, etc.) gating widespread adoption of the language throughout the IoT.\nAs members of the Eclipse community we are bringing Zulu and Zulu Embedded - our 100% open source JDKs, to the IoT. Our Zulu products are certified builds of OpenJDK and meet the Java SE standards for Java 8, 7 and 6. Each release of Zulu and Zulu Embedded has passed the thousands of tests in OpenJDK Technology Compatibility Kit (TCK) as well as extensive in-house verification suite. Zulu runs on many Linux distros, on Windows and the Mac.\nZulu is a complete Java Development Kit, and Zulu Enterprise provides designers with a choice of storage footprint, bitness (32 or 64-bit configurations), headless or headful, and both development and runtime-only options.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1166-web.jpg"},"website":"https://www.azul.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1194,"name":"TypeFox GmbH","member_since":"2016-02-02","renewal_date":"2027-02-01","description":{"long":"TypeFox is a team of software pioneers building the languages and IDEs that modern engineering teams rely on. We’re the inventors behind open source projects such as Langium, Theia, Sprotty, and Open VSX — technologies that have become the backbone of custom development environments and domain-specific tooling across industries.\n\nWe help projects move from idea to working product with clarity and technical depth. Whether it’s a cloud-ready IDE, a tailored DSL, or a complex graph visualization, we build solutions that adapt to your workflows instead of the other way around. And because our technology base is open source, you benefit from extensible foundations designed for long-term impact."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1194-web.png"},"website":"https://www.typefox.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"d96a8cabd0d04f29dfe6","description":"Participant Member","level":"WGAPS","working_group":"cloud-development-tools"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"}],"is_active_member":true},{"organization_id":1196,"name":"Microsoft Corp.","member_since":"2016-01-15","renewal_date":"2026-06-01","description":{"long":"At Microsoft, our developer mission is to deliver experiences that empower any developer, building any application, on any OS. And this mission requires us to be open, flexible, and interoperable: to meet developers and development teams where they are, and provide tools, services and platforms that help them take ideas into production. Supporting the Eclipse Foundation enables us to collaborate more closely with the Eclipse community, deliver a great set of tools and services for all development teams, and continuously improve our cloud services, SDKs and tools."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1196-web.png"},"website":"https://www.microsoft.com/","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1208,"name":"Universitat Oberta De Catalunya","member_since":"2016-04-07","renewal_date":"2027-04-01","description":{"long":"

      A state-of-the art technological university with a highly innovative learning model, providing a benchmark for quality in both teaching and R&D. This is the philosophy of the Universitat Oberta de Catalunya (UOC, Open University of Catalonia), created in 1994 as one of the worlds very first completely online higher education establishments and that currently has more than 50,000 students.

      \\r\\n

      The UOCs core goal is to be the university of the knowledge society, promoting innovative education, personalised learning, technological leadership, R&D work on the information society and e-learning and the dissemination of knowledge. The UOC promotes R&D activities via 10 groups linked the Internet Interdisciplinary Institute (IN3), specialising in the study of the networked society and the knowledge economy, network technologies and specific software areas. Over the last five years, the UOC has participated in more than 260 R&D projects, either national or European. What is more, the UOC works to promote knowledge transfer and has, over the last four years, signed more than 1000 agreements to this end. The UOC forms part of more than 30 international networks, including the European University Association (EUA), the International Council for Open and Distance Education (ICDE) and the IMS Global Learning Consortium

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1208-web.png"},"website":"https://www.uoc.edu/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1219,"name":"Fondazione Bruno Kessler","member_since":"2016-10-04","renewal_date":"2026-10-01","description":{"long":"Fondazione Bruno Kessler - FBK - is a private no profit research institution based in Trento, Italy. \\r\\nFBK is divided in several centres and its mission is to develop both knowledge and expertise in the fields of Information and Communication Technology, Microsystems/Microelectronics and Social science, aiming to conduct technology transfer at the local, national and international industrial level. \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1219-web.png"},"website":"https://www.fbk.eu/en/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1220,"name":"Salesforce.com, Inc.","member_since":"2016-10-05","renewal_date":"2027-01-01","description":{"long":"Salesforce is a customer relationship management solution that brings companies and customers together. It\\'s one integrated CRM platform that gives all your departments including marketing, sales, commerce, and service a single, shared view of every customer."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1220-web.png"},"website":"https://opensource.salesforce.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1221,"name":"Webtide LLC","member_since":"2016-10-10","renewal_date":"2026-10-01","description":{"long":"Webtide was founded with one goal in mind: to provide the very best service and support for developer teams of all sizes who want to work with Eclipse Jetty and CometD. Whether your project is small or large, weve worked with companies around the world to make sure that their Jetty and CometD projects are a success.\\r\\n\\r\\nUnlike some other software companies, Webtides focus is on service, not on growth we value stability over size. We dont over-promise or under-deliver; our support is terrific and our products do just what they say theyll do. We have worked with some of the biggest names in technology and have a portfolio of satisfied customers. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1221-web.png"},"website":"https://webtide.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1228,"name":"OFFIS e.V","member_since":"2016-11-11","renewal_date":"2026-11-01","description":{"long":"Knowlegdge Transfer

      A fast knowledge transfer from research into the economy is the crucial foundation for the economic, as well as the social well-being of a country. We have made this transfer our task: As an associated institute of the Carl von Ossietzky University in Oldenburg, OFFIS has, since its formation in 1991, converted scientific know-how from computer science into prototypes which are then developed further into marketable products by commercial partners. Hereby, OFFIS provides research and prototype developments for companies and institutions and this at the highest international level."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1228-web.png"},"website":"https://www.offis.de/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1235,"name":"Deutsches Zentrum fuer Luft- und Raumfahrt e.V. (DLR)","member_since":"2017-01-02","renewal_date":"2027-01-01","description":{"long":"

      \\r\\nDLR is the national aeronautics and space research centre of the Federal Republic of Germany. Its extensive research and development work in aeronautics, space, energy, transport and security is integrated into national and international cooperative ventures. In addition to its own research, as Germanys space agency, DLR has been given responsibility by the federal government for the planning and implementation of the German space programme. DLR is also the umbrella organisation for the nations largest project management agency.\\r\\n

      \\r\\n

      \\r\\nDLR has approximately 8000 employees at 20 locations in Germany: Cologne (headquarters), Augsburg, Berlin, Bonn, Braunschweig, Bremen, Bremerhaven, Dresden, Goettingen, Hamburg, Jena, Juelich, Lampoldshausen, Neustrelitz, Oberpfaffenhofen, Oldenburg, Stade, Stuttgart, Trauen, and Weilheim. DLR also has offices in Brussels, Paris, Tokyo and Washington D.C.\\r\\n

      \\r\\n

      \\r\\nDLRs mission comprises the exploration of Earth and the Solar System and research for protecting the environment. This includes the development of environment-friendly technologies for energy supply and future mobility, as well as for communications and security. DLRs research portfolio ranges from fundamental research to the development of products for tomorrow. In this way, DLR contributes the scientific and technical expertise that it has acquired to the enhancement of Germany as a location for industry and technology. DLR operates major research facilities for its own projects and as a service for clients and partners. It also fosters the development of the next generation of researchers, provides expert advisory services to government and is a driving force in the regions where its facilities are located.\\r\\n

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1235-web.png"},"website":"https://www.dlr.de/DE/Home/home_node.html","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1238,"name":"Payara Services Limited","member_since":"2017-01-31","renewal_date":"2027-02-01","description":{"long":"Payara Server - Robust, Reliable, Supported\\r\\n

      \\r\\nPayara Server is a fully supported, developer-friendly, open source application server. Payara Servers architecture is innovative, cloud-native and optimized for production deployments.\\r\\n

      \\r\\nMonthly releases, bug fixes and a 10-year support lifecycle optimizes Payara Server for production deployments. Payara Server is aggressively compatible with common ecosystem components and ensures future compliance with Jakarta EE. \\r\\n

      \\r\\nThe application server, compatible with Eclipse MicroProfile, is built and supported by a team of DevOps engineers dedicated to the continued development and maintenance of the open source software and committed to optimizing Payara Server as the best option for production Java EE applications.\\r\\n

      \\r\\n

      \\r\\nPayara Micro - Small, Simple, Serious\\r\\n

      \\r\\nPayara Micro is the open source, lightweight middleware platform of choice for containerized Java EE (Jakarta EE) microservices deployments. Less than 70MB in size, Payara Micro requires no installation or configuration and no need for code rewrites so you can build and deploy a fully working app within minutes.\\r\\n

      \\r\\nCompatible with Eclipse MicroProfile, Payara Micro is the microservices-ready version of Payara Server. You can run war files from the command line without any application server installation. Automatic and elastic clustering makes Payara Micro ideal for running Java EE applications in a modern virtualized infrastructure.\\r\\n

      \\r\\nPayara Micro also comes with a Java API so it can be embedded and launched from your own Java applications.\\r\\n

      \\r\\n

      \\r\\nPayara Enterprise - Software. Security. Stability. Support.\\r\\n

      \\r\\nPayara Enterprise lets you decide when to migrate from one release to the next with a 10-year support lifecycle and access to extra release streams. Youll maintain the security and stability of your applications environment from the JVM on up.\\r\\n

      \\r\\nOur global engineers go beyond the support help desk, offering fast issue resolution and 24-hour support options for your production Payara Server environment, while also giving customers priority on bug fixes and new features requests.\\r\\n

      \\r\\nPayara Enterprise customers enjoy a choice of 105 or 247 support, unlimited tickets, access to a private customer knowledge base and use of fully-supported builds of OpenJDK through our partnership with Azul."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1238-web.png"},"website":"https://www.payara.fish/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1239,"name":"SSI Schaefer IT Solutions GmbH","member_since":"2017-02-09","renewal_date":"2027-02-01","description":{"long":"

      The SSI Schaefer Group is the worlds leading provider of modular warehousing and logistics solutions. It employs approximately 10,500 people at its group headquarters in Neunkirchen (Germany), at more than ten domestic and international production sites, and at approximately 70 worldwide operative subsidiaries. Across six continents, SSI Schaefer develops and implements innovative industry-specific answers to its customers unique challenges. As a result, it plays a key role in shaping the future of intralogistics.

      \\r\\n\\r\\n

      SSI Schaefer designs, develops and manufactures systems for warehouses, industrial plants, workshops and offices. Its portfolio includes manual and automated solutions for warehousing, conveying, picking and sorting, plus technologies for waste management and recycling. In addition, SSI Schaefer is now a leading provider of modular, regularly updated software for in-house material flows. Its IT team, with a headcount in excess of 1,100, develops high-performance applications, and provides customers with in-depth advice on the intelligent combination of software with intralogistics equipment. SSI Schaefers broad IT offering, including its own WAMAS and SAP products, delivers seamless support for all warehouse and material flow management processes. Solutions from SSI Schaefer improve the productivity and efficiency of customer organizations not least through the highly precise monitoring, visualization and analysis of operational metrics for proactive intralogistics management.

      \\r\\n\\r\\n

      SSI Schaefer offers highly sophisticated, turnkey systems. As an international player, it can deliver one-stop solutions to all four corners of the earth. Its comprehensive portfolio encompasses design, planning, consulting, and customer-specific aftersales services and maintenance.

      \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1239-web.png"},"website":"https://www.ssi-schaefer.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Strategic Member","level":"WGSD","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1244,"name":"Associacao de Usuarios da Tecnologia Java, SouJava","member_since":"2017-03-14","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1244-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1246,"name":"PTA GmbH","member_since":"2017-04-10","renewal_date":"2027-04-01","description":{"long":"The range of services of the PTA GmbH meets the requirements of digitalization for companies in various industries (ranging from process management, ERP, CRM and industry systems to the development of individual software and hosting solutions \\\"Made in Germany\\\" as well as IT security). Since 1969, the PTA Group has been working with more than 400 employees for long-term customer and employee relationships and is distinguished by its independence from capital markets and manufacturers as a family-run company."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1246-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1248,"name":"Tomitribe Corporation","member_since":"2017-05-01","renewal_date":"2027-05-01","description":{"long":"It\\'s Tomitribe\\'s mission to provide support for consumers, educate people on TomEE, Open Source and Java EE and contribute to the success of everyone in the community. We believe Open Source is an ecosystem and everyone in that ecosystem has a role to play, from the people who produce it to the companies who use it.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1248-web.png"},"website":"https://tomitribe.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Strategic Member","level":"WGSD","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1251,"name":"M3S Research Unit at the University of Oulu","member_since":"2017-06-06","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1251-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1269,"name":"Calypso Networks Association","member_since":"2017-12-20","renewal_date":"2027-01-01","description":{"long":"Calypso technology has been designed to ensure interoperability between transportation networks equipments and is open to all manufacturers providers. It has been deployed for 20 years in 25 countries without any hacking reported since now and work with any kind of NFC portable objects: Smart Cards, Secures elements, Sim cards or HCE in Smart Phones.\\r\\n\\r\\nCNA is established in Brussels and has been founded in 2003, with the founder members of the european Calypso project : \\r\\nOTLIS, Ticketing operator of Lisbon\\r\\nACTV, Transport operator of Venice\\r\\nSTIB, Transport operator of Brussels\\r\\nLKRKN, Landrat of Constance\\r\\nRATP, Transport operator of Paris area\\r\\nSNCF, French national trainrail\\r\\n\\r\\nCNA is open to all actors playing a role in the Calypso environment, whether they are user of Calypso or a provider of Calypso. CNA has 80 active members and its main objectives are to define and direct the reference specifications, to implement a certification policy, to guarantee the compatibility of all current and future product, to establish a Calypso label issued by an independent organization, to promote Calypso to operators and manufacturers to yield its distribution, to contribute to the international standardization process, to facilitate and harmonize the shared members\\' needs and expriences. \\r\\n\\r\\nCNA is currently working on developping a full open source SDK for generic contactless Ticketing, which provides a library functions to developers, manages security and masks the complexity of a Calypso transaction.\\r\\n\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1269-web.png"},"website":"https://www.calypsonet-asso.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1286,"name":"Kynetics","member_since":"2018-03-21","renewal_date":"2027-04-01","description":{"long":"Kynetics offers a suite of Android and Linux operating systems (OS) for embedded systems, featuring popular application processors from NXP, Qualcomm, Mediatek and NVIDIA.\nKynetics empowers embedded system providers and manufacturers by offering a also comprehensive suite of products on top of its engineering services.\nDevelopment Tools for extending and simplifying the development and deployment process, allowing engineers to focus on core functionalities of their embedded applications.\nUpdate Factory enables secure and efficient remote updates and management of remote devices. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1286-web.png"},"website":"https://www.kynetics.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Innovator Member","level":"WGPAA","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1308,"name":"The Cloud Native Computing Foundation","member_since":"2018-04-26","renewal_date":"2027-05-01","description":{"long":"Cloud native technologies empower organizations to build and run\\r\\nscalable applications in modern, dynamic environments such as public,\\r\\nprivate, and hybrid clouds. Containers, service meshes, microservices,\\r\\nimmutable infrastructure, and declarative APIs exemplify this\\r\\napproach.\\r\\n\\r\\nThese techniques enable loosely coupled systems that are resilient,\\r\\nmanageable, and observable. Combined with robust automation, they\\r\\nallow engineers to make high-impact changes frequently and predictably\\r\\nwith minimal toil.\\r\\n\\r\\nThe Cloud Native Computing Foundation seeks to drive adoption of this\\r\\nparadigm by fostering and sustaining an ecosystem of open source,\\r\\nvendor-neutral projects. We democratize state-of-the-art patterns to\\r\\nmake these innovations accessible for everyone."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1308-web.png"},"website":"https://www.cncf.io/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1309,"name":"London Jamocha Community","member_since":"2017-01-09","renewal_date":"2027-05-01","description":{"long":"The LJC is a broad community of technologists and other associate with Java and JVM related technologies. Although it is based in London, UK - it has strong international membership due to its global programmes (such as Adopt a JSR and Adopt OpenJDK).\\r\\n\\r\\nThe LJC hosts regular events including:\\r\\n\\r\\n
        \\r\\n
      • Casual catch-ups in a cafe
      • \\r\\n
      • Hack days, evening talks
      • \\r\\n
      • un-conferences
      • \\r\\n
      • workshops
      • \\r\\n
      • mentoring
      • \\r\\n
      • demo days
      • \\r\\n
      • career mentoring by Londons Java specialists
      • \\r\\n
      • and much more!
      • \\r\\n
      \\r\\n\\r\\nThe LJC acts as a voice for Java engineers in London UK as well as globally. This includes but is not limited to helping run a build farm for Java, representing Java developers worldwide on the JCP (aka the Java standards body) as well as the Jakarta EE and MicroProfile communities."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1309-web.png"},"website":"https://www.meetup.com/Londonjavacommunity/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1310,"name":"Cirrus Link Solutions , LLC","member_since":"2018-05-01","renewal_date":"2027-05-01","description":{"long":"Cirrus Link Solutions provide secure and reliable IIOT software solutions enabled with MQTT that integrates process information throughout the organization bridging the IT / OT gap while supplying a superior OT solution. \\r\\n

      \\r\\nWith over 30 years of SCADA and Telemetry experience and the co-inventor of MQTT where M2M and IoT started, Cirrus Links understands the technology requirements to help companies achieve their business objectives. Our experiences and ingenuity has been integral in developing the technology to enable and effectively manage data assets for real-time controls to big data analytics for AI and predictive maintenance. We pride ourselves with our software delivering real solutions for IIOT and SCADA that are tried, tested and ready for production today.\\r\\n

      \\r\\nCirrus Link puts your business data to work faster and smarter. Break out of the information silo created by traditional software and use machines to share in real time with anyone in your company. With Cirrus Link machine to machine (M2M) technology, your people get on-time, real-time access to critical information. Allowing your business can make more informed, smarter decisions.\\r\\n

      \\r\\nLearn more at www.cirrus-link.com"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1310-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1312,"name":"Istanbul JUG","member_since":"2018-05-02","renewal_date":"2027-05-01","description":{"long":"The JUG IST acts as a voice for software engineers in Turkey as well as globally. The JUG Istanbul is a non-profit, big community of technologists associated with Java and JVM related technologies based in Istanbul, Turkey. List of our activities;\\r\\n\\r\\n

      \\r\\n
        \\r\\n
      • JavaDay Istanbul
      • \\r\\n
      • meetups, evening talks
      • \\r\\n
      • un-conferences
      • \\r\\n
      • workshops
      • \\r\\n
      • mentoring
      • \\r\\n
      • coding sessions
      • \\r\\n
      \\r\\n

      \\r\\nand much more!\\r\\n\\r\\nTwitter: @jug_istanbul\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1312-web.png"},"website":"https://www.jugistanbul.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1317,"name":"Inductive Automation","member_since":"2018-06-08","renewal_date":"2026-06-01","description":{"long":"Inductive Automation creates industrial software that empowers organizations to swiftly turn great ideas into reality by removing all technological and economic obstacles. \\r\\n\\r\\nBy cross-pollinating IT with SCADA technologies, Inductive Automation created Ignition software, the first universal industrial application platform with unlimited potential. Ignition empowers industrial organizations around the world and in virtually every industry, with an outstanding software platform and top-notch support."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1317-web.png"},"website":"https://inductiveautomation.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1319,"name":"Karakun AG","member_since":"2018-07-04","renewal_date":"2026-07-01","description":{"long":"Karakun is a growing team of very experienced software engineers developing agilely custom solutions for enterprises offering an optimal user experience. This includes portals (B2E, B2B, B2C), dashboards, and specialized solutions for numerous industries.\\r\\n\\r\\nOur offering includes full-stack development of custom software solutions especially for the cloud. Consequently, we are also engaging with activities around Jakarta EE.\\r\\n\\r\\nWe especially deliver platforms and applications for the integrated management of measurement data to our customers. Therefore, we are contributing to the openMDM working group (https://www.openmdm.org/) and its associated projects.\\r\\n\\r\\nAnd, finally, Karakun offers technology and solutions for semantic enterprise search with high security requirements."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1319-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1320,"name":"Liferay International Limited","member_since":"2025-05-06","renewal_date":"2027-05-01","description":{"long":"Liferay makes software that helps companies create digital experiences on web, mobile and connected devices. Our platform is open source, which makes it more reliable, innovative and secure. We try to leave a positive mark on the world through business and technology. Hundreds of organizations in financial services, healthcare, government, insurance, retail, manufacturing and multiple other industries use Liferay."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1320-web.png"},"website":"https://www.liferay.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1321,"name":"iJUG Interessenverbund der Java-User Groups e V","member_since":"2018-07-10","renewal_date":"2026-07-01","description":{"long":"The interest group of Java User Groups iJUG e.V. is a coalition of approximately 40 Java User Groups from Germany, Switzerland and Austria. The organization promotes the common interests of its members to developers, manufacturers, distributors and the general public."},"logos":{"print":"https://membership.eclipse.org/organization/images/1321-print.eps","web":"https://membership.eclipse.org/organization/images/1321-web.png"},"website":"https://www.ijug.eu/en/home/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Participant Member","level":"WGAPS","working_group":"adoptium"},{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1329,"name":"Advantest Europe GmbH","member_since":"2018-08-10","renewal_date":"2026-08-01","description":{"long":"A world-class technology company, Advantest is the leading producer of automatic test equipment (ATE) for the semiconductor industry and a premier manufacturer of measuring instruments used in the design and production of electronic instruments and systems. Its leading-edge systems and products are integrated into the most advanced semiconductor production lines in the world. The company also focuses on R&D for emerging markets that benefit from advancements in nanotech and terahertz technologies, and has introduced multi-vision metrology scanning electron microscopes essential to photomask manufacturing, as well as groundbreaking 3D imaging and analysis tools. Founded in Tokyo in 1954, Advantest established its first subsidiary in 1982, in the USA, and now has subsidiaries worldwide. More information is available at www.advantest.com."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1329-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1330,"name":"kuehn & weyh Software GmbH","member_since":"2018-09-01","renewal_date":"2026-09-01","description":{"long":"kwsoft is a medium-sized software manufacturer and solution provider, with corporate headquarters in Freiburg, Germany.\\r\\n

      \\r\\nThe CCM solution Serie M/ enables high-quality customer communication that is precisely tailored to the recipient in terms of content, form and medium. The solution gives administrators the greatest possible control over their document processes because it offers a standardized solution from a single vendor - from document composition and creation to multichannel output management."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1330-web.png"},"website":"https://kwsoft.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1339,"name":"OpenDevise Inc","member_since":"2018-12-29","renewal_date":"2027-01-01","description":{"long":"

      OpenDevise helps organizations achieve faster growth through better documentation.

      \\r\\n

      OpenDevise: Tools. Workflows. Information Architecture.

      \\r\\n

      We develop automated tools and build processes that take the complexity, human effort, and anxiety out of deploying documentation sites. OpenDevise is the creator of Antora, a documentation site generator that enables technical writers to create, manage, remix, and publish documentation sites from AsciiDoc-based content sourced from a selection of versioned content repositories.

      \\r\\n

      DevOps for Documentation Teams

      \\r\\n

      We upgrade documentation teams to a modern, agile workflow for creating, reviewing, testing, and publishing documentation composed in the lightweight markup language AsciiDoc. As the maintainers of the leading AsciiDoc processor, Asciidoctor, we have a deep understanding of how to best integrate and adapt AsciiDoc into your documentation teams workflow. OpenDevise helps teams save time, minimize risk, and increase their writing and publishing productivity. A few of the ways we assist are through toolchain configuration, publishing pipeline architecture, UI design, and extension development.

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1339-web.png"},"website":"https://opendevise.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"df911e0adcad1a1c51df","description":"","level":"WGPL","working_group":"asciidoc"}],"is_active_member":true},{"organization_id":1345,"name":"Linux Foundation","member_since":"2019-04-02","renewal_date":"2027-04-01","description":{"long":"Founded in 2000, the Linux Foundation is supported by more than 1,000 members and is the worlds leading home for collaboration on open source software, open standards, open data, and open hardware. Linux Foundations projects are critical to the worlds infrastructure including Linux, Kubernetes, Node.js, and more. The Linux Foundations methodology focuses on leveraging best practices and addressing the needs of contributors, users and solution providers to create sustainable models for open collaboration. For more information please visit us at www.linuxfoundation.org."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1345-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1349,"name":"Eteration A.S","member_since":"2019-05-31","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1349-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1352,"name":"AVL List GmbH","member_since":"2019-06-17","renewal_date":"2026-07-01","description":{"long":"AVL is the world\\'s largest independent company for the development, simulation and testing of powertrain systems (hybrid, combustion engine, transmission, electric drive, batteries, fuel cell and control technology) for passenger cars, commercial vehicles, construction, large engines and their integration into the vehicle. The company has decades of experience in the development and optimization of powertrain systems for all industries. As a global technology leader, AVL provides complete and integrated development environments, measurement and test systems as well as state-of-the-art simulation methods. As a pioneer in the field of innovative solutions, such as diverse electrification strategies for powertrains, AVL is increasingly taking on new tasks in the field of autonomous driving, especially on the basis of subjective human sensations (driveability, connectivity, ADAS, etc.). In the competition of technologies internal combustion engine, battery/electric drive and fuel cell and their combinations, AVL is working intensively and with the same priorities. AVL has digitized the vehicle development process with state-of-the art and highly scalable IT, software and technology platforms, and creates new customer solutions in the areas of big data, artificial intelligence, simulation and embedded systems in an agile and integrated development environment."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1352-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1367,"name":"Information Systems & Databases (DBIS,Informatik 5) of RWTH Aachen University","member_since":"2024-03-12","renewal_date":"2027-03-01","description":{"long":"Across the world and for many decades, the Laboratory for Machine Tools and Production Engineering (WZL) of RWTH Aachen University has stood for successful and forward-thinking research and innovation in the area of production engineering.\\r\\n\\r\\nUnder the leadership of four professors, Thomas Bergs, Christian Brecher, Robert Schmitt and Guenther Schuh, the WZL is conducting research in six areas - production technology, machine tools, production systems, transmission technology, production metrology and quality management - on the future-oriented design of production in high-wage countries. \\r\\n\\r\\nTogether with industry partners from various sectors, the WZL develops solutions for a wide variety of production scenarios in both publicly funded and bilateral projects. \\r\\n\\r\\nThese activities are being consolidated on the RWTH Aachen Campus in the Cluster Production Engineering."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1367-web.png"},"website":"https://www.wzl.rwth-aachen.de/go/id/sijq/?lidx=1","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1374,"name":"Lulea University of Technology","member_since":"2019-09-25","renewal_date":"2026-10-01","description":{"long":"Lule University of Technology is experiencing strong growth with world-leading competence in several areas of research. Our research is conducted in close collaboration with industries such as Bosch, Ericsson, Scania, LKAB, SKF and leading international universities. Lule University of Technology has a total turnover of 190M per year. We currently have 1800 employees and 16 500 students.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1374-web.png"},"website":"https://www.ltu.se/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1376,"name":"Cedalo GmbH","member_since":"2019-10-07","renewal_date":"2026-10-01","description":{"long":"Streamsheets are a powerful no-code platform to build applications for industrial automation, connectivity and event stream processing.\\r\\n\\r\\nThanks to the familiar spreadsheet user interface also non-programmers create full-fledged applications and services to process data from machines, sensors, apps, APIs and more. With Streamsheets users build customized digital solutions on the edge, on-premises and in the cloud. \\r\\n\\r\\nThe Mosquitto Project is one of the most popular Message Brokers and highly suitable for a broad range of application areas in the Internet of Things and beyond."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1376-web.png"},"website":"https://cedalo.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1380,"name":"Huawei Technologies Co., LTD.","member_since":"2015-06-23","renewal_date":"2026-10-01","description":{"long":"Huawei is a leading global information and communications technology (ICT) solutions provider. Driven by a commitment to sound operations, ongoing innovation, and open collaboration, we have established a competitive ICT portfolio of end-to-end solutions in telecom and enterprise networks, devices, and cloud technology and services. Our ICT solutions, products, and services are used in more than 170 countries and regions, serving over one-third of the world\\'s population. With more than 180,000 employees, Huawei is committed to enabling the future information society, and building a Better Connected World."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1380-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Strategic Member","level":"WGSD","working_group":"oniro"}],"is_active_member":true},{"organization_id":1382,"name":"Software Institute, Università della Svizzera italiana","member_since":"2019-11-26","renewal_date":"2026-12-01","description":{"long":"At the Software Institute, we discover, design, and develop new ideas that ease the conception of modern software systems. Our research is rooted both in sound theoretical models as well as practical, real-life questions that impact modern society."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1382-web.png"},"website":"https://si.usi.ch","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1383,"name":"Bird Software Solutions Ltd","member_since":"2019-11-27","renewal_date":"2026-12-01","description":{"long":"BIRD Software Solutions Ltd provides solutions and consultancy to support the use of the Banks Integrated Reporting Directory (BIRD) project which is managed by the European Central Bank. (https://www.ecb.europa.eu/stats/ecb_statistics/co-operation_and_standards/reporting/html/bird_dedicated.en.html ) "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1383-web.png"},"website":"https://www.birdsoftwaresolutions.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1384,"name":"CANARY LABS INC.","member_since":"2019-12-03","renewal_date":"2026-12-01","description":{"long":"Considering most operations have thousands (if not hundreds of thousands) of data points, how you collect and store your data is vitally important to your success.\\r\\n\\r\\nAt Canary, we believe making your data easy to store and recall makes you more successful. We\\'ve spent over 20 years building a time series database that sets the standard in any industry.\\r\\n\\r\\nThe Canary System allows you to:
      \\r\\n\\r\\nCollect and store billions of data values.
      \\r\\nSpend less time on database management.
      \\r\\nNever worry about performance or losing your data.
      \\r\\n\\r\\nPaired with the MQTT Sparkplug B protocol, you can easily scale your organization from just few tags to millions without spending months of man hours."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1384-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1387,"name":"DENSO AUTOMOTIVE Deutschland GmbH","member_since":"2019-12-16","renewal_date":"2027-01-01","description":{"long":"DENSO AUTOMOTIVE Deutschland GmbH is a subsidiary of DENSO Corporation which is a global automotive supplier company."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1387-web.png"},"website":"https://www.denso.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1390,"name":"OSB Alliance- Bundesverband für digitale Souveränität e.V.","member_since":"2020-01-01","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1391,"name":"TmaxSoft Co., Ltd","member_since":"2020-02-01","renewal_date":"2027-02-01","description":{"long":"TmaxSoft was founded on the principle that there is always a better way. Nothing will stop us from creating better solutions that improve your business in ways that other companies cant. Or wont. A global software innovator focused on cloud, infrastructure and legacy modernization, we give you the freedom to take control of your technology. Our complete stack of software solutions help you efficiently manage and fully leverage your critical data. This provides global IT customers with software-defined mainframe rehosting, middleware and RDBMS technology that enables IT to actively and effectively contribute to achieving business objectives. With our remarkable technology, fresh perspective, collaborative spirit, and unusual clarity and transparency, youll finally have the choice you deserve. Along with freedom from status quo technology, more opportunities and faster ways to innovate, reduced risk of change, greater cost savings, and a better customer experience. \\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1391-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1397,"name":"Kingdee Apusic Cloud Computing Co.,Ltd","member_since":"2020-02-15","renewal_date":"2027-02-01","description":{"long":"Kingdee Apusic cloud computing Co., Ltd. was founded in 2000, formerly known as Kingdee middleware Co., Ltd., which is a subsidiary of Kingdee group and a member of China Electronics Technology Group Taiji Co., Ltd. It is a key software enterprise in the national planning and layout and a leading cloud service provider of digital government, basic software service provider, and public financial management software service provider of China."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1397-web.png"},"website":"https://www.apusic.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1399,"name":"NEC Corporation","member_since":"2021-10-14","renewal_date":"2026-08-01","description":{"long":"NEC provides products for business, ranging from terminals to network and computer equipment, software products and service platforms, as well as integrated platforms based on them. We deliver labor-saving and efficient platforms for customers, while at the same time creating new value such as IoT platforms based on ICT as we contribute to the expansion of solutions for society."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1399-web.png"},"website":"https://www.nec.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1401,"name":"Primeton Information Technologies, Inc","member_since":"2020-02-18","renewal_date":"2027-03-01","description":{"long":"Primeton was established on March 36, 2003 and changed from a limited liability company to a joint stock company in 2010. The company has obtained a number of national honor certifications, such as National Enterprise Technology Center, Postdoctoral Research Station, and continuously passed the International Software Capability Maturity Model Integration (CMMI) Level 5 Certification and ISO9001 Quality Management System Certification. It has mastered 41 key and major core technologies and a number of reserve technologies in the field of software foundation platforms, 27 invention patents and172 software copyrights. The company participated in two important SOA international technical specifications of SCA / SDO and 11 national technical standards Formulation.\\r\\nPrimeton is a professional software foundation platform provider. It provides independent, controllable, safe and reliable software foundation platforms and application software development services for large and medium-sized users in the financial, government, energy, telecommunications, manufacturing and other industries.\\r\\nSince its establishment, the company has continued to cultivate the field of software foundation platforms. After more than ten years of technology and experience, it has established a \\\"standard product + platform customization + application development\\\" business model, which includes the sales and maintaining service of standard software products of the software foundation platform, platform customization and application development services.\\r\\nPrimeton has been committed to the construction of independent research and development and innovation capabilities of the core technology of the software foundation platform. It has created a component-based technology platform and core technology combination, and formed a systematic technology research and development capability, the platformized capability of product development and comprehensive project implementation methodology. Based on core technologies and innovation capabilities, Primeton provides customers with software products and technical services, helping customers flexibly and quickly respond to complex and changing business scenarios and successfully achieve business transformation under new generation information technologies such as cloud computing and big data.\\r\\nAfter more than ten years of focused development, Primeton enjoys high brand awareness in the field of software foundation platforms. In 2018, there were 120 Chinese companies in the Fortune Global 500, 44 of which chose Primeton Informations software platform products or technical solutions. The technical performance, maturity and safety and reliability of the company\\'s products and technical solutions have been verified in thousands of large-scale and key projects in national economic key areas such as finance, government affairs, energy, telecommunications, and manufacturing. Primeton has a China Registration and Clearing Corporation , Shanghai Gold Exchange, China Mobile, General Administration of Customs and other large and medium-sized customers in the industry are all Primetons regular customers. Primeton has gradually changed the absolute dominant position of international brands in the domestic software infrastructure platform market."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1401-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1405,"name":"Barcelona Supercomputing Center (BSC)","member_since":"2020-03-05","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1405-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1409,"name":"Futurewei Technologies, Inc.","member_since":"2020-03-06","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1409-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Silver Member","level":"WGHLP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1423,"name":"University of Bologna","member_since":"2021-10-14","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1423-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1427,"name":"openKONSEQUENZ eG","member_since":"2020-03-09","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1427-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1428,"name":"Alibaba Cloud","member_since":"2020-05-01","renewal_date":"2027-05-01","description":{"long":"As a business unit of Alibaba Group (NYSE: BABA), Alibaba Cloud provides a comprehensive suite of global cloud computing services to power both our international customers online businesses and Alibaba Groups own e-commerce ecosystem. In January 2017, Alibaba Cloud became the official Cloud Services Partner of the International Olympic Committee.\\r\\nBy harnessing, and improving on, the latest cloud technology and security systems, we tirelessly work towards our vision - to make it easier for you to do business anywhere, with anyone in the world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1428-web.png"},"website":"https://www.alibabacloud.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1434,"name":"Polytechnique Montreal","member_since":"2020-03-27","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1434-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1436,"name":"ETH Zurich","member_since":"2020-04-02","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1436-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1437,"name":"Broadcom","member_since":"2008-02-28","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1437-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1441,"name":"Topio Networks","member_since":"2020-04-28","renewal_date":"2027-05-01","description":{"long":"Topio Networks, an industry research platform, \\r\\naccelerates markets and businesses by providing \\r\\ndetailed information about use cases, verticals \\r\\nand industries. \\r\\n\\r\\nTopio Networks offers detailed data insights and natural language analysis about the shape, structure and sizing of the thousands of use cases, verticals and \\r\\ntechnologies that are the building blocks of the fourth \\r\\nindustrial revolution. Our data is constantly fed by \\r\\nthe daily insights generated by our taxonomy driven, \\r\\nhuman curated AI Platform. \\r\\n\\r\\nThe Topio Networks Market Intelligence Center provides free access to our industry research with detailed data about market sizing, innovations, funding and marketing activities for each specific use cases, industries and emerging technologies. \\r\\n\\r\\nIn addition, Topio Networks offers acceleration \\r\\nservices to businesses by providing the content \\r\\nnecessary to develop their go to market strategies, by \\r\\ntracking the company content and mapping it to the \\r\\nbest practices of the industry and providing market \\r\\naccess through events and lead generation.\\r\\nTo learn more about how Topio Networks applies \\r\\nAI and Natural Language Processing to create \\r\\ncomprehensive research about thousands of use \\r\\ncases,"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1441-web.png"},"website":"https://www.topionetworks.com","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1442,"name":"Chevron Technical Center","member_since":"2020-04-29","renewal_date":"2027-05-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1442-web.png"},"website":"https://www.chevron.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1443,"name":"Open Source Robotics Foundation","member_since":"2020-05-06","renewal_date":"2027-05-01","description":{"long":"We offer robotics R&D, consulting, custom engineering, and application development services to industry and government. We work with companies large and small and public agencies around the world. Whether you want to learn more about Gazebo, need to streamline your ROS-based product development, or are looking for a partner for your next R&D program, we\\'re here to help. The unifying theme of our team and our work is openness. We use and we build open systems. To the greatest extent possible, we freely distribute our work product, whether software, hardware, or documentation, under an open source license."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1443-web.png"},"website":"https://www.openrobotics.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1451,"name":"Institut für angewandte Systemtechnik Bremen Gmbh","member_since":"2020-06-18","renewal_date":"2026-06-01","description":{"long":"What is ATB?
      \\r\\nATB is an application oriented research institute founded jointly by the Free Hanseatic City of Bremen and several leading industrial enterprises in Bremen area in 1991.\\r\\n

      \\r\\nATB is a part of the long-term strategy of the Free Hanseatic City of Bremen to sustain economy in northern Germany and, particularly, in Bremen by strengthening innovation potentials of industrial enterprises and other organisations.\\r\\n

      \\r\\nATB is a highly innovative and efficient technology centre providing system technology related services to a wide spectrum of enterprises and organisations, thereby increasing their ability to remain competitive. ATB has developed into a dynamically expanding research institute operating successfully on the national, European and world-wide market and offering to partners a high level of expertise in several technological domains.\\r\\n

      \\r\\nWhat does ATB offer?
      \\r\\nATB offers\\r\\n

        \\r\\n
      • services in process/product innovation activities based on advanced Information and Communication Technology solutions
      • \\r\\n
      • flexibility of a dynamic, performance and application oriented research institute
      • \\r\\n
      • remarkable competencies in both
      • \\r\\n
          \\r\\n
        • technical and research domains
        • \\r\\n
        • management of complex technical projects
        • \\r\\n
        \\r\\n
      • High expertise in several domains based on effective team-building of staff members with long-term experience and agile young researchers
      • \\r\\n
      \\r\\nThe basis for all projects is a cooperative partnership with clients, allowing for a collaborative and effective approach to achieve the clients innovation targets.\\r\\n
      \\r\\nATB provides its services within:\\r\\n
        \\r\\n
      • Application oriented research projects supported by regional, national, European and other international funding schemes
      • \\r\\n
      • Direct research projects with clients
      • \\r\\n
      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1451-web.png"},"website":"https://www.atb-bremen.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1453,"name":"University of Oslo, Dept of Informatics","member_since":"2020-07-07","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1458,"name":"Beijing Tongtech Co., Ltd","member_since":"2020-07-21","renewal_date":"2026-08-01","description":{"long":"Beijing Tongtech Co., Ltd (Tongtech) is an industry leading infrastructure software and IT solutions provider. With its state of the art technology and products, Tongtech provides its customers with a complete family of application infrastructure products ranging from middleware, information security solutions to intelligent transportation system (ITS) solutions. Over the years, Tongtechs products and solutions has helped its customers leverage the power of internet to upgrade their businesses in a safe and effective manner.\\r\\n\\r\\nTongtech has been named as one of the \\\"National Key Software Enterprises\\\" for 12 consecutive years, and was granted AAA credit ratings by the Ministry of Commerce as well as the State-owned Asset Supervision and Administration Commission of the State Council (SASAC). In the field of technology, Tongtech is the core member of the Java Community Process Program (JCP) and the National Information Technology Standardization Committee, and has participated in developing industry standards for JavaEE, SOA/middleware, IEC smart city and other international and domestic standards organizations. Our company is also a research center for Major National Science and Technology Programs and has won the \\\"National Science and Technology Progress Award\\\" granted by the State Council for our achievements and efforts.\\r\\n\\r\\nAs a pioneer in the middleware software industry, our software products and solutions are widely used in all kinds of industries in China, with more than 2,000 enterprise users spreading across industries such as finance, communication, government, energy, and transportation. Tongtech also enjoyed good partnership with 500 partners."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1458-web.png"},"website":"https://www.tongtech.com/sy.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1465,"name":"RIOS Lab","member_since":"2020-09-18","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1465-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1469,"name":"Atlanta Java Users Group, Inc","member_since":"2020-10-05","renewal_date":"2026-10-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1469-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Corporate Member","level":"abcde","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1473,"name":"Circuitsutra Technologies Pvt Ltd","member_since":"2020-10-19","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1473-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1474,"name":"Apex.AI, Inc","member_since":"2020-10-19","renewal_date":"2026-11-01","description":{"long":"Apex.AI was founded in 2017 in Palo Alto to build robust, reliable, safe, secure, and certified software for autonomous mobility systems. \\r\\n
      \\r\\n\\r\\nCore products:\\r\\n
      \\r\\n1. Apex.Grace is a runtime software environment, which is built on ROS 2 (Robot Operating System) and provides a production-grade safety-certified realtime framework for developing safe and secure applications. \\r\\n
      \\r\\n2. Apex.Ida is a highly optimized communication middleware based on Eclipse iceoryx and Eclipse Cyclone DDS"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1474-web.png"},"website":"https://www.apex.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1476,"name":"Data In Motion Consulting GmbH","member_since":"2020-11-10","renewal_date":"2026-11-01","description":{"long":"

      Founded in 2010, in Jena (Thuringia, Germany), Data In Motion Consulting GmbH provides a strong consolidated experience in the fields of Modeling, Software Engineering, Architecture and Consulting.

      \\r\\n

      We assist our customers in the development of their projects, guiding them trough the whole process, while providing them with the required strategies and tools to be able to \\\"walk on their own\\\" in the future.

      \\r\\n

      Our skill set goes from the more technical expertise in model-driven software development and architecture, data analysis and independent R&D, to more managerial experience in project and product management, and moderation of the whole business process.

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1476-web.png"},"website":"https://www.datainmotion.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1480,"name":"AICAS GmbH","member_since":"2020-11-30","renewal_date":"2027-01-01","description":{"long":"aicas embraces the mission to bring intelligence to devices and unlock realtime data. The international high-tech company creates embedded IoT and edge-to-cloud solutions.\n\nAcross the globe, aicas connects over 25 million devices and vehicles to the cloud, simplifying access and control of edge devices and their data. Large industrial companies and leading automotive manufacturers use aicas EdgeSuite and JamaicaVM to master their digital transformation and open up new business models.\n\nCreating, deploying and operating edge-to-cloud solutions: aicas makes it happen. \nFast. Simple. Reliable."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1480-web.png"},"website":"https://www.aicas.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"}],"is_active_member":true},{"organization_id":1481,"name":"Beijing Thunisoft Information Technology Co., Ltd","member_since":"2020-11-30","renewal_date":"2026-12-01","description":{"long":"Thunisoft adheres to the enterprise spirit of \\\"Self-discipline and Social Commitment\\\", adheres to the values of honesty and integrity, takes \\\"Continuous innovation,to serve for customers\\' success\\\" as its mission, focuses on software and information services, providing customers with a full range of solutions and services for their informatization business, and is your trusted expert in intelligent information services."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1481-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1482,"name":"Makewave AB","member_since":"2020-12-09","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1482-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Strategic Member","level":"WGSD","working_group":"osgi"}],"is_active_member":true},{"organization_id":1485,"name":"Garden State Java User Group (GSJUG)","member_since":"2021-01-06","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1485-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Guest Member","level":"WGSAP","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1486,"name":"The Johns Hopkins University","member_since":"2021-01-11","renewal_date":"2026-11-01","description":{"long":"Founded in 1876 as the nation’s first research university, Johns Hopkins has been advancing knowledge and bringing discoveries to the world for nearly 150 years."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1486-web.png"},"website":"https://www.jhu.edu/about/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1487,"name":"Shandong Cvicse Middleware Co.,Ltd","member_since":"2021-01-11","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1487-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Enterprise Member","level":"WGDSA","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1488,"name":"SignalFire Telemetry ","member_since":"2021-01-18","renewal_date":"2027-01-01","description":{"long":"The SignalFire wireless platform is offered with 900Mhz or with LTE-M1 for flexibility and cost effectiveness. The architecture provides for long-range wireless networks designed for remote monitoring and control in challenging outdoor environments. The nodes are integrated with a variety of sensors to work with level, pressure, temperature and flow meters, as well as offering critical asset control of valves, pumps, fans, heaters and an array of other devices.\\r\\n\\r\\nThe SignalFire wireless system has been deployed in thousands of installations in oil & gas fields and pipelines, petrochemical processing plants, crop and irrigation monitoring systems, transportation monitoring systems, and municipal infrastructure monitoring and control systems, as well as a variety of other applications.\\r\\n\\r\\nOur nodes can provide both communications and power to your sensors, making your application truly wireless. A wide range of sensor types are compatible, including 4-20 mA, 1.5V, Modbus, Hart, Digital I/O and other analog and digital interfaces.\\r\\n\\r\\nTo find out more, contact SignalFire and tell us about your toughest monitoring and control challenge."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1488-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1489,"name":"Netherlands Organisation for applied scientific research TNO","member_since":"2021-01-21","renewal_date":"2027-02-01","description":{"long":"

      About TNO

      \\r\\n

      The Netherlands Organization for Applied Scientific Research (TNO) is an independent research organization. We connect people and knowledge to create innovations that boost the sustainable competitive strength of industry and well-being of society. Now and in the future. This is our mission and it is what drives us, the over 3.000 professionals at TNO, in our work every day. We work in collaboration with partners and focus on transitions or changes in nine social themes that we have identified together with our stakeholders.

      \\r\\n\\r\\n

      Information & Communication Technology: \\'Interpreting and accelerating digital transformation\\'

      \\r\\n

      TNOs Information & Communication Technology unit aims to assist its clients, partners and other TNO units through complex digital transformations by leveraging its know-how in ICT, policy and business models. In concrete terms, we work in three main areas: data-driven innovations, robust networks, and integrated computer systems. We operate in domains such as ICT, telecoms, defence & security, high-tech industry, the energy sector, mobility and logistics. \\r\\n

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1489-web.png"},"website":"https://www.tno.nl/en/focus-areas/information-communication-technology/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1491,"name":"CSEM SA","member_since":"2021-01-28","renewal_date":"2027-02-01","description":{"long":"We are a public-private, non-profit technology innovation center. Dedicated to transforming brilliant ideas into industrial reality. With the support of the Swiss Federal government our mission is to secure our nation’s status as a global tech and innovation leader."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1491-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1492,"name":"The University of Sheffield","member_since":"2021-02-02","renewal_date":"2027-02-01","description":{"long":"The University of Sheffield Advanced Manufacturing Research Centre (AMRC) is a network of world-leading research and innovation centres working with manufacturing companies of any size from around the globe.\\r\\n\\r\\nWe specialise in carrying out world-leading research into advanced machining, manufacturing and materials, which is of practical use to industry.\\r\\nWe transform industrial and economic performance by making step changes in productivity, increasing competitiveness, developing new products and processes and training new talent and skills.\\r\\n\\r\\nOur 125-plus industrial partners range from global giants like Boeing, Rolls-Royce, BAE Systems and Airbus to small companies. Businesses can work with us on a one-off project, or join us as a member for long-term collaboration.\\r\\nOur operations have grown significantly since we were founded in 2001 and in 2003 we became the anchor tenant on the Advanced Manufacturing Park at Catcliffe, South Yorkshire.\\r\\n\\r\\nThe AMRC now employs over 500 highly qualified researchers and engineers from around the globe, on the Advanced Manufacturing Park and Sheffield Business Park in South Yorkshire, as well as in Broughton and Preston."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1492-web.png"},"website":"https://www.amrc.co.uk","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1494,"name":"Adobe","member_since":"2021-02-05","renewal_date":"2027-02-01","description":{"long":"Adobe"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1494-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"68db2919ffe553250ae8","description":"Participant Member","level":"WGAPS","working_group":"osgi"}],"is_active_member":true},{"organization_id":1501,"name":"Opto 22","member_since":"2021-04-08","renewal_date":"2027-01-01","description":{"long":"For over 45 years, OEMs, machine builders, system integrators, and IT and operations personnel have looked to us for reliable products that deliver cutting-edge innovation at an affordable price.\\r\\n\\r\\nToday, we design and manufacture industrial control and IIoT products, like groov EPIC and groov RIO, that bridge the gap between IT and OT, following a core philosophy of open, standards-based technology.\\r\\n\\r\\nOpto 22 products are deployed worldwide in industrial automation, process control, building automation, industrial refrigeration, remote monitoring, and data acquisition applications through our global network of distributors and system integrators.\\r\\n\\r\\nOpto 22\\'s groov family of industrial edge controllers and I/O is designed from the ground up with integrated control, connectivity, and security tools to help you connect automation, enterprise, and cloud data.\\r\\n\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1501-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1503,"name":"Flow Software, Inc.","member_since":"2021-04-22","renewal_date":"2027-05-01","description":{"long":"The Flow Information Platform simplifies the creation and sharing of operational and strategic decision support information across your organization.\\r\\n\\r\\nCombine and transform data from multiple sources into a single namespace representing your \\\"single version of the truth\\\". Share this truth with people via configurable dashboards or with systems via configurable integrations.\\r\\n\\r\\nFlow is an \\\"ETL for OT\\\", a \\\"DataOps\\\" platform, that ingests and transforms complex data into KPIs, making it accessible when it is needed the most. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1503-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1504,"name":"Interuniversitair Micro-Electronica Centrum vzm (IMEC)","member_since":"2021-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1504-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"68db2919ffe553250ae8","description":"Guest Member","level":"WGSAP","working_group":"osgi"},{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1505,"name":"The Apache Software Foundation","member_since":"2021-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1505-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1506,"name":"Beijing Baolande Software Corporation","member_since":"2021-05-14","renewal_date":"2027-05-01","description":{"long":"Beijing Baolande Software Corporation founded in 2008, is a high-tech software enterprise focusing on basic software development and promotion."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1506-web.png"},"website":"https://www.bessystem.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1512,"name":"Fondazione LINKS","member_since":"2021-07-20","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1512-web.png"},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1513,"name":"Trialog ","member_since":"2021-08-10","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1513-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1515,"name":"NOI Techpark","member_since":"2021-08-26","renewal_date":"2026-09-01","description":{"long":"We are NOI. South Tyrol's innovation district.\nInnovation, research, development. 1.000+ entrepreneurs, researchers, start-ups and students are working at NOI for an ecological and economic conversion of society. At NOI, research is practice-oriented. The needs of companies give rise to scientific work. \nAt NOI, we focus on four technology fields: Green, Food, Digital, Automotive & Automation. We are rooted in South Tyrol and in South Tyrolean society. At the same time, we work with an international slant. \nFor R&D projects we offer services and knowhow through our dataspaces platform Open Data Hub https://opendatahub.com and the Free Software Lab https://freesoftwarelab.noi.bz.it "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1515-web.png"},"website":"https://noi.bz.it/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Supporter Member","level":"WGSM","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Silver Member","level":"WGHLP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1519,"name":"European Space Agency","member_since":"2021-09-20","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1519-web.png"},"website":null,"levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[],"is_active_member":true},{"organization_id":1520,"name":"Volkswagen Aktiengesellschaft","member_since":"2021-10-04","renewal_date":"2026-06-01","description":{"long":"The Volkswagen Group comprises ten brands from five European countries: Volkswagen, Volkswagen Commercial Vehicles, ŠKODA, SEAT, CUPRA, Audi, Lamborghini, Bentley, Porsche and Ducati. On our way to becoming a sustainable mobility provider with a role model function in the areas of environment, safety and integrity, Volkswagen Group Innovation rely on a cross-brand and efficient research network. This network connects experts, enables partnership-based cooperation at eye level, creates an innovative working environment and bundles activities in order to increase synergies and efficiencies across the Volkswagen group"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1520-web.png"},"website":"https://www.volkswagen.de/de.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"aea0514f5cc2d0407ffd","description":"Driver Member","level":"WGPAE","working_group":"openpass"}],"is_active_member":true},{"organization_id":1521,"name":"Industrial Digital Twin Association","member_since":"2021-10-06","renewal_date":"2026-10-01","description":{"long":"The IDTA is the first point of contact for the standardised Digital Twin and offers all industrial organisations a platform for participation. The aim is to establish the Digital Twin for components, machines, plants and entire factories as an open source technology and to develop it further together with industry.\nThe core technology for the implementation is the Asset Administration Shell (AAS), that enables quick and easy access to data over the entire life cycle thanks to standardised software structure, interfaces and semantics using current security mechanisms. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1521-web.png"},"website":"https://industrialdigitaltwin.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1524,"name":"University of Saskatchewan","member_since":"2021-10-15","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1524-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1525,"name":"University of California, Santa Barbara","member_since":"2021-10-15","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1530,"name":"Institute of Software Chinese Academy of Sciences","member_since":"2021-10-15","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1530-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1532,"name":"Asiainfo Technologies limited","member_since":"2024-04-15","renewal_date":"2026-11-01","description":{"long":"Started in 1993, AsiaInfo Technologies Limited is a leading provider of information technology products and services and a pioneering provider of full-stack digital intelligence capabilities. AsiaInfo provides end-to-end and full-link digital intelligence services for hundreds of industries based on its full-stack digital intelligence capabilities such as consulting and planning, product R&D, product delivery, system integration, data operation, intelligent decision-making, customer services. \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1532-web.png"},"website":"https://www.asiainfo.com/en_us/index.html","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1540,"name":"Amadeus S.A.S.","member_since":"2021-11-23","renewal_date":"2026-11-01","description":{"long":"Travel powers progress. Amadeus powers travel. Amadeus solutions connect travelers to the journeys they want through travel agents, search engines, tour operators, airlines, airports, hotels, cars and railways.\\r\\nWe have developed our technology in partnership with the travel industry for over 30 years. We combine a deep understanding of how people travel with the ability to design and deliver the most complex, trusted, critical systems our customers need. In 2019, we helped connect over 1.9 billion people to local travel providers in over 190 countries. We help connect over 1.6 billion people a year to local travel providers in over 190 countries.\\r\\n

      We are one company, with a global mindset and a local presence wherever our customers need us.

      \\r\\n

      Our purpose is to shape the future of travel. We are passionate in our pursuit of better technology that makes better journeys.

      \\r\\nAmadeus is an IBEX 35 company, listed on the Spanish Stock Exchange under AMS.MC. The company has also been recognized by the Dow Jones Sustainability Index for the last ten years.\\r\\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1540-web.png"},"website":"https://amadeus.com/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1541,"name":"Scheidt & Bachmann System Technik GmbH","member_since":"2021-11-29","renewal_date":"2026-12-01","description":{"long":"

      System manufacturer for software and hardware systems for control and safety technology for the railway domain. Innovative solutions for control and administration of rail-bound traffic.

      \\r\\n

      The developers at the site in Kiel-Melsdorf complement the SIL 4 signalling-department of Mönchengladbach, Germany, with the ZSB2000 interlocking system and the BUES2000 level-crossing. This especially includes complex traffic-control-systems for large international inter-city-railways and metro-customers (on basis of the control centers of the DB Netz AG, the product Travis and the train detection system ZNP801D), an operation and interlocking simulation (\\\"Betriebs- und Stellwerkssimulation\\\", BEST), next to a modern tooling ecosystem for supporting planning, configuration, development and quality assurance.

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1541-web.png"},"website":"https://www.scheidt-bachmann.de/de/signalling-systems/home","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1542,"name":"Nokia","member_since":"2021-11-29","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1542-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Strategic Member","level":"WGSD","working_group":"orc"}],"is_active_member":true},{"organization_id":1543,"name":"AURA","member_since":"2021-12-16","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1544,"name":"Data Intelligence Offensive (DIO)","member_since":"2021-12-21","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1545,"name":"Frontgrade Gaisler","member_since":"2021-12-21","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1545-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1547,"name":"Array","member_since":"2022-01-05","renewal_date":"2027-01-01","description":{"long":"Array is a law firm dedicated to IT matters, with a specific focus on Free and Open Source Software and other field of open technology, data, science and society. Founded by Carlo Piana, a renown lawyer and advocate in the FOSS space since early 2000's, it includes high-quality experts in the field and mentioned by the Who's Who Legal for IT in Italy. The members of Array have a deep knowledge of the legal and technical aspects of the IT world. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1547-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f348c2873ca8ed8e9eca","description":"Guest Member","level":"WGSAP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1550,"name":"Accenture GmbH","member_since":"2022-02-04","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1550-web.png"},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1551,"name":"Capgemini","member_since":"2022-02-15","renewal_date":"2027-02-01","description":{"long":"Capgemini is a global leader in partnering with companies to transform and manage their business by harnessing the power of technology. The Group is guided everyday by its purpose of unleashing human energy through technology for an inclusive and sustainable future. It is a responsible and diverse organization of over 325,000 team members more than 50 countries. With its deep industry expertise, Capgemini is trusted by its clients to address the entire breadth of their business needs, from strategy and design to operations, fueled by the innovative world of cloud, data, AI, connectivity, software, digital engineering and platforms. The Group reported in 2021 global revenues of €18 billion."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1551-web.jpg"},"website":"https://www.capgemini.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Supporting Member","level":"WGSM","working_group":"oniro"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1553,"name":"ZF Friedrichshafen AG","member_since":"2022-02-25","renewal_date":"2027-03-01","description":{"long":" ZF is a global technology company supplying systems for passenger cars, commercial vehicles and industrial technology, enabling the next generation of mobility. ZF allows vehicles to see, think and act. In the four technology domains of Vehicle Motion Control, Integrated Safety, Automated Driving, and Electric Mobility, ZF offers comprehensive product and software solutions for established vehicle manufacturers and newly emerging transport and mobility service providers. ZF electrifies a wide range of vehicle types. With its products, the company contributes to reducing emissions, protecting the climate and enhancing safe mobility."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1553-web.png"},"website":"https://www.zf.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1554,"name":"AUMOVIO Germany GmbH","member_since":"2022-02-28","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1554-web.png"},"website":"https://www.aumovio.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1555,"name":"Reycom AG, a Swiss corporation","member_since":"2022-02-28","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1555-web.png"},"website":"https://www.reycom.swiss/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1559,"name":"ZettaScale Technology SARL","member_since":"2022-03-03","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1559-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Leader Member","level":"WGLM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1561,"name":"ESOP- Empresas SW OS Portuguesas","member_since":"2022-03-25","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1566,"name":"Sustainable Digital Infrastructure Alliance","member_since":"2022-05-11","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1568,"name":"ETAS GmbH","member_since":"2022-05-25","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1568-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1570,"name":"CARIAD SE","member_since":"2022-05-31","renewal_date":"2026-06-01","description":{"long":"CARIAD is an automotive software company in the Volkswagen Group that develops a leading tech stack for the automotive industry with the mission to make the automotive experience safer, more sustainable and more comfortable in a new way – for everyone, everywhere. \nCARIAD builds a uniform software platform for all brands of Volkswagen Group, which includes a unified and scalable architecture, an operating system and automotive cloud. CARIAD’s Headquarter is located in Germany, and co-operates with international Volkswagen Group teams in the US and China. \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1570-web.png"},"website":"https://cariad.technology/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1571,"name":"Omnifish OU","member_since":"2022-06-24","renewal_date":"2026-07-01","description":{"long":"At OmniFish, we specialize in providing professional services for Jakarta EE technologies. Our seasoned team of experts excels in Java application development and Java middleware production support. As dedicated contributors to the Eclipse GlassFish project and active members of the Jakarta EE Working Group, we are committed to modernizing the GlassFish server and contributing to Jakarta EE specifications. Customer success is our top priority. We work closely with our clients and partners to help them craft exceptional applications and services, ensuring our customers a safe journey filled with joy. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1571-web.png"},"website":"https://omnifish.ee","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1572,"name":"Elektrobit Automotive GmbH","member_since":"2022-07-05","renewal_date":"2026-07-01","description":{"long":"Elektrobit is an award-winning and visionary global vendor of embedded and connected software products and services for the automotive industry. A leader in automotive software with over 35 years serving the industry, Elektrobit's software powers over five billion devices in more than 600 million vehicles and offers flexible, innovative solutions for car infrastructure software, connectivity & security, automated driving and related tools, and user experience. Elektrobit is a wholly-owned, independently-operated subsidiary of Continental."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1572-web.png"},"website":"https://www.elektrobit.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1575,"name":"Dipartimento di Elettronica, Informazione e Bioingegneria - Politecnico di Milano","member_since":"2022-07-28","renewal_date":"2026-08-01","description":{"long":"The Dipartimento di Elettronica, Informazione e Bioingengeria of the Politecnico di Milano is one of the largest European ICT departments. With nearly 1000 members, researchers, collaborators, PhD students, and technical and administrative staff, the Department is a vital institution capable of promoting education, fundamental and applied research, and technology transfer to companies. The six department sections bring together consolidated competencies in systems and control, computer science and engineering, electronics, telecommunications, bioengineering, and electrical engineering."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1575-web.png"},"website":"https://www.deib.polimi.it/ita/home","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f348c2873ca8ed8e9eca","description":"Guest Member","level":"WGSAP","working_group":"oniro"}],"is_active_member":true},{"organization_id":1579,"name":"Shenzhen Ping An Communication Technology Co.,Ltd","member_since":"2022-08-11","renewal_date":"2026-08-01","description":{"long":"We are a technology solution expert of Ping An group\n\nPractice the corporate mission of \"science and technology enable finance and science and technology drive ecology\"\n\nEmpowering the group's financial services, medical and health services, automobile services, and smart city ecosystem construction\n\nCommitted to becoming an international leading technology company"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1579-web.png"},"website":"https://tech.pingan.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1580,"name":"Bloomberg L.P.","member_since":"2022-08-23","renewal_date":"2026-09-01","description":{"long":"Bloomberg is a global leader in business and financial information, delivering trusted data, news, and insights that bring transparency, efficiency, and fairness to markets. The company helps connect influential communities across the global financial ecosystem via reliable technology solutions that enable our customers to make more informed decisions and foster better collaboration. Our 7,000+ engineers, developers, data scientists and technologists are the ones who make this happen, creating and advancing solutions and systems that solve complex, real-world problems for customers across the global capital markets."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1580-web.png"},"website":"https://www.TechAtBloomberg.com/opensource","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Enterprise Member","level":"WGDSA","working_group":"adoptium"}],"is_active_member":true},{"organization_id":1582,"name":"FUJIFILM Italia S.p.A","member_since":"2022-09-02","renewal_date":"2026-09-01","description":{"long":"FUJIFILM Italia - Medical Informatics Research & Development Unit\nMain activities of the Unit are Technological Research in the IT field, Design and Development of Software Products and Applications, Consulting on Digital Solutions for the Healthcare."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1582-web.png"},"website":"https://www.fujifilm.com/it/en/about/us/offices/fujifilm-italia-unita-operativa-locale-di-bolzano","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1584,"name":"Harvey Mudd College","member_since":"2022-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1584-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1587,"name":"Oklahoma State University","member_since":"2022-09-13","renewal_date":"2026-09-01","description":{"long":"Oklahoma State University is a public land-grant research university in Stillwater, Oklahoma, United States. The university was established in 1890 under the legislation of the Morrill Act."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1587-web.png"},"website":"https://go.okstate.edu/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1588,"name":"PlanV GmbH","member_since":"2022-09-16","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1588-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1589,"name":"T-Systems International GmbH","member_since":"2022-09-20","renewal_date":"2026-09-01","description":{"long":"With locations in more than 20 countries and over 27,000 employees (December 31, 2022), as well as annual revenues of around EUR 4.0 billion (2022), T-Systems is one of the leading providers of digital services in Europe. The Deutsche Telekom subsidiary is headquartered in Germany and has a presence in Europe as well as in selected core markets and strategic production locations. T-Systems offers integrated end-to-end IT solutions, driving the digital transformation of companies in all industries and the public sector. T-Systems’ focus industries are automotive, the public sector, healthcare and transport. For these areas, T-Systems develops industry-specific solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1589-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1591,"name":"Universidad de Cantabria","member_since":"2022-09-23","renewal_date":"2026-08-01","description":{"long":"

      The University of Cantabria (UC) offers official university study courses in the self-governed region of Cantabria (Spain).

      \n\n

      The Software Engineering and Real-Time Group (Ingeniería del Software y Tiempo Real, ISTR) has kept a continuous research activity in the theory and application of Software Engineering to Distributed Embedded Real-Time Systems, Model-Driven Engineering, Databases and Business Intelligence, and Security in Information Systems. The group also actively participates in the development of standards: Real-time POSIX operating systems, the UML-MARTE profile of OMG, and the standardization process of the Ada language.

      "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1591-web.jpg"},"website":"https://web.unican.es/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1592,"name":"Google LLC","member_since":"2022-10-12","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1592-web.png"},"website":"","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"},{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1594,"name":"Quantyss","member_since":"2022-10-18","renewal_date":"2026-10-01","description":{"long":"QUANTYSS is a startup company created to share senior expertise to innovative entrepreneurs of SMEs, startups and midcaps, in the field of technology. We provide specialized insight and relevant industry expertise to help them take their business further.\nWe are actively driving, together with Eclipse members, the Edge Computing Working Group of the French Embedded France Association. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1594-web.png"},"website":"https://quantyss.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1595,"name":"Rivos Inc","member_since":"2022-10-18","renewal_date":"2026-10-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1595-web.png"},"website":"https://www.rivosinc.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Strategic Member","level":"WGSD","working_group":"adoptium"}],"is_active_member":true},{"organization_id":1597,"name":"Kentyou","member_since":"2022-10-25","renewal_date":"2026-11-01","description":{"long":"Kentyou is an innovative startup company helping cities in their digital transformation to face their environmental social and economic challenges more efficiently. By leveraging the open source Eclipse sensiNact platform, it provides a data hub that collects data from various data sources including IoT, mobile apps and open data portals, unifies and analyses that data to extract actionable information. Kentyou also provides a visualisation and impact monitoring tool to help cities making data-driven decisions with desirable effects with the help of emerging AI technologies. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1597-web.jpg"},"website":"https://kentyou.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"68db2919ffe553250ae8","description":"Participant Member","level":"WGAPS","working_group":"osgi"}],"is_active_member":true},{"organization_id":1599,"name":"SOTEC GmbH+Co KG","member_since":"2022-11-02","renewal_date":"2026-11-01","description":{"long":"SOTEC is an internationally active provider of software development and hardware solutions for the retail, automotive, industrial automation, manufacturing, and energy industries. SOTEC has been supporting its customers with advanced technology and development services for over 40 years. Services range from specialized hardware and embedded systems development to cloud architectures and solution implementations.\nAs a specialist for IoT (IIoT), Machine Learning, Industrie 4.0 and Cloud technologies, SOTEC supports customers in building digital platforms and thus in the digital transformation of their companies."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1599-web.png"},"website":"https://www.sotec.eu/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1600,"name":"Open Elements GmbH","member_since":"2022-11-08","renewal_date":"2026-12-01","description":{"long":"Open Elements is an IT company whose main focus is on the two points of Open Source Software (OSS) and Java. By focusing on these two points, we can provide our customers with expert advice and support in the development and use of Open Source Software. By specializing in Java-based OSS, we are members of the leading committees and foundations on these topics and actively contribute to the further development of critical open source systems in the Java ecosystem."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1600-web.png"},"website":"https://open-elements.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"32c5a745df264aa2a809","description":"Participant Member","level":"WGAPS","working_group":"adoptium"},{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1604,"name":"Stellenbosch University","member_since":"2022-12-01","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1605,"name":"Micro Stream Software GmbH","member_since":"2022-12-16","renewal_date":"2026-12-01","description":{"long":"MicroStream connects Java seamlessly with the cloud. To do this, we create new innovations in Java, the JVM ecosystem, Android, data storage, and the cloud and work on standards together with other vendors and the strong open-source community. \n\nOur business is to support companies and organizations that use open source for their mission-critical projects commercially with enterprise add-ons, extended testing, custom-builds, first-class enterprise-grade support, and manpower."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1605-web.png"},"website":"https://microstream.one/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1606,"name":"Schaeffler","member_since":"2022-12-20","renewal_date":"2027-05-01","description":{"long":"The Schaeffler Group has been driving forward groundbreaking inventions and developments in the field of motion technology for over 75 years. With innovative technologies, products, and services for electric mobility, CO2-efficient drives, chassis solutions and renewable energies, the company is a reliable partner for making motion more efficient, intelligent, and sustainable – over the entire life cycle. We pioneer motion."},"logos":{"print":"https://membership.eclipse.org/organization/images/1606-print.eps","web":"https://membership.eclipse.org/organization/images/1606-web.png"},"website":"https://www.schaeffler.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1607,"name":"Valeo","member_since":"2022-12-20","renewal_date":"2027-01-01","description":{"long":"https://www.valeo.com/en/"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1607-web.png"},"website":"https://www.valeo.com/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1608,"name":"Cummins Inc","member_since":"2023-01-05","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1608-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1609,"name":"N3uron Connectivity Systems","member_since":"2023-01-10","renewal_date":"2027-01-01","description":{"long":"N3uron software is an Industrial Edge Platform for IIoT and DataOps that streamlines the flow of data between industrial systems and business applications, either on-premise or in the cloud. N3uron provides an out-of-the-box solution for data standardization, normalization and contextualization, seamless integration with industrial and IT systems, efficient information management, and unparalleled scalability and security. The N3uron platform makes it easier for operations teams to aggregate, manage and analyze industrial data, resulting in enhanced productivity and informed decision-making."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1609-web.png"},"website":"https://n3uron.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1611,"name":"NOUVELLE-AQUITAINE OPEN SOURCE","member_since":"2023-01-16","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1612,"name":"IAV ","member_since":"2023-01-18","renewal_date":"2027-02-01","description":{"long":"As one of the globally leading engineering partners, IAV develops the mobility of the future. Regardless of the specific manufacturer, our engineering proves itself in vehicles and technologies all over the world.\n\nWith more than 35 years of experience and an unsurpassed range of expertise, we combine the best of many different worlds: automotive and IT, hardware and software, products and services. With our workforce of more than 7,600 employees and first-class technical resources, we help our customers to implement their projects, from the concept right through to SOP. Our goal: better mobility.\n\nIAV offers outstanding engineering expertise and combines the best of many different worlds.\n\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1612-web.png"},"website":"https://www.iav.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1613,"name":"10xEngineers","member_since":"2023-01-24","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1613-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1614,"name":"SCANOSS","member_since":"2023-01-26","renewal_date":"2027-02-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1614-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1616,"name":"Start North ry","member_since":"2023-02-02","renewal_date":"2027-02-01","description":{"long":"Start North accelerates the learning and implementation of the latest technology in order to improve the productivity of companies and promote the world's sustainable development. Together with its university and business partners, Start North plans and implements programs and projects and implements 5G Mokki Tech Space learning, innovation, remote work and service environments for university campuses and wherever know-how, work and services are needed."},"logos":{"print":null,"web":null},"website":"https://www.startnorth.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1619,"name":"Gaia-x European Association for Data and Cloud.","member_since":"2023-02-27","renewal_date":"2027-03-01","description":{"long":"The Gaia-X European Association for Data and Cloud AISBL\nInnovation through digital sovereignty – that’s the goal of Gaia-X. We achieve this by establishing an ecosystem in which data is made available, collated and shared in a trustworthy environment. The users always retain sovereignty over their data. So, what emerges is not a cloud but a federated system that links many cloud services providers and users together."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1619-web.png"},"website":"https://gaia-x.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1620,"name":"Beijing Institute of Open Source Chip","member_since":"2023-03-16","renewal_date":"2026-08-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1620-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1621,"name":"LG Electronics, Inc","member_since":"2023-03-21","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1621-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1625,"name":"Open Forum Europe AISBL","member_since":"2023-04-13","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1625-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1629,"name":"Posit Software, PBC","member_since":"2023-05-04","renewal_date":"2027-05-01","description":{"long":"Posit helps people understand and improve the world through data. We build tools that enable robust and reproducible data analysis through a code-first approach, paired with tools that make it easy to share insights. Our core software is open source, freely available to anyone. Our professional software equips individuals and teams to develop and share their work at scale."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1629-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1630,"name":"Reutlingen University","member_since":"2023-05-10","renewal_date":"2027-05-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1630-web.png"},"website":"https://www.reutlingen-university.de","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1631,"name":"Litmus Automation Inc.","member_since":"2023-05-11","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1631-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1632,"name":"Qualcomm Innovation Center","member_since":"2023-05-24","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1632-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1633,"name":"KU Leuven","member_since":"2023-06-12","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1633-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1634,"name":"Ferdinand-Steinbeis-Institut","member_since":"2023-06-14","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1634-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1635,"name":"Energy Telecommunications & Electrical Association","member_since":"2023-06-28","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1635-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Guest Member","level":"WGSAP","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1636,"name":"Politecnico di Torino","member_since":"2023-07-06","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1638,"name":"Integration Objects","member_since":"2023-10-02","renewal_date":"2026-10-01","description":{"long":"Integration Objects empowers businesses to accelerate their digital transformation through robust and reliable solutions. We offer a wide range of applications including, Industrial IoT (IIoT), cyber security, Big Data Analytics, C4ISR, and process automation for Defense and Governmental Institutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1638-web.png"},"website":"https://integrationobjects.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"},{"document_id":"f351fc9ba96cb468393f","description":"Participant Member","level":"WGAPS","working_group":"sparkplug"}],"is_active_member":true},{"organization_id":1640,"name":"GPS BY DESIGN CENTRE","member_since":"2023-10-12","renewal_date":"2026-10-01","description":{"long":"Our mission is to spread the word on how to operationalize Privacy by Design, especially given its inclusion in the new E.U. General Data Protection Regulation. "},"logos":{"print":null,"web":null},"website":"https://gpsbydesigncentre.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1641,"name":"International Data Spaces e. V","member_since":"2023-11-02","renewal_date":"2026-10-01","description":{"long":"The International Data Spaces Association (IDSA) is on a mission to create the future of the global, digital economy. Its 170+ member companies and institutions have created the International Data Spaces (IDS) standard: a secure system of sovereign and trusted data sharing in which all participants can realize the full value of their data. IDS enables new smart services and innovative business processes to work across companies and industries while ensuring that the control of data remains in the hands of data providers. We call this data sovereignty."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1641-web.jpg"},"website":"https://internationaldataspaces.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1642,"name":"PX5","member_since":"2023-11-03","renewal_date":"2026-11-01","description":{"long":"Expert Professional Support for THREADX RTOS and middleware!\n\nWith decades of THREADX domain experience, our team delivers professional, fully ticketed, and tracked support for individual projects through entire enterprises. Being the original authors, nobody knows the THREADX technology more than us. We are committed to taking care of you!\n\nhttps://rtosx.com\n\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1642-web.png"},"website":"https://rtosx.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1643,"name":"iSHARE Foundation","member_since":"2023-11-08","renewal_date":"2026-11-01","description":{"long":"Non-profit trust and participant governance framework for data exchange between organisations in data spaces. Bringing organisational and trust interoperability. \n\nTrust derived from Legal, Operational and Technical credentials and specifications. \n\nGoverned by the data spaces that build on iSHARE and licence the specifications and operational and legal documentation to govern data spaces. "},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1643-web.jpg"},"website":"https://ishare.eu","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1645,"name":"Amazon Europe Core SARL","member_since":"2023-11-16","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1645-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"b557cbcb3973aac1beae","description":"Participant Member","level":"WGAPS","working_group":"open-vsx"}],"is_active_member":true},{"organization_id":1646,"name":"Cypherbridge Systems LLC","member_since":"2023-11-15","renewal_date":"2026-11-01","description":{"long":"Cypherbridge develops and deploys purpose-built IoT security software solutions to meet industry standards, regulation, and cybersecurity requirements throughout the product lifecycle.\n\t\nFrom concept to product, Cypherbridge delivers solutions for Eclipse ThreadX platforms, including secure boot, connectivity, security, and IoT Cloud Computing. We offer SDKPac for Eclipse ThreadX, porting and design services, and long term technical support for complete solution delivery and software lifecycle."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1646-web.jpg"},"website":"https://www.cypherbridge.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Supporter Member","level":"WGSM","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1648,"name":"co4e GmbH","member_since":"2024-01-01","renewal_date":"2027-01-01","description":{"long":"The Consultancy for Engineers (co4e) GmbH is a software tool vendor and consultancy service provider. It was founded in 2019 as a spin-off from the German Aerospace Center (DLR). The co4e GmbH head office located in the heart of Berlin (Kreuzberg), Germany.

      Established with a vision to address the complexities of transportation systems, we bring together a team of experts and enthusiasts who are passionate about creating sustainable, efficient, and intelligent mobility solutions. At the heart of our endeavors are SESAM, a cloud platform designed for mobility simulations, and ASSIST, a tool suite to automate the design of safety-critical systems."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1648-web.png"},"website":"https://www.co4e.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1649,"name":"Sonatype Inc.","member_since":"2023-12-07","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1649-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1651,"name":"Johannes Kepler University Linz","member_since":"2023-12-12","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1651-web.png"},"website":"https://www.jku.at","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1653,"name":"Nordic Institute for Interoperability Solutions","member_since":"2024-01-05","renewal_date":"2027-01-01","description":{"long":"Nordic Institute for Interoperability Solutions (NIIS) ensures the development and strategic management of digital government solutions that allow NIIS members to provide excellent digital public services.\n\nNIIS is both a network and cooperation platform and executioner of IT developments in members’ common interests. The institute focuses on practical collaboration, sharing of experience and promoting innovation. The operating model of the institute is something unique in the world.\n\nThe republics of Estonia, Finland and Iceland are members of NIIS, and the Faroe Islands and the Government of Åland are partners of NIIS."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1653-web.png"},"website":"https://www.niis.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1654,"name":"Harman International","member_since":"2024-01-08","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1654-web.jpg"},"website":"https://www.harman.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1655,"name":"The Matrix.org Foundation C.I.C.","member_since":"2024-01-19","renewal_date":"2027-02-01","description":{"long":"Matrix is an open protocol for decentralised, secure communications. The Matrix.org Foundation exists to act as a neutral custodian for Matrix and to nurture it as efficiently as possible as a single unfragmented standard, for the greater benefit of the whole ecosystem, not benefiting or privileging any single player or subset of players."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1655-web.png"},"website":"https://matrix.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1656,"name":"Catena-X Automotive Network e.V","member_since":"2024-02-06","renewal_date":"2027-01-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1656-web.png"},"website":"https://catena-x.net/en/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1659,"name":"Lunatech Labs B.V.","member_since":"2024-02-27","renewal_date":"2027-03-01","description":{"long":"Lunatech, established in 1993, is a distinguished software development consultancy renowned for its expertise in crafting tailored solutions to address intricate challenges. Specialising in the design, development, deployment, and ongoing operation of custom software, Lunatech excels in delivering comprehensive services.\n\nWith a team of experts proficient in Java and Scala, Lunatech excels in various domains including system integration, legacy transformation, and continuous maintenance. With three decades of experience under our belt, we have empowered our clients to streamline their IT operations and achieve their business objectives seamlessly."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1659-web.png"},"website":"https://www.lunatech.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1661,"name":"FEV.io GmbH","member_since":"2026-03-01","renewal_date":"2027-02-01","description":{"long":""},"logos":{"print":"https://membership.eclipse.org/organization/images/1661-print.eps","web":"https://membership.eclipse.org/organization/images/1661-web.png"},"website":"https://www.fev.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1663,"name":"Instituto Tecnológico de Informática","member_since":"2024-03-12","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1663-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1666,"name":"Stadt Jena","member_since":"2024-03-21","renewal_date":"2027-04-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1666-web.png"},"website":"https://www.jena.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1667,"name":"TOSIT Association","member_since":"2024-03-25","renewal_date":"2027-04-01","description":{"long":"TOSIT (The Open Source I Trust) is an association under the French Law of 1901 of major end-users, with the following aims:\n\n* Provide a forum for its members to meet and discuss Open Source solutions\n\n* Encourage the sharing of feedback and best practice in Open Source\n\n* Gather and identify the needs of its members in terms of Open Source solutions\n\n* Carry out strategic or technical studies and monitoring related to Open Source solutions\n\n* Promote Open Source solutions judged to be the most effective in various areas of interest\n\n* Carry out communication and publication initiatives related to Open Source \n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1667-web.png"},"website":"https://tosit.fr","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1669,"name":"Ferrous Systems GmbH","member_since":"2024-04-08","renewal_date":"2027-05-01","description":{"long":"Ferrous Systems is worlds leading Rust company. From tooling, to support, to training. They are the first one to implement and certify a fully open source Rust compiler usable in safety, by ISO 26262 and IEC 61508.\n\nMembers of the company have been in Rust Foundation and Rust Project leadership for a long while."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1669-web.png"},"website":"https://ferrous-systems.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1670,"name":"Rust Foundation","member_since":"2024-04-11","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1670-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1672,"name":"DIN e.V.","member_since":"2024-04-30","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1673,"name":"Python Software Foundation","member_since":"2024-05-01","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1673-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1674,"name":"The PHP Foundation (Open Source Collective)","member_since":"2024-05-06","renewal_date":"2027-05-01","description":{"long":"We support, advance, and develop the PHP Language."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1674-web.png"},"website":"https://thephp.foundation","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1675,"name":"OpenSSL Software Foundation Inc","member_since":"2024-05-22","renewal_date":"2027-05-01","description":{"long":"The OpenSSL Foundation works to ensure that everyone, including nonprofits, academics, and independent developers, has access to fundamental data privacy and security tools that are the backbone of internet protection, quietly safeguarding millions of users. We do this to help build a safer internet — one that serves the public interest and upholds privacy and security as foundational rights."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1675-web.png"},"website":"https://openssl-foundation.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1676,"name":"OWASP Foundation, Inc.","member_since":"2024-05-26","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1676-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1677,"name":"THE COMETBID SOFTWARE FOUNDATION","member_since":"2024-05-30","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1678,"name":"XITASO GmbH","member_since":"2024-06-03","renewal_date":"2026-06-01","description":{"long":"As a digitization partner and expert for high-end software engineering, XITASO provides advice to B2B customers, identifies digitization potentials, optimizes business processes and create digital strategies and solutions. Based on an agile mindset, we design and develop individual solutions with outstanding expertise in the areas of Industry 4.0, Internet of Things (IoT), Robotics, Digital Twin, Data Science, Artificial Intelligence and Augmented Reality. XITASO serves customers throughout Germany from various industries, in particular from mechanical and plant engineering as well as the healthcare sector."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1678-web.png"},"website":"https://xitaso.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1679,"name":"Michelin","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"Michelin is building a world-leading manufacturer of life-changing composites and experiences.\n\nPioneering engineered materials for more than 130 years, Michelin is uniquely positioned to make decisive contributions to human progress and a more sustainable world."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1679-web.png"},"website":"https://www.michelin.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1680,"name":"Stichting Blender Foundation","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1680-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1681,"name":"Clever Cloud SAS","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"Founded in 2010, Clever Cloud is a French company based in Nantes, specialising in IT automation. It creates and supplies the software building blocks needed to deploy applications on self-service PaaS architectures. Its customers include such big names as Airbus, Great Place to Work, MAIF, Cegid, Docaposte, Fairphone, Solocal and TBWA."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1681-web.png"},"website":"https://www.clever.cloud/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1682,"name":"CodeDay","member_since":"2024-06-06","renewal_date":"2026-06-01","description":{"long":"There's a place in tech for everyone. CodeDay is a non-profit providing welcoming, hands-on opportunities for under-served students to explore a future in tech and beyond through opportunities to contribute to open-source software."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1682-web.png"},"website":"https://www.codeday.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"},{"document_id":"fb4d6a3ddca7cfc1de0d","description":"Guest Member","level":"WGSAP","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1683,"name":"ZHAW, Institute of Mechatronic Systems (IMS)","member_since":"2024-06-13","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1684,"name":"The Document Foundation","member_since":"2024-06-13","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1684-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1685,"name":"Open Infrastructure Foundation","member_since":"2024-06-17","renewal_date":"2026-06-01","description":{"long":"The Open Infrastructure Foundation (previously known as the OpenStack Foundation) is a global non-profit organization providing a neutral, open environment for organizations, developers, and users to build open source infrastructure software together.\n\nStrong of more than 110,000 individual members representing 700+ organizations in 180+ countries, our Foundation is the home for several open source infrastructure projects, including OpenStack, Kata Containers and StarlingX."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1685-web.png"},"website":"https://openinfra.dev","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1686,"name":"Stichting NLnet Labs","member_since":"2024-06-19","renewal_date":"2026-06-01","description":{"long":"Founded in 1999, NLnet Labs is an independent, non-profit, public benefit foundation based in the Netherlands. Our mission is to make the core of the Internet a better, safer place by developing open-source software, through applied research and by promoting and contributing to open standards."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1686-web.png"},"website":"https://nlnetlabs.nl","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1688,"name":"FreeBSD Foundation","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":"The FreeBSD Foundation is a 501(c)(3) non-profit organization supporting the FreeBSD Project and community. Accepting donations from individuals and businesses, the Foundation uses funds to develop features, employ software engineers, improve build and test infrastructure, advocate for FreeBSD through in-person and online events, and provide training and educational material. Representing the FreeBSD Project in legal affairs, the Foundation is the recognized entity for contracts, licenses, and other legal arrangements and is entirely donation-supported. Learn more at freebsdfoundation.org"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1688-web.png"},"website":"https://www.freebsdfoundation.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1689,"name":"Yildiz Technical University","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":"Established in 1911, Yildiz Technical University (YTU) is one of Turkey's oldest and most prestigious technical universities. With around 35,000 students and over 1,500 academic staff, YTU offers interdisciplinary programs in engineering, natural sciences, social sciences, and arts. Our modern campus supports student-centered learning, enriched by student clubs and research facilities. Internationally recognized for research, YTU collaborates on various national and global projects, aiming to advance education, research, and innovation to tackle global challenges."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1689-web.png"},"website":"https://www.yildiz.edu.tr/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1690,"name":"useblocks GmbH","member_since":"2024-06-26","renewal_date":"2026-07-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1690-web.png"},"website":"https://useblocks.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1691,"name":"3DS Outscale","member_since":"2024-06-26","renewal_date":"2026-06-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1693,"name":"Qorix GmbH","member_since":"2024-07-08","renewal_date":"2026-07-01","description":{"long":"Qorix is a leading provider of middleware software and engineering services with a specialized focus on the\nautomotive industry. Our offerings are:\n1- Qorix Classic stack\n2- Qorix Adaptive stack\n3- Qorix Performance stack\n4- Qorix Developer: Designer & SDK\n5- Engineering Services: maintenance, support & customization."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1693-web.png"},"website":"https://www.qorix.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1695,"name":"L&T Technology Services Ltd","member_since":"2024-08-22","renewal_date":"2026-09-01","description":{"long":"L&T Technology Services Limited (LTTS) is a global leader in Engineering and R&D (ER&D) services. With 1,343 patents filed for 57 of the Global Top 100 ER&D spenders, LTTS lives and breathes engineering. Our innovations speak for themselves – World’s 1st Autonomous Welding Robot, Solar ‘Connectivity’ Drone, and the Smartest Campus in the World, to name a few.\nLTTS’ expertise in engineering design, product development, smart manufacturing, and digitalization touches every area of human lives. With 108 Innovation and R&D design centers globally, we specialize in disruptive technology spaces such as NexGen Comms, Artificial Intelligence, Digital Factory, and Autonomous Transport."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1695-web.jpg"},"website":"https://www.ltts.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1696,"name":"Allison Transmission, Inc.","member_since":"2024-08-22","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1696-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1697,"name":"ekxide IO GmbH","member_since":"2024-09-04","renewal_date":"2026-10-01","description":{"long":"ekxide is the innovative force behind iceoryx and iceoryx2. Founded by the core maintainers and creators of iceoryx, the company was established to propel the development and ensure the continued success of the open-source project. ekxide provides a range of services focused on iceoryx, including commercial extensions and tooling, accelerated development, safety certification, priority bug-fixing, and expert training and consulting. These services are designed to enhance the performance, reliability, and safety of iceoryx-based solutions. ekxide supports clients with tailored solutions to meet their specific needs in this area."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1697-web.png"},"website":"https://ekxide.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1698,"name":"Instituto de Telecomunicações","member_since":"2024-09-06","renewal_date":"2026-09-01","description":{"long":"Instituto de Telecomunicações (IT) is a private, not-for-profit organization, of public interest, a partnership of nine institutions with research and development in the field of Telecommunications.\n\nIT is actively involved in fundamental and applied research both at national and international levels. IT also plays its role towards public society with public awareness initiatives, knowledge transfer to industry, and by providing consulting services on a non-competing basis."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1698-web.png"},"website":"https://it.pt","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1699,"name":"I Machines, Inc","member_since":"2024-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1699-web.jpg"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1700,"name":"Ruby Central, Inc.","member_since":"2024-09-09","renewal_date":"2026-09-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1700-web.jpg"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1702,"name":"Ejad for Engineering Systems","member_since":"2024-09-13","renewal_date":"2026-09-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1702-web.jpg"},"website":"https://www.ejad.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1703,"name":"Software Heritage Foundation - Inria Foundation","member_since":"2024-09-20","renewal_date":"2026-10-01","description":{"long":"Software Heritage is a non-profit initiative dedicated to collecting, preserving, and sharing all publicly available source code for the long term. Launched by Inria, supported by UNESCO, Software Heritage operates as the largest archive of open-source software, hosting over 50 billion software artifacts. Its mission is to ensure that software, a vital part of our digital heritage, is safeguarded and accessible to future generations. By enabling traceability and fostering collaboration, Software Heritage serves as an invaluable resource for research, industry, and society at large."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1703-web.png"},"website":"https://softwareheritage.org","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1704,"name":"Open Source Initiative","member_since":"2024-09-23","renewal_date":"2026-10-01","description":{"long":"The OSI is the authority that defines Open Source, recognized globally by individuals, companies, and by public institutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1704-web.jpg"},"website":"https://opensource.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1705,"name":"Ostfalia University","member_since":"2024-10-15","renewal_date":"2026-10-01","description":{"long":"The Faculty of Computer Science has existed for 30 years and has grown continuously with 24 professors and over 1000 students. Our range of courses includes courses that require typical on-campus study as well as courses that are offered in a purely online format. At the Faculty of Computer Science one can study five Bachelor programs and two Master degree programs. The online format offers two Bachelor and two Master degree programs."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1705-web.png"},"website":"https://www.ostfalia.de/cms/de/i/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"8d438deac670301c236d","description":"Guest Member","level":"WGSAP","working_group":"microprofile"},{"document_id":"e3985a1aead45e62ef7b","description":"Guest Member","level":"WGSAP","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1707,"name":"Tekniker","member_since":"2024-10-24","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1708,"name":"Navigation Data Standard (NDS) e.V.","member_since":"2024-10-24","renewal_date":"2026-11-01","description":{"long":"The NDS Association provides the global standard for map data within automotive ecosystems. Its members include car manufacturers, application developers, compiler developers, as well as map and service providers.\n\nThe NDS.Live standard enables the transmission of dynamic, cloud-connected data. It addresses the increasing size of map data by ensuring that only necessary updates are transmitted over data connections. NDS.Live has a highly modular architecture and supports various types of data, making it adaptable for a range of automotive applications."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1708-web.png"},"website":"https://nds-association.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1709,"name":"Acatech - Deutsche Akademie der Technikwissenschaften e.V.","member_since":"2024-10-31","renewal_date":"2026-11-01","description":{"long":""},"logos":{"print":null,"web":null},"website":"https://www.acatech.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1710,"name":"AboutCode Europe ASBL","member_since":"2024-11-05","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1710-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1711,"name":"KPIT Technologies Ltd","member_since":"2024-11-08","renewal_date":"2026-11-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1711-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1713,"name":"Cyberismo","member_since":"2024-11-25","renewal_date":"2026-12-01","description":{"long":"Cyberismo is a cybersecurity solution company dedicated to fortifying the digital landscape. We base our approach on the open-source Cyberismo solution, open collaboration, cybersecurity consulting, and the courage to focus on delivering impactful results. We simplify and optimise cybersecurity management while aiding teams in integrating cybersecurity into their daily operations."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1713-web.png"},"website":"https://cyberismo.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1714,"name":"OpenNebula Systems SL","member_since":"2024-12-03","renewal_date":"2027-01-01","description":{"long":"First released in Spain in 2008 as the outcome of a research project, OpenNebula has evolved into the main European open source cloud & edge management platform. As a Virtualized Infrastructure Manager (VIM) and IaaS solution, it unifies support for virtual machines, containers, and Kubernetes clusters, while providing federation, multi-tenancy, and automated provisioning across datacenter, cloud, and edge environments."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1714-web.png"},"website":"https://opennebula.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1716,"name":"Tauri","member_since":"2024-12-17","renewal_date":"2027-01-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1719,"name":"Double Open","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":"Double Open combines specialized compliance knowledge with the transparency of the industry's leading open toolset."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1719-web.png"},"website":"https://www.doubleopen.io","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1720,"name":"Welotec GmbH","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":"Founded in 1969 with headquarters in Germany, Welotec boasts a strong team with a deep understanding of the needs of machine builders. We specialize in Edge Computing, Cloud Integration, and are committed to Open Source solutions."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1720-web.png"},"website":"https://www.welotec.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1721,"name":"GEA Group AG","member_since":"2024-12-20","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1721-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1722,"name":"Codethink Ltd.","member_since":"2025-01-02","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1722-web.png"},"website":"","levels":[{"level":"SD","description":"Strategic Member","sort_order":"500"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1723,"name":"Vates","member_since":"2024-12-19","renewal_date":"2027-01-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1724,"name":"Erlang Ecosystem Foundation","member_since":"2025-01-06","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1724-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1726,"name":"Overnet Solutions S.r.l","member_since":"2025-01-24","renewal_date":"2027-02-01","description":{"long":"With over 30 years of experience in ICT training, Overnet is a leader in Italy’s ICT education sector. We offer the broadest range of official IT training and continuously update our programs to address all aspects of digital transformation. Companies and professionals looking to excel in the tech evolution trust us to develop their digital skills.\n\nOvernet is your fast track to Open Source Cloud Adoption. Our solutions enable your team to seamlessly adopt open source technologies across existing and new cloud providers, embracing hybrid and portable cloud workloads."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1726-web.png"},"website":"https://overnet.education/open-source-cloud-adoption","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1728,"name":"Associação 101010","member_since":"2025-01-30","renewal_date":"2027-02-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1729,"name":"Transcality AG","member_since":"2025-02-06","renewal_date":"2027-02-01","description":{"long":"We build a digital replica of traffic to evaluate the present and plan the future."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1729-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1736,"name":"Cofinity-X GmbH","member_since":"2025-02-18","renewal_date":"2027-03-01","description":{"long":"Cofinity-X is a joint venture established by several major companies, including BMW, Mercedes-Benz, SAP, BASF and ZF, to create a secure and efficient data exchange network in the automotive industry. This initiative aims to address the growing need for seamless and secure data sharing among automotive manufacturers, suppliers and other stakeholders. Cofinity-X represents a significant step forward in addressing the complexities and challenges of data management in the modern industry. Its collaborative approach and use of cutting-edge technology position it as a key player in the future of data exchange."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1736-web.png"},"website":"https://www.cofinity-x.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1737,"name":"Hyundai Mobis","member_since":"2025-02-20","renewal_date":"2027-03-01","description":{"long":"As a global auto parts vendor, we focus on autonomous driving, connectivity and electrification to be a leader in the era of smart mobility. Based on three modular auto components (i.e. chassis, cockpit and front-end), we work to make driving safer and easier and also offer service parts that can best serve the purpose.\n\nOur vision is to be a provider of differentiated mobility solutions that combine software and hardware in the upcoming mobility industry. To make this vision a reality, we have expanded our business areas to include smart mobility, UAM and robotics based on our R&D capability and production capacity."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1737-web.png"},"website":"https://www.mobis.com/en/index.do","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1738,"name":"Ant Blockchain Technology (Shanghai) Co., Ltd","member_since":"2025-02-26","renewal_date":"2027-03-01","description":{"long":"Ant Digital Technology is an independent section of Ant Group's technology commercialization, which began independent operations in April 2024. Ant Digital Technology started with Ant Chain and has the world's largest number of leading technologies and patents in the blockchain field. In addition, it has continuously developed multiple commercial product brands, including ZOLOZ, mPaaS, SofaStack, Ant Shield, and Ant Tianjian.As of now, Ant Digital Technology has collaborated with over 300 partners to serve more than 10,000 enterprise customers."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1738-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1740,"name":"Universidad Politécnica de Madrid","member_since":"2025-02-27","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1740-web.png"},"website":"https://upm.es","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Guest Member","level":"WGSAP","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1741,"name":"Drupal Association","member_since":"2025-02-27","renewal_date":"2027-03-01","description":{"long":"The Drupal Association is the non-profit organization focused on accelerating Drupal, fostering the growth of the Drupal community, and supporting the project’s vision to create a safe, secure, and open web for everyone. The Drupal Association also administers Drupal.org on behalf of the Drupal community."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1741-web.png"},"website":"https://www.drupal.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1742,"name":"Capabilities Limited","member_since":"2025-03-05","renewal_date":"2027-03-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1742-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1744,"name":"Debian France","member_since":"2025-03-20","renewal_date":"2027-04-01","description":{"long":null},"logos":{"print":null,"web":null},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1745,"name":"APELL ASBL","member_since":"2025-04-03","renewal_date":"2027-04-01","description":{"long":"APELL – The European Open Source Software Business Association is the umbrella organisation for national Open Source business associations in Europe. Founded in 2020, it aims to increase opportunities for the members of the Association’s member organisations, and to raise awareness for the strategic importance of Open Source for Europe. APELL promotes a sovereign, in­clu­sive, ethical digital market."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1745-web.png"},"website":"https://apell.info/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1746,"name":"the School of ECE of NTUA","member_since":"2025-04-09","renewal_date":"2027-04-01","description":{"long":"School of Electrical and Computer Engineering of the National Technical University of Athens"},"logos":{"print":null,"web":null},"website":"https://www.ece.ntua.gr/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1747,"name":"Liebherr-Digital Development Center GmbH","member_since":"2025-04-23","renewal_date":"2027-04-01","description":{"long":"The Liebherr Group is a family-run technology company with a highly diversified product programme. The company is one of the largest construction equipment manufacturers in the world. It also provides high-quality, user-oriented products and services in a wide range of other areas. The Liebherr Group includes over 150 companies across all continents. In 2023, it employed more than 50,000 staff and achieved combined revenues of over 14 billion euros."},"logos":{"print":"https://membership.eclipse.org/organization/images/1747-print.eps","web":"https://membership.eclipse.org/organization/images/1747-web.png"},"website":"https://www.liebherr.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1748,"name":"The IO Foundation","member_since":"2025-04-24","renewal_date":"2027-05-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1748-web.png"},"website":"","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1749,"name":"EGI Foundation","member_since":"2025-05-06","renewal_date":"2026-06-01","description":{"long":"The EGI Foundation is the coordinating body of the EGI Federation. It offers a federation and management platform that enables service providers to harmonise interfaces and connect to a common hub.\nThe EGI Federation is the scalable digital infrastructure resulting from this coordination, serving thousands of researchers across disciplines. It provides advanced computing and data analytics capabilities through hundreds of public and private service providers, offering distributed computing, storage solutions, co-development opportunities, expert support, and training to propel scientific collaboration and innovation."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1749-web.png"},"website":"https://www.egi.eu","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"df911e0adcad1a1c51df","description":"Guest Member","level":"WGSAP","working_group":"asciidoc"}],"is_active_member":true},{"organization_id":1751,"name":"Stichting Connekt","member_since":"2025-05-09","renewal_date":"2027-05-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Strategic Member","level":"WGSD","working_group":"dataspace"}],"is_active_member":true},{"organization_id":1752,"name":"Open Source Matters Inc.","member_since":"2025-06-11","renewal_date":"2026-06-01","description":{"long":"Open Source Matters (OSM) is a not-for-profit organisation, incorporated in the United States, created to serve the financial and legal interests of the Joomla project. OSM has been designed to be flexible and change as the needs of Joomla! expand. At all times, OSM is fashioned to suit the needs of the Joomla project. OSM will also engage in regular self-assessment to ensure it is accountable to Joomla!, acting in Joomla!'s interest and ensuring that it is the right shape and size to support Joomla!."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1752-web.png"},"website":"https://www.joomla.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1754,"name":"GitHub","member_since":"2025-07-08","renewal_date":"2026-07-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1754-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1755,"name":"Engineering Ingegneria Informatica","member_since":"2025-07-22","renewal_date":"2026-08-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1755-web.png"},"website":"https://eng.it/en","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1756,"name":"ONERA DTIS","member_since":"2025-07-24","renewal_date":"2026-08-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1758,"name":"ifrOSS","member_since":"2025-09-02","renewal_date":"2026-09-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1760,"name":"Validas AG","member_since":"2025-09-09","renewal_date":"2026-09-01","description":{"long":"Validas is the driving force behind safe tools, libraries, and basic software. For 25 years, we have been supporting our international customers from the automotive, aerospace, and semiconductor industries with the qualification of tools, libraries, and basic software, as well as powerful qualification kits for code generators, compilers, and simulators. This ensures that the software used in cars, airplanes, or complex technical systems meets the highest safety requirements and common safety standards such as ISO 26262 or IEC 61508."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1760-web.png"},"website":"https://www.validas.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[],"is_active_member":true},{"organization_id":1761,"name":"Open Source Society Malta","member_since":"2025-09-24","renewal_date":"2026-09-01","description":{"long":"OSSMalta.eu is the premier open source community in Malta, fostering collaboration and knowledge-sharing. It promotes the adoption of open source technologies through educational initiatives and community building. As a member of the Eclipse Foundation's Open Regulatory Compliance Working Group (ORC WG), OSSMalta contributes to developing best practices and guidelines for open source actors to meet evolving regulatory requirements, such as those from the European Cyber Resilience Act. This membership reinforces our commitment to ensuring open source remains a viable and compliant option for developers and businesses across Europe."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1761-web.png"},"website":"https://ossmalta.eu","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1762,"name":"Brightskies","member_since":"2025-10-02","renewal_date":"2026-10-01","description":{"long":"Brightskies is a digital transformation enabler and market leader founded in 2012 with more than 400 employees. With over a decade of experience working closely with more than 50 clients, we guarantee exceptional results to help your business succeed and stand out.\nOur Automotive Services team has very strong experience developing safety-critical automotive systems to most of the car makers around the globe from the classical car makers where safety, security and certification represent the core principals to the disruptive ones where performance, technology and software-defined features are the main theme."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1762-web.png"},"website":"https://brightskiesinc.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1763,"name":"RT-RK DOO Novi Sad","member_since":"2025-10-06","renewal_date":"2026-10-01","description":{"long":"RT-RK is a premium embedded engineering company with over 30 years of experience and 600+ engineers. We help global leaders in the automotive, consumer electronics, and semiconductor industries turn complex ideas into dependable real-time systems. With expertise in both hardware and software development, RT-RK provides scalable technology and resource solutions that enable faster innovation, higher efficiency, and products built to perform at scale."},"logos":{"print":"https://membership.eclipse.org/organization/images/1763-print.eps","web":"https://membership.eclipse.org/organization/images/1763-web.png"},"website":"https://rt-rk.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1764,"name":"ZIUR Foundation","member_since":"2025-10-14","renewal_date":"2026-10-01","description":{"long":"Industrial Cybersecurity Center of Gipuzkoa\nWe are a public initiative created by the Gipuzkoa Provincial Council to help industrial companies reinforce their protection and that of their products or services against cyberattacks.\n\nWe live in a connected world that advances at a great speed. From ZIUR we help you go through that road of opportunities and threats with greater security.\n\nWe want to promote greater safety barriers against cyberthreats in the industrial field, to revitalize the sector of cybersecurity and to contribute to the competitiveness of the companies of our territory"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1764-web.png"},"website":"https://www.ziur.eus","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"},{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1767,"name":"Infosys Limited","member_since":"2025-10-27","renewal_date":"2026-11-01","description":{"long":""},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1767-web.png"},"website":"https://infosys.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1768,"name":"SignPath Foundation","member_since":"2025-11-10","renewal_date":"2026-11-01","description":{"long":"The SignPath Foundation supports open source projects by providing code signing certificates and a secure signing process through SignPath.io. We verify that binaries are built from the project’s public repository, eliminating the need for personal identity checks. Private keys are securely generated and stored on our HSM, enabling simple integration into automated build pipelines. Our goal is to make trustworthy software delivery accessible to OSS projects, and all services are free of charge."},"logos":{"print":"https://membership.eclipse.org/organization/images/1768-print.eps","web":"https://membership.eclipse.org/organization/images/1768-web.png"},"website":"https://signpath.org/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Foundation Member","level":"WGFDN","working_group":"orc"}],"is_active_member":true},{"organization_id":1769,"name":"WirelessCar","member_since":"2025-11-17","renewal_date":"2026-11-01","description":{"long":"WirelessCar is a leading innovator of digital vehicle services, accelerating the transformation toward software-defined mobility. With over 25 years of experience, we turn connected vehicle data into business value through scalable, cloud-based solutions spanning connectivity, journey intelligence, safety, and EV services. Connecting more than 17 million vehicles in over 100 countries, WirelessCar collaborates with global OEMs and industry partners to leverage the full value of connected services to empower future mobility."},"logos":{"print":"https://membership.eclipse.org/organization/images/1769-print.eps","web":"https://membership.eclipse.org/organization/images/1769-web.jpg"},"website":"https://www.wirelesscar.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1770,"name":"Libelium","member_since":"2025-11-18","renewal_date":"2026-11-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Participant Member","level":"WGAPS","working_group":"dataspace"},{"document_id":"efcdef5b284754c43de2","description":"Participant Member","level":"WGAPS","working_group":"orc"}],"is_active_member":true},{"organization_id":1771,"name":"mtrail Deutschland GmbH","member_since":"2025-11-24","renewal_date":"2026-11-01","description":{"long":"mtrail GmbH is a specialized Swiss engineering and software company that develops technology solutions for the international railway industry. Their services focus on traffic management, infrastructure modeling, and AI-based image recognition, notably through products like \"TrainVision\" and the \"RCS\" (Rail Control System) family. They cater primarily to major European railway operators and infrastructure managers, including Swiss Federal Railways (SBB), Deutsche Bahn (DB), and Infrabel."},"logos":{"print":"https://membership.eclipse.org/organization/images/1771-print.eps","web":"https://membership.eclipse.org/organization/images/1771-web.jpg"},"website":"http://www.mtrail.de","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fb4d6a3ddca7cfc1de0d","description":"","level":"WGSM","working_group":"eclipse-ide"}],"is_active_member":true},{"organization_id":1775,"name":"Openchip & Software Technologies S.L.","member_since":"2025-12-11","renewal_date":"2026-12-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1776,"name":"TRATON AB","member_since":"2025-12-21","renewal_date":"2027-01-01","description":{"long":"With its brands Scania, MAN, International, and Volkswagen Truck & Bus, the TRATON GROUP is one of the world’s leading commercial vehicle manufacturers. The Group’s product portfolio comprises trucks, buses, and light-duty commercial vehicles. “Transforming Transportation Together. For a sustainable world.”: this intention underlines the Company’s ambition to have a lasting and sustainable impact on the commercial vehicle business and on the Group’s commercial growth."},"logos":{"print":"https://membership.eclipse.org/organization/images/1776-print.eps","web":"https://membership.eclipse.org/organization/images/1776-web.png"},"website":"https://traton.com/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Strategic Member","level":"WGSD","working_group":"sdv"}],"is_active_member":true},{"organization_id":1777,"name":"LG CNS","member_since":"2025-12-21","renewal_date":"2026-12-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1777-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"e3985a1aead45e62ef7b","description":"Participant Member","level":"WGAPS","working_group":"jakarta-ee"}],"is_active_member":true},{"organization_id":1778,"name":"Fondazione CHIPS-IT","member_since":"2026-01-02","renewal_date":"2027-01-01","description":{"long":null},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1778-web.png"},"website":"","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1779,"name":"Associação TICE.PT","member_since":"2026-01-05","renewal_date":"2027-01-01","description":{"long":"TICE.PT is the Portuguese national cluster for Information, Communication, and Electronic Technologies, bringing together companies, universities, research centers, and other relevant entities in the sector. Officially recognized since 2009, the cluster acts as a collaborative platform that promotes innovation, knowledge transfer, and technological development, strengthening the competitiveness of the digital economy in Portugal.\n\nThrough cooperation among its members, TICE.PT seeks to enhance the national technological offering, support research and development projects, stimulate the creation of innovative products and services, and boost the internationalization of Portuguese companies."},"logos":{"print":"https://membership.eclipse.org/organization/images/1779-print.eps","web":"https://membership.eclipse.org/organization/images/1779-web.jpg"},"website":"https://tice.pt/en","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"1921b2dfac4cc9b00ad6","description":"Guest Member","level":"WGSAP","working_group":"dataspace"},{"document_id":"598b0ec4df9dcbb23499","description":"Guest Member","level":"WGSAP","working_group":"internet-things-iot"}],"is_active_member":true},{"organization_id":1780,"name":"Nilux GmbH","member_since":"2026-01-07","renewal_date":"2027-01-01","description":{"long":"Nilux GmbH is a Germany-based automotive software partner driving the transition toward Software-Defined Vehicles. We enable OEMs and Tier-1s to evolve from legacy, ECU-centric systems to scalable SDV architectures through AUTOSAR Classic & Adaptive, middleware, vehicle abstraction, cloud integration, and automotive cybersecurity. As an Eclipse SDV supporting member, Nilux positions itself as a pioneer service partner for SDV strategy, migration, and industrialization, translating open-source SDV innovation into production-ready, safety-compliant vehicle platforms."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1780-web.png"},"website":"https://nilux-gmbh.de/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1781,"name":"lowRISC C.I.C.","member_since":"2026-01-19","renewal_date":"2027-02-01","description":{"long":"Open Silicon Everywhere™\n\nlowRISC® C.I.C. (Community Interest Company) is a regulated not-for-profit company with a mission to help make open-source silicon a reality, commercially relevant, and widely adopted throughout the industry. \nWe aim to bring to semiconductors the enormous benefits that open-source already provides to software: transparency, reuse and collaboration.\n"},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1781-web.png"},"website":"https://lowrisc.org/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1782,"name":"ACTIA Group","member_since":"2026-01-21","renewal_date":"2027-02-01","description":{"long":"Founded in 1986, ACTIA Group is a mid-sized, family-owned international company designing and manufacturing electronic systems for demanding sectors including mobility, aerospace, space and energy. ACTIA supports its customers throughout the full product lifecycle, from design to production and services. The Group delivers robust, high-performance and competitive solutions, with strong industrial capabilities and supply chain expertise. Its organization enables responsiveness and execution across international markets, making ACTIA a reliable partner for complex electronic programs."},"logos":{"print":"https://membership.eclipse.org/organization/images/1782-print.eps","web":"https://membership.eclipse.org/organization/images/1782-web.png"},"website":"https://www.actia.com","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1784,"name":"AINekko, Co.","member_since":"2026-02-24","renewal_date":"2027-03-01","description":{"long":"Ainekko develops RISC-V–based compute platforms for AI applications on the edge and contributes to the open hardware ecosystem through collaboration with the OpenHW Group and the broader RISC-V community."},"logos":{"print":"https://membership.eclipse.org/organization/images/1784-print.eps","web":"https://membership.eclipse.org/organization/images/1784-web.png"},"website":"https://nekko.ai/","levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1785,"name":"Appraid-tech","member_since":"2026-02-24","renewal_date":"2027-03-01","description":{"long":""},"logos":{"print":"https://membership.eclipse.org/organization/images/1785-print.eps","web":"https://membership.eclipse.org/organization/images/1785-web.png"},"website":"https://www.appraid-tech.com/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Guest Member","level":"WGSAP","working_group":"sdv"}],"is_active_member":true},{"organization_id":1786,"name":"Applied Intuition Inc.","member_since":"2026-02-25","renewal_date":"2027-03-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Supporting Member","level":"WGSM","working_group":"sdv"}],"is_active_member":true},{"organization_id":1788,"name":"42dot Inc.","member_since":"2026-03-09","renewal_date":"2027-03-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"fbb9be0bc283dc584b23","description":"Participant Member","level":"WGAPS","working_group":"sdv"}],"is_active_member":true},{"organization_id":1789,"name":"Beijing Academy of Artificial Intelligence (BAAI)","member_since":"2026-03-10","renewal_date":"2027-03-01","description":{"long":"Beijing Academy of Artificial Intelligence(BAAI) is a non-profit new research and development institution established in November 2018. It is committed to becoming a leader in artificial intelligence innovation, creating the best academic and technological innovation ecosystem globally, tackling the most fundamental and critical problems, and serving as the source of academic ideas, basic theories, top talents, enterprise innovation, and development policies for artificial intelligence worldwide, thereby promoting sustainable development for humanity, the environment, and intelligence."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1789-web.png"},"website":"https://www.baai.ac.cn","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1790,"name":"Open Culture Foundation","member_since":"2026-04-09","renewal_date":"2027-04-01","description":{"long":"Open Culture Foundation is a non-profit organization. Through promoting open technology and cross-field collaboration, we continue to connect tech communities and other public and private entities in Taiwan. By doing so, we work to promote open co-creation and protect digital rights, and thereby support a more transparent and inclusive digital civil society.\nSince 2014, we have functioned as a legal entity and supported over 30 open technology communities in Taiwan. Throughout this process, we have not only continued to promote the idea of open technology, we have also become involved in policy advocacy and spoken up for the public's digital rights."},"logos":{"print":null,"web":"https://membership.eclipse.org/organization/images/1790-web.png"},"website":"https://ocf.tw/en/","levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[{"document_id":"efcdef5b284754c43de2","description":"Guest Member","level":"WGSAP","working_group":"orc"}],"is_active_member":true},{"organization_id":1791,"name":"Mosaic SoC","member_since":"2026-04-14","renewal_date":"2027-04-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"ecd63e75a561bffe2ffc","description":"Participant Member","level":"WGAPS","working_group":"openhw-foundation"}],"is_active_member":true},{"organization_id":1792,"name":"Fundación para la Transparencia del Software","member_since":"2026-04-16","renewal_date":"2027-04-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AS","description":"Associate Member","sort_order":"100"}],"wgpas":[],"is_active_member":true},{"organization_id":1793,"name":"AUTOSOL, LP","member_since":"2026-05-07","renewal_date":"2027-05-01","description":null,"logos":{"print":null,"web":null},"website":null,"levels":[{"level":"AP","description":"Contributing Member","sort_order":"200"}],"wgpas":[{"document_id":"f351fc9ba96cb468393f","description":"Strategic Member","level":"WGSD","working_group":"sparkplug"}],"is_active_member":true}] \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Code Cache/js/index-dir/the-real-index b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Code Cache/js/index-dir/the-real-index index a71290d1f9471b5c8a827da50ae94f2d5c4980df..7cace5f2e36ecf9cc032325a85909b257e2713f7 100644 GIT binary patch delta 38 rcmeb9;Ba7IV91)G89I?eQ`}VWk?{t71_nK#7!Z7AOyK>yUY`K~qE`sm delta 38 rcmeb9;Ba7IVCZa!G?>VtDefbZ&%Z&Rfk6)_1_WOj6L|lw*Jl6#n!pHc diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DIPS b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DIPS index cd010b2c2db6e8fba2c17734bff82f9523835dc0..055e1079cda6e50ba70b5a6563081d6dfed193e1 100644 GIT binary patch delta 69 zcmZozz|^pSX~PqH8A)bcwvx=;)S~#D#Nv|pw9KN^6bAhbO7(Rwvx=;)S~#D#Nv|pw9KN^6bAhbd`*c{iZ(g?=V#>J6mW;1 Zk!AATcsW)^Q{NM3HYET>Sr!#2004AD8AbpA diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DIPS-wal b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DIPS-wal index 8c8188ea37b3d226b975d9ff7912e5db682d4082..3c9a3866457b3a3b866a392fd7e8c7fb618dba65 100644 GIT binary patch literal 74192 zcmeI*OK22#0LSs!tZvfQuwsM8Ok$+#tI`-~10Jdriq{~53PNd8;wq8!!A4pEJoqS7Q1Kw%B9v0-MG|cBaZ*}oi$)r2|67~l$P~|=`7FDax&1!-zwGeM zWc5ht!>H?8YZT3m>aXHwA2;qDdVgSY_m}hUP25})E|ng?-h1}o?yDnzUTzK-3+0I@ zyuAnzAV7cs0RjXF5FkK+0D=FXK&7#%Qu_Nxe|2DJ@V(*cs&{MKqwZ4=n)^4Nh`LW# z8m9l~39}l*=b4%N1xHrBaB*#G=jgNHVxfE|3U4n01PBlyK!5-N0t5&UAV44^0_9?* z@YrpF`aOX}FYxp8lSj6+wvFipGV+C+L4W`O0t5&UAV7cs0Rnjys5CvT7kId@{_{W4 z3+y@d%0$n@jyLoIc|A6E6Cgl<009C72oNAZfIyZ7p6CUd!q!>!y)%DD&~V_@hG=tT z;iF#QdQ`riWewX15FkK+009C72oNAZfI#L2;_t2IIJZ=fB*pk1PBlyK!5;& z%nHOE|IrIfEdAhoSe@tvn&vGy*0H_Ps29lWc`%Fs0RjXF5FkK+009C7@+pwk3v>jE zL@&_ZzoB&W_hY~41@d`FtR_H!009C72oNAZfB=Ea3B-%idx7O&pX=Eb)+Ty^Eq$YB z4}UxQg$8D;9|4|+43Gc- diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DawnGraphiteCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DawnGraphiteCache/data_1 index a0957eae47814f7fcf412de64b8f51672e35898b..97f28542ccefdcbf09f79ab5c053b0e39c3a4231 100644 GIT binary patch delta 32 mcmZoTAkc6?V8aasCKsNGfqKmxitQYVj6lq^okNlN$3FnK5ekz4 delta 32 mcmZoTAkc6?V8aasCOyuHfqKmxitQYVj6lq^okNlN$3FnH?h1MU diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DawnWebGPUCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/DawnWebGPUCache/data_1 index 62d956ac67cef7ab5257b6941f2c8e75c49d4002..9cd92b650c1a3973e734d455d10a152e0e0a5a19 100644 GIT binary patch delta 32 mcmZoTAkc6?V8aasCKsNGfqKmxitQYVj6lq^okNlN$3FnK5ekz4 delta 32 mcmZoTAkc6?V8aasCOyuHfqKmxitQYVj6lq^okNlN$3FnH?h1MU diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Extension State/LOG.old b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Extension State/LOG.old index f438ea6..a7f1fbf 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Extension State/LOG.old +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Extension State/LOG.old @@ -1,3 +1,3 @@ -2026/05/10-01:32:20.887 2aa0 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Extension State/MANIFEST-000001 -2026/05/10-01:32:20.887 2aa0 Recovering log #3 -2026/05/10-01:32:20.888 2aa0 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Extension State/000003.log +2026/05/11-17:52:04.774 3008 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Extension State/MANIFEST-000001 +2026/05/11-17:52:04.775 3008 Recovering log #3 +2026/05/11-17:52:04.775 3008 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Extension State/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/GPUCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/GPUCache/data_1 index f29b34010c055b6f1e88119eef479f6473558b92..2f4e8821fd185d0f0932e51bebef4d99a09ebb49 100644 GIT binary patch delta 32 mcmZoTAkc6?V8aasCKsNGfqKmxitQYVj6lq^okNlN$3FnK5ekz4 delta 32 mcmZoTAkc6?V8aasCOyuHfqKmxitQYVj6lq^okNlN$3FnH?h1MU diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/History b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/History index c2f024be955de4b686c4eb1967448205dbe033bf..c0df5374b26380d49a9655fe60c89ceb06477e58 100644 GIT binary patch delta 32669 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 E3!r8Cz5oCK delta 2809 zcmaJ?dsviJ8vo9B-gEgb^PS-$Ah9|WsF=#2U|v#Cvm`^YRai!YEuM3tjW3?@%7d8S)@oDj#wSAmGE1|e=Lzf~DVmn~FhW|>=%h6J(%jMYF}eg{Ud0VGLE>Si7fAZ%XF== zuC_~{h`Q}i>kwy?CO#JH#Tcj4*`zA1a^Mz1G`Vd7%62=ZqiDp5vqf{xi)`1MkGee7 zKJP|%%L0@a;SkZHiHqVV(IHNXmOw=Qr^0Pni+tW_F6L{ZQ+y*1h)S_b)QVy;Uj?5m zFm9`g{GE#3EDnoOD(66Fj{= zntj*~*sJZ?_DDO{>aZHDTI+sml9gg1^RQWGK4#7|hnbN^t5I(}Z7el%j9&aQ|D12- zD|kL1$|G4T+ryq=%h&|gi+0gNbO&8U3+SCgoebKIbdW}}kt`>AXVFLK1yqElpj5=P=HMj$=aXDIPEIPo-QCdz z_(#B3m-dzi=8#y~mX9r*SlUZAorG9-(i}`V?pc~FznOu%dBV^isA)(`S|ro%z){kB zHwJg{0=yncx*hM*OBc!a7UNjy+l38x{9>Hwpxz3@ud|wuBAeAoLjT>>m=iQCufqKkb`2qf;>7o*N6eWoP_7Z!R zJ;fep53~E(J#4S7Tl=idn-RcRxLXO+*Q+%Gf&MH`e z-O0!BtLO?TdcI7p9oh+3r3s)QLuYEOl6{R^aB`U~BTnErcXkvkLO7{Rmph)vapJ>o z?|&&c65?MxBB>08l5J+hX;kK$hICyF3SsDbUUKqB*%$m@xj-Ol7pkbaWDT4NMx*b#`sRL%CT%s z{Nxbpyy)CLI!B6mS`Ir13{1g5m-^F+G9sCu(iErTR z`Qr-rCHw)tg#U@p;&<{Xd?FvmNAY2N5bwv6i+K+o%e~y-I=jHmu{QQSYi5U76Whn? z**olYwv}yWwd^Ujj#aR7R-}ltkj-TU><)GtyM>KqBiVJ#&r;ac>?#(`Jd7$*{Y*RQ zNqU?frJvEi)4g;zeUsMFztR`zGxSNimae3wbU7`g_t4_mbUMwWxip)Oro(AE?N58r zo-~d|P?KVEk^D&7$v?^0xmNGAckQ;x7KIm3C>6F6#V{3lc8^XP3dO}ipZb<1K{~5**loED1rd-gq zA%k3d8PY*ZD(@2(X&3y0lgblA6mp-P3v(D&JH=&-00kQ@!Z^BoiL5Gw828zwaF-Qa z2q*Apmt~QI!3%S*?4#^5_<*>NuZAVqxw1$S^Y~0ajjnSTFTvcj*CAngHJ4YyScGcj zgeo{B`>lfuB!R^+uiL8{E(SMTyDoh$5Vu+I1R??=@Yz9pc$0pBIPAOnwWFk|5j) z*jxWU^={Y{oLI+iIY$%vTZUhB=20Epj8;pw9j~ueH*sok_9@WQ-P#1VIXBq_n$KK` z)&GB;s1UQn2!}amoPEwlXSs8mx!v=%=S_2^XTIk~Yma@wK4`ycKWZLQ{|QmnDeD;p z@rhO+OY^K(MP!+BM;r9flgnk|Y!WSV+kkkhul=DRgrtEf2|3B-^TOz!X$vy?9xnXGSJf*1Xr2a>JS6E%t2I)9a^%YvkeOtj% xF8N{Gxi-i^Q^TSCr@;fFyOtD;DkrwXhoGkOYmPkG*$&<1?WbY$W>ibO{|3u5D4_rV diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/000003.log b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/000003.log index dacf3f2183a4b8c7b065770a33dd8204115e699d..8ac4a90fee4b0c99a18eb8a6f2969a287312fa50 100644 GIT binary patch delta 7 OcmWH~nh-wGMHm1JUILK- delta 4 Lcmc}_pAZfJ1SkQi diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG index 58be978..e69de29 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG @@ -1,3 +0,0 @@ -2026/05/10-18:30:40.011 292c Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 -2026/05/10-18:30:40.021 292c Recovering log #3 -2026/05/10-18:30:40.022 292c Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG.old b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG.old index ec86aee..ff43aef 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG.old +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Local Storage/leveldb/LOG.old @@ -1,3 +1,3 @@ -2026/05/10-01:32:20.890 744 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 -2026/05/10-01:32:20.897 744 Recovering log #3 -2026/05/10-01:32:20.898 744 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/000003.log +2026/05/11-17:52:04.805 22c0 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/MANIFEST-000001 +2026/05/11-17:52:04.891 22c0 Recovering log #3 +2026/05/11-17:52:04.918 22c0 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Local Storage\leveldb/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Network/TransportSecurity b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Network/TransportSecurity index 088abd0..7692e8f 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Network/TransportSecurity +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Network/TransportSecurity @@ -1 +1 @@ -{"sts":[{"expiry":1809887691.64094,"host":"Bb6CfwBW9xa4G2DyhI27lujzIm9QMX4njeP0qgg7n+Y=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778351691.640946},{"expiry":1809966643.589161,"host":"5AUdaPrjbZpycMJSfvB4F6jmmAfkjR133lCOp+js4+E=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778430643.589164},{"expiry":1809887692.184129,"host":"6Rxq1ifSWlOJhzOYYdWRhfgKRZ4jrGi2e5lJ0HKREHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778351692.184138}],"version":2} \ No newline at end of file +{"sts":[{"expiry":1810050726.011535,"host":"Bb6CfwBW9xa4G2DyhI27lujzIm9QMX4njeP0qgg7n+Y=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778514726.011542},{"expiry":1810123191.276278,"host":"5AUdaPrjbZpycMJSfvB4F6jmmAfkjR133lCOp+js4+E=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778587191.276281},{"expiry":1809887692.184129,"host":"6Rxq1ifSWlOJhzOYYdWRhfgKRZ4jrGi2e5lJ0HKREHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1778351692.184138}],"version":2} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Preferences b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Preferences index 91da2c1..31d45d7 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Preferences +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Preferences @@ -1 +1 @@ -{"aadc_info":{"age_group":3},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13422911690305312","autocomplete":{"retention_policy_last_version":147},"autofill":{"edge_autofill_advanced_ml_enabled":false,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":147},"bookmark":{"storage_computation_last_update":"13422911690303915"},"browser":{"available_dark_theme_options":"All","recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0],"show_toolbar_edge_generic_sidebar_button":false,"theme":{"color_scheme2":2},"user_level_features_context":{}},"browser_content_container_height":67,"browser_content_container_width":183,"browser_content_container_x":0,"browser_content_container_y":0,"commerce_daily_metrics_last_update_time":"13422911690304426","countryid_at_install":18772,"credentials_enable_service":false,"edge":{"bookmarks":{"last_dup_info_record_time":"13422825300291938"},"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"3165f288-04ad-476d-92d1-abea48bbc919"}},"edge_journeys":{"latest_journeys_count":0},"edge_rewards":{"cache_data":"CAA=","coachmark_promotions":{},"hva_promotions":[],"hva_webui_action_status_dict":{},"refresh_status_muted_until":"13423430090265996"},"edge_ux_config":{"assignmentcontext":"","dataversion":"0","experimentvariables":{},"flights":{}},"edge_vpn":{"available":true},"edge_wallet":{"passwords":{"password_lost_report_date":"13422825320278890"}},"enterprise_profile_guid":"c9c307cc-82a2-4be9-89c0-04edbd9e6415","extension":{"installed_extension_count":2},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"147.0.3912.98","pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"fsd":{"retention_policy_last_version":147},"gaia_cookie":{"periodic_report_time_2":"13422911690272491"},"intl":{"selected_languages":"en-GB,en,en-US"},"language_dwell_time_average":{"en":19375.166666666668,"it":3.0},"language_model_counters":{"en":11,"it":1},"language_usage_count":{"en":6,"it":1},"media":{"engagement":{"schema_version":5}},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13422911690304680","values_seen":[]},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"V8_COMPILE_HINTS":true}},"password_manager":{"account_store_backup_password_cleaning_last_timestamp":"13422825350282160","account_store_migrated_to_os_crypt_async":true,"profile_store_backup_password_cleaning_last_timestamp":"13422825350282713","profile_store_migrated_to_os_crypt_async":true},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13424909115774370"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{"file:///*,*":{"last_modified":"13422987294856216","setting":{}},"https://[*.]eclipse.org,*":{"last_modified":"13422904240321357","setting":{}}},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{"https://www.eclipse.org:443,*":{"expiration":"13430677242302836","last_modified":"13422901242302841","lifetime":"7776000000000","setting":{"hasHighScore":false,"lastMediaPlaybackTime":0.0,"mediaPlaybacks":0,"visits":3}}},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{"https://www.eclipse.org:443,*":{"last_modified":"13422985902453009","setting":{"lastEngagementTime":1.342295710245282e+16,"lastShortcutLaunchTime":0.0,"pointsAddedToday":0.0,"rawScore":11.7105321135}}},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"147.0.3912.98","creation_time":"13422825290227113","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"a229742e-1a76-40e7-b7b9-b0cbc2f225f1","edge_user_with_non_zero_passwords":false,"exit_type":"Normal","has_seen_signin_fre":false,"is_relative_to_aad":false,"last_engagement_time":"13422957102452820","last_time_obsolete_http_credentials_removed":1778351750.282291,"last_time_password_store_metrics_reported":1778351720.277159,"managed_user_id":"","name":"Profile 1","network_pbs":{},"observed_session_time":{"feedback_rating_in_product_help_observed_session_time_key_147.0.3912.98":7.0},"password_hash_data_list":[],"signin_fre_seen_time":"13422825290260630","were_old_google_logins_removed":true},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13422825290268704","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":1,"time":"13422825356403533","type":2,"window_count":1},{"crashed":false,"time":"13422843140823994","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13422843168919448","type":2,"window_count":3},{"crashed":false,"time":"13422904239947130","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13422905046795006","type":2,"window_count":3}],"session_data_status":1},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-GB"]},"syncing_theme_prefs_migrated_to_non_syncing":true,"tab_search":{"pinned_to_tabstrip":false,"pinned_to_tabstrip_migration_complete":true},"total_passwords_available_for_account":0,"total_passwords_available_for_profile":0,"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"webrtc":{"udp_port_range":"0-0"}} \ No newline at end of file +{"aadc_info":{"age_group":3},"accessibility":{"captions":{"headless_caption_enabled":false}},"account_tracker_service_last_update":"13423001237298263","autocomplete":{"retention_policy_last_version":147},"autofill":{"edge_autofill_advanced_ml_enabled":false,"edge_autofill_purge_low_quality_profiles_by_timeline":false,"last_version_deduped":147},"bookmark":{"storage_computation_last_update":"13423001237298449"},"browser":{"available_dark_theme_options":"All","recent_theme_color_list":[4293914607.0,4293914607.0,4293914607.0,4293914607.0,4293914607.0],"show_toolbar_edge_generic_sidebar_button":false,"theme":{"color_scheme2":2},"user_level_features_context":{}},"browser_content_container_height":135,"browser_content_container_width":339,"browser_content_container_x":0,"browser_content_container_y":0,"commerce_daily_metrics_last_update_time":"13423001237299261","countryid_at_install":18772,"credentials_enable_service":false,"edge":{"bookmarks":{"last_dup_info_record_time":"13422988334590120"},"msa_sso_info":{"allow_for_non_msa_profile":true},"profile_sso_info":{"is_msa_first_profile":true,"msa_sso_algo_state":1},"services":{"signin_scoped_device_id":"9d99cb2d-9037-4213-b239-f879b7cdfbc4"}},"edge_journeys":{"latest_journeys_count":0},"edge_rewards":{"cache_data":"CAA=","coachmark_promotions":{},"hva_promotions":[],"hva_webui_action_status_dict":{},"refresh_status_muted_until":"13423430090265996"},"edge_ux_config":{"assignmentcontext":"","dataversion":"0","experimentvariables":{},"flights":{}},"edge_vpn":{"available":true},"edge_wallet":{"passwords":{"password_lost_report_date":"13422988354565399"}},"enterprise_profile_guid":"c9c307cc-82a2-4be9-89c0-04edbd9e6415","extension":{"installed_extension_count":2},"extensions":{"alerts":{"initialized":true},"chrome_url_overrides":{},"last_chrome_version":"147.0.3912.98","pdf_upsell_triggered":false,"pinned_extension_migration":true,"pinned_extensions":[]},"fsd":{"retention_policy_last_version":147},"gaia_cookie":{"periodic_report_time_2":"13423001237298631"},"intl":{"selected_languages":"en-GB,en,en-US"},"language_dwell_time_average":{"en":35521.375,"it":3.0,"lb":9.0},"language_model_counters":{"en":15,"it":1,"lb":3},"language_usage_count":{"en":8,"it":1,"lb":1},"media":{"engagement":{"schema_version":5}},"migrated_user_scripts_toggle":true,"muid":{"last_sync":"13423001237298163","values_seen":[]},"optimization_guide":{"hintsfetcher":{"hosts_successfully_fetched":{}},"previously_registered_optimization_types":{"ABOUT_THIS_SITE":true,"AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST":true,"GLIC_ACTION_PAGE_BLOCK":true,"HISTORY_CLUSTERS":true,"LOADING_PREDICTOR":true,"MERCHANT_TRUST_SIGNALS_V2":true,"PAGE_ENTITIES":true,"PRICE_TRACKING":true,"SALIENT_IMAGE":true,"SAVED_TAB_GROUP":true,"V8_COMPILE_HINTS":true}},"password_manager":{"account_store_backup_password_cleaning_last_timestamp":"13422825350282160","account_store_migrated_to_os_crypt_async":true,"profile_store_backup_password_cleaning_last_timestamp":"13422825350282713","profile_store_migrated_to_os_crypt_async":true},"personalization_data_consent":{"personalization_in_context_consent_can_prompt":true,"personalization_in_context_count":0},"privacy_sandbox":{"first_party_sets_data_access_allowed_initialized":true},"profile":{"avatar_index":20,"background_password_check":{"check_fri_weight":9,"check_interval":"2592000000000","check_mon_weight":6,"check_sat_weight":6,"check_sun_weight":6,"check_thu_weight":9,"check_tue_weight":9,"check_wed_weight":9,"next_check_time":"13424909115774370"},"content_settings":{"exceptions":{"3pcd_heuristics_grants":{},"abusive_notification_permissions":{},"access_to_get_all_screens_media_in_session":{},"anti_abuse":{},"app_banner":{},"ar":{},"are_suspicious_notifications_allowlisted_by_user":{},"auto_picture_in_picture":{},"auto_select_certificate":{},"automatic_downloads":{},"automatic_fullscreen":{},"autoplay":{},"background_sync":{},"bluetooth_chooser_data":{},"bluetooth_guard":{},"bluetooth_scanning":{},"camera_pan_tilt_zoom":{},"captured_surface_control":{},"clear_browsing_data_cookies_exceptions":{},"client_hints":{},"clipboard":{},"controlled_frame":{},"cookie_controls_metadata":{"file:///*,*":{"last_modified":"13423062967160860","setting":{}},"https://[*.]eclipse.org,*":{"last_modified":"13423060788778495","setting":{}}},"cookies":{},"direct_sockets":{},"direct_sockets_private_network_access":{},"display_media_system_audio":{},"disruptive_notification_permissions":{},"durable_storage":{},"edge_ad_targeting":{},"edge_ad_targeting_data":{},"edge_all_file_read_access":{},"edge_browser_action":{},"edge_sdsm":{},"edge_split_screen":{},"edge_tech_scam_detection":{},"edge_u2f_api_request":{},"edge_user_agent_token":{},"fedcm_idp_registration":{},"fedcm_idp_signin":{},"fedcm_share":{},"file_system_access_chooser_data":{},"file_system_access_extended_permission":{},"file_system_access_restore_permission":{},"file_system_last_picked_directory":{},"file_system_read_guard":{},"file_system_write_guard":{},"formfill_metadata":{},"geolocation":{},"geolocation_with_options":{},"hand_tracking":{},"has_migrated_local_network_access":true,"hid_chooser_data":{},"hid_guard":{},"http_allowed":{},"https_enforced":{},"idle_detection":{},"images":{},"important_site_info":{},"initialized_translations":{},"intent_picker_auto_display":{},"javascript":{},"javascript_jit":{},"javascript_optimizer":{},"keyboard_lock":{},"legacy_cookie_access":{},"legacy_cookie_scope":{},"local_fonts":{},"local_network":{},"local_network_access":{},"loopback_network":{},"media_engagement":{"https://www.eclipse.org:443,*":{"expiration":"13430764207030926","last_modified":"13422988207030932","lifetime":"7776000000000","setting":{"hasHighScore":false,"lastMediaPlaybackTime":0.0,"mediaPlaybacks":0,"visits":5}}},"media_stream_camera":{},"media_stream_mic":{},"midi_sysex":{},"mixed_script":{},"nfc_devices":{},"notification_interactions":{},"notification_permission_review":{},"notifications":{},"ondevice_languages_downloaded":{},"password_protection":{},"payment_handler":{},"permission_actions_history":{},"permission_autoblocking_data":{},"permission_autorevocation_data":{},"pointer_lock":{},"popups":{},"protected_media_identifier":{},"protocol_handler":{},"reduced_accept_language":{},"safe_browsing_url_check_data":{},"secure_network":{},"secure_network_sites":{},"sensors":{},"serial_chooser_data":{},"serial_guard":{},"site_engagement":{"https://www.eclipse.org:443,*":{"last_modified":"13423060788781450","setting":{"lastEngagementTime":1.342306078878144e+16,"lastShortcutLaunchTime":0.0,"pointsAddedToday":4.5,"rawScore":19.99711684546938}}},"sleeping_tabs":{},"sound":{},"speaker_selection":{},"ssl_cert_decisions":{},"storage_access":{},"storage_access_header_origin_trial":{},"subresource_filter":{},"subresource_filter_data":{},"suspicious_notification_ids":{},"suspicious_notification_show_original":{},"top_level_storage_access":{},"trackers":{},"trackers_data":{},"tracking_org_exceptions":{},"tracking_org_relationships":{},"typosquatting":{},"unused_site_permissions":{},"usb_chooser_data":{},"usb_guard":{},"vr":{},"web_app_installation":{},"webid_api":{},"webid_auto_reauthn":{},"window_placement":{}},"pref_version":1},"created_by_version":"147.0.3912.98","creation_time":"13422825290227113","default_content_setting_values":{"has_migrated_local_network_access":true},"edge_password_is_using_new_login_db_path":false,"edge_password_login_db_path_flip_flop_count":0,"edge_profile_id":"a229742e-1a76-40e7-b7b9-b0cbc2f225f1","edge_user_with_non_zero_passwords":false,"exit_type":"Normal","has_seen_signin_fre":false,"is_relative_to_aad":false,"last_engagement_time":"13423060788781439","last_time_obsolete_http_credentials_removed":1778351750.282291,"last_time_password_store_metrics_reported":1778514754.564646,"managed_user_id":"","name":"Profile 1","network_pbs":{},"observed_session_time":{"feedback_rating_in_product_help_observed_session_time_key_147.0.3912.98":7.0},"password_hash_data_list":[],"signin_fre_seen_time":"13422825290260630","were_old_google_logins_removed":true},"reset_prepopulated_engines":false,"safety_hub":{"unused_site_permissions_revocation":{"migration_completed":true}},"saved_tab_groups":{"did_enable_shared_tab_groups_in_last_session":false,"specifics_to_data_migration":true},"sessions":{"event_log":[{"crashed":false,"time":"13422825290268704","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":1,"time":"13422825356403533","type":2,"window_count":1},{"crashed":false,"time":"13422843140823994","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13422843168919448","type":2,"window_count":3},{"crashed":false,"time":"13422904239947130","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13422905046795006","type":2,"window_count":3},{"crashed":false,"time":"13422988324555180","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13422991310815867","type":2,"window_count":3},{"crashed":false,"time":"13423060788521975","type":0},{"did_schedule_command":false,"first_session_service":true,"tab_count":3,"time":"13423061419290311","type":2,"window_count":3}],"session_data_status":1},"signin":{"accounts_metadata_dict":{},"allowed":true},"spellcheck":{"dictionaries":["en-GB"]},"syncing_theme_prefs_migrated_to_non_syncing":true,"tab_search":{"pinned_to_tabstrip":false,"pinned_to_tabstrip_migration_complete":true},"total_passwords_available_for_account":0,"total_passwords_available_for_profile":0,"translate_site_blacklist":[],"translate_site_blocklist_with_time":{},"typosquatting":{"allowlist_migration_done":true},"user_experience_metrics":{"personalization_data_consent_enabled_last_known_value":false},"webrtc":{"udp_port_range":"0-0"}} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Secure Preferences b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Secure Preferences index 087bf40..b282223 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Secure Preferences +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Secure Preferences @@ -1 +1 @@ -{"extensions":{"settings":{"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13422825290276856","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13422825290276856","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application\\147.0.3912.98\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13422825290276320","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13422825290276320","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1","web_accessible_resources":["pdf_embedder.css"]},"path":"C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application\\147.0.3912.98\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"EF8E04BCF6F7C232231E69DAE481170653D82ED686DDBF2991FEFD946EB7522E","show_home_button_encrypted_hash":"djEwES0pBeA6lQPz4lNbUECw65WK0BMloADMhqKdbIa/fznAey0Kth2p+EaK0w0axHpT1rPQWjXtSIWwMnDd"},"default_search_provider_data":{"template_url_data":"FCFE985DC4470CDE6D77C27E055CB0622C9CC7AD6BC6B9E1847519F7B8DEE144","template_url_data_encrypted_hash":"djEwk7S2do81tv8/2L6h4wuBu5o+3bXC9QwSFWqgY8ZvxW3VlZk6bQSdj4stYDJuvNmG603nhlQBrz8+3XXR"},"edge":{"services":{"account_id":"CEF02DAD6F29EDA114575937C8F508621AE39F5C2738FAEDF89FCBB71E1C1BA3","account_id_encrypted_hash":"djEw2BOo4Kw3h6SJFCTtF0wwbvdgCwecr5lrbyHqTlUCCvoLFYf6+cesaU/wjwuSjr6tKBKYcYf/HW1ENfxj","last_username":"103B84FBAB0098687AD51A1C08493EFDAEB5F7EF6D86BBE2F39A61127527FBB7","last_username_encrypted_hash":"djEwKmCwiq8DXtbQFFTv/utTpP2GW1/+skfUThLjoikfLfFBm09xvIDwkygInruh6ATopBOkLxYbWWUiNDwf"}},"enterprise_signin":{"policy_recovery_token":"CD42B0D9C6B42377D8101DB574DD3166F3A9E94F1DB639394916929D5EF5DAC2","policy_recovery_token_encrypted_hash":"djEwNrdta60Rpxq10CEnFFeNfJ4R2AD+l08FSV/8ytPRhcvQ/t21kvZS+qENMRWWYBSEKlr60wqSuNHExTq+"},"extensions":{"install":{"initiallist":"3E78B078F98B045DFE906AB9531C92D6208035B4C12DBA309EFB5E15958EB4A5","initiallist_encrypted_hash":"djEwBeIvUIayxyzG3p8lnU9BbL4Pt/TrkTABdvc6frgnnW+bCnGGlZVVpvlW8Zwd8a0hjCHogn3wLlOyizRF","initialprovidername":"40E3B3529940888791F691E760B354D1975C4DE1C69D4F79D038D1E6E57213DF","initialprovidername_encrypted_hash":"djEw/RZ00y2uQPAXebeeNPsDwujFQLhfALCaJ2CzqAW4i8rymg/7qRLG09FxhrHmilW2jzcoWUFfgc6Wdl2M"},"settings":{"dgiklkfkllikcanfonkcabmbdfmgleag":"DA5FA348ACCFF784D34BB92F5675EE2FB160B53982751D3826CC007363E8284B","mhjfbmdgcfjbbpaeojofohoefgiehjai":"E5EC068D6C43F3F738FE1B38C3A7D681AD40CE86A10355B79FC06F895BAC9828"},"settings_encrypted_hash":{"dgiklkfkllikcanfonkcabmbdfmgleag":"djEwW/W9yUl95wR3OGLokJJFO8ZdrKccBm/uMXPM/U7lceKoZfJlKHCRfpUzZ5FDiAFsm1F9er0eUXOHd+zi","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEwnyvcsab2OJaIfppRjaBRM84Crj6e0RZtWqcCGW5W4ZPKNYoozij1UymuHY09paRQQikacNHSTx4jg5jU"},"ui":{"developer_mode":"2DBEBCCD41AA2009A8A787B8BD6D40749D4BAE6F5B4C817F2185B896E17E2F88","developer_mode_encrypted_hash":"djEwc7uGx7laHV7W1VeuE37LFm0BkWXFziluUFpLwYjlZ8G85nhu/97IJuOPM0ETB3TSnKCZruEBTDB0hkkk"}},"google":{"services":{"last_signed_in_username":"072FB2F17167EF75B4CFC99246F44C08AC2BBEF6A9E38CE03B2024A42C23FE84","last_signed_in_username_encrypted_hash":"djEwRlCeGX7jE9sPz2CVaSwjnPIfAyWRVM+Tz88xtVtDNXr2uYBtVWH9m0eOcuSNMeDMrb5HbPZ/2JhWXdfI"}},"homepage":"78069B504433DDA1B1E463C057E727B790FEF1FCC64CAB5672F563FF4BE366FF","homepage_encrypted_hash":"djEwrJlCKVFmpUuUVIESwO6doE6i65oaHdi9zv8KtqJx0U8+SuFQuNzz++EspSwwbvs9cmAwYiPdOJcPRWrJ","homepage_is_newtabpage":"F733D8383D60B3033BE28BA305EECEDE724D34C8FD94B30025F423B51393A590","homepage_is_newtabpage_encrypted_hash":"djEwJpUKpUaA0PwCbjzUz6Kq3rMtRB8wstyYgaiblVPMuSxRIfrR/GFrOOafP4ZJdKxPP2LTRIgnWY+LvX6F","media":{"cdm":{"origin_data":"D37EC83B68B1EF5650F106F4A24081A49B4DF9F5678E7EC6A85E161A98A08E4B","origin_data_encrypted_hash":"djEwdQ7rDoX63F/XSRYoVfMgil31wvOsgqJ/0y3L6ge0qUjgoEWFAV92tS7g2/XOOl4MlZzDbTLcfz+Ux3vQ"},"storage_id_salt":"B2E9290C6F6859BEB974309F06D9E137958B4AE07302B17AAE243C417F7EA569","storage_id_salt_encrypted_hash":"djEwWEHlCtv0RH9ELuLgmZKcSQHDo4seZyhpKGt0/mF4uhgBm8r4+FLS4cvv5d0X7vUWQ3ywFYnuRcELhJMT"},"pinned_tabs":"6EE16DC2F5850603ED8BDEA03AEFF18B572EE9FFFBC60EA1A9EED8FA68C0F5DB","pinned_tabs_encrypted_hash":"djEwaDpUbF6uLpBoOnz68xWzcRz2R5GJpdWpdukE7MrYcEc5qb2GFuPyoEP9f8bi3p2mahpwgLPQSTlFWmBz","prefs":{"preference_reset_time":"15C19F277D4917DCF71B31F461B2D0C8DBB3B848428CA9BC3C5C6BC48574AC87","preference_reset_time_encrypted_hash":"djEwpmSiY/R1FpD2G0hbLmraseN8FK4wvjsJU3xe9zs4f+8kBdQg3mTKnqBSGabW2k760oOpgX1pQ1yAU2zK"},"safebrowsing":{"incidents_sent":"939F8A46FD612B2F11302FE860AA28AC2BB97403B61A579D55FF125171603A19","incidents_sent_encrypted_hash":"djEwPqQs0EeeemuMxF4QRdgluDnXiPcp0FxKeHnKOR1AeMikaSGoDbYqZKCvxTwUfZLAJXqkERCUkgKpPqQd"},"schedule_to_flush_to_disk":"73B00FF74CAD3D8DEB71835592DE11F42B31D48B72EAE99CDAA89E3332F146A6","schedule_to_flush_to_disk_encrypted_hash":"djEw1ux3baFg33w4q7EWXfIciOVU+/CvwcpoFWjmdRuSS2fz/EScopHpR5uq4kgjdEX1uSgKGEKH6fpL3NV/","search_provider_overrides":"F89D61352813CEF1214763E778885A6264DB78F18556CF125DB7E7269A975DEA","search_provider_overrides_encrypted_hash":"djEwhBzRmXmBGPO436PJUkEkNvO7V9LxdpAplpzFSl3ziqR9GnqYZpusQ+kTCzuRlSIAemA7KfXHqqDurvnL","session":{"restore_on_startup":"01D0DC40F4692ABDB2D5ACF617641F9F792DFAF368CDC870D173736D7C3A2DF1","restore_on_startup_encrypted_hash":"djEwlpI6T8rgpeHmCYunwO957It/faD+czJuOkR8Xp0kIgSDm0YusWO+shh4tXZfAdOBNqpC9QpBi3DrMKzw","startup_urls":"D1197E0D92DA48044470C7DAA2988BB7F626A57B23FF417848ECDAC833189798","startup_urls_encrypted_hash":"djEwFgjmg0tb9dlPDyUaI2u1RpPI+RrAEs29mrGBVgy7YT5zy7JNGcQndcr+RRgEFYIYpuCAqDu+ZOCwtKwf"}},"super_mac":"D86A358CBF6AA8A4008064A52FE46A81B5E3DC5916B65D93F711AC090A4A22E6"},"schedule_to_flush_to_disk":"13422904239960103"} \ No newline at end of file +{"extensions":{"settings":{"dgiklkfkllikcanfonkcabmbdfmgleag":{"account_extension_type":0,"active_permissions":{"api":[],"explicit_host":[],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13422825290276856","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13422825290276856","location":5,"manifest":{"content_capabilities":{"include_globs":["https://*excel.officeapps.live.com/*","https://*onenote.officeapps.live.com/*","https://*powerpoint.officeapps.live.com/*","https://*word-edit.officeapps.live.com/*","https://*excel.officeapps.live.com.mcas.ms/*","https://*onenote.officeapps.live.com.mcas.ms/*","https://*word-edit.officeapps.live.com.mcas.ms/*","https://*excel.partner.officewebapps.cn/*","https://*onenote.partner.officewebapps.cn/*","https://*powerpoint.partner.officewebapps.cn/*","https://*word-edit.partner.officewebapps.cn/*","https://*excel.gov.online.office365.us/*","https://*onenote.gov.online.office365.us/*","https://*powerpoint.gov.online.office365.us/*","https://*word-edit.gov.online.office365.us/*","https://*excel.dod.online.office365.us/*","https://*onenote.dod.online.office365.us/*","https://*powerpoint.dod.online.office365.us/*","https://*word-edit.dod.online.office365.us/*","https://*visio.partner.officewebapps.cn/*","https://*visio.gov.online.office365.us/*","https://*visio.dod.online.office365.us/*"],"matches":["https://*.officeapps.live.com/*","https://*.officeapps.live.com.mcas.ms/*","https://*.partner.officewebapps.cn/*","https://*.gov.online.office365.us/*","https://*.dod.online.office365.us/*","https://*.app.whiteboard.microsoft.com/*","https://*.whiteboard.office.com/*","https://*.app.int.whiteboard.microsoft.com/*","https://*.whiteboard.office365.us/*","https://*.dev.whiteboard.microsoft.com/*"],"permissions":["clipboardRead","clipboardWrite"]},"default_locale":"en","description":"This extension grants Microsoft web sites permission to read and write from the clipboard.","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCz4t/X7GeuP6GBpjmxndrjtzF//4CWeHlC68rkoV7hP3h5Ka6eX7ZMNlYJkSjmB5iRmPHO5kR1y7rGY8JXnRPDQh/CQNLVA7OsKeV6w+UO+vx8KGI+TrTAhzH8YGcMIsxsUjxtC4cBmprja+xDr0zVp2EMgqHu+GBKgwSRHTkDuwIDAQAB","manifest_version":2,"minimum_chrome_version":"77","name":"Microsoft Clipboard Extension","version":"1.0"},"path":"C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application\\147.0.3912.98\\resources\\edge_clipboard","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false},"mhjfbmdgcfjbbpaeojofohoefgiehjai":{"account_extension_type":0,"active_permissions":{"api":["contentSettings","fileSystem","fileSystem.write","metricsPrivate","tabs","resourcesPrivate","pdfViewerPrivate","fileSystem.readFullPath","errorReporting","edgeLearningToolsPrivate","fileSystem.getCurrentEntry","edgePdfPrivate","edgeCertVerifierPrivate"],"explicit_host":["edge://resources/*","edge://webui-test/*"],"manifest_permissions":[],"scriptable_host":[]},"commands":{},"content_settings":[],"creation_flags":1,"disable_reasons":[],"events":[],"first_install_time":"13422825290276320","from_webstore":false,"incognito_content_settings":[],"incognito_preferences":{},"last_update_time":"13422825290276320","location":5,"manifest":{"content_security_policy":"script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources chrome://webui-test; object-src * blob: externalfile: file: filesystem: data:; trusted-types edge-internal fast-html pdf-url edge-pdf-static-policy;","description":"","incognito":"split","key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB","manifest_version":2,"mime_types":["application/pdf"],"mime_types_handler":"edge_pdf/index.html","name":"Microsoft Edge PDF Viewer","offline_enabled":true,"permissions":["errorReporting","chrome://resources/","chrome://webui-test/","contentSettings","metricsPrivate","edgeCertVerifierPrivate","edgeLearningToolsPrivate","edgePdfPrivate","pdfViewerPrivate","resourcesPrivate","tabs",{"fileSystem":["write","readFullPath","getCurrentEntry"]}],"version":"1","web_accessible_resources":["pdf_embedder.css"]},"path":"C:\\Program Files (x86)\\Microsoft\\EdgeWebView\\Application\\147.0.3912.98\\resources\\edge_pdf","preferences":{},"regular_only_preferences":{},"was_installed_by_default":false,"was_installed_by_oem":false}}},"protection":{"macs":{"browser":{"show_home_button":"EF8E04BCF6F7C232231E69DAE481170653D82ED686DDBF2991FEFD946EB7522E","show_home_button_encrypted_hash":"djEwL8uhOweF+aSXdVnZZCIhI8ut2MIkV2Ifpow2m7C2KwdD2ImnynsMTUtIDKhbvz1gCXzobc1aikKknU2/"},"default_search_provider_data":{"template_url_data":"FCFE985DC4470CDE6D77C27E055CB0622C9CC7AD6BC6B9E1847519F7B8DEE144","template_url_data_encrypted_hash":"djEwsV6dwtNgxRBH7WD97rlioqEQpWS+Qb4MPc/xoDu+1CwYiM5mZml96+bpyqR1DawoFdft0oBmUunVeY01"},"edge":{"services":{"account_id":"CEF02DAD6F29EDA114575937C8F508621AE39F5C2738FAEDF89FCBB71E1C1BA3","account_id_encrypted_hash":"djEw491EWyrxenfn24WE1y4KwOvA/PbiBsNUmsVwF3ULTN/aDtABfpvV5ydqY3wCcl5V/RGc6FFgFRw8iPu9","last_username":"103B84FBAB0098687AD51A1C08493EFDAEB5F7EF6D86BBE2F39A61127527FBB7","last_username_encrypted_hash":"djEwoFZD1uazNPuZc7ATnQJ4mcM6Mh4MUzGT1wcYX9fLATiXtVJ7gXje84cwjbeedOUQxCN9bD2124MlcC7T"}},"enterprise_signin":{"policy_recovery_token":"CD42B0D9C6B42377D8101DB574DD3166F3A9E94F1DB639394916929D5EF5DAC2","policy_recovery_token_encrypted_hash":"djEwoP/kAE/q8okeDU1JkvqZ8fGhS1dgD8LWDcSMOsjB5WB3KTBe1LoJKX61Hf2mvq1TrZ+Q8ROqsviGtLMB"},"extensions":{"install":{"initiallist":"3E78B078F98B045DFE906AB9531C92D6208035B4C12DBA309EFB5E15958EB4A5","initiallist_encrypted_hash":"djEwCWUW2GW8n23hc8mioZWTV120jZOL4lQEkh3Rmv9Y28f++ZKlEKz4WJ46V6wt47NNrk3QYWPXHHA8pKGx","initialprovidername":"40E3B3529940888791F691E760B354D1975C4DE1C69D4F79D038D1E6E57213DF","initialprovidername_encrypted_hash":"djEwHxPdef316nVa3pkGmgecHzDkjZdUPrQot/HVwl22WgUkrd9TQUhnN63kTcBYPuHsQ34sP13X1MLYoLAP"},"settings":{"dgiklkfkllikcanfonkcabmbdfmgleag":"DA5FA348ACCFF784D34BB92F5675EE2FB160B53982751D3826CC007363E8284B","mhjfbmdgcfjbbpaeojofohoefgiehjai":"E5EC068D6C43F3F738FE1B38C3A7D681AD40CE86A10355B79FC06F895BAC9828"},"settings_encrypted_hash":{"dgiklkfkllikcanfonkcabmbdfmgleag":"djEwGtEEOyYxcp6tbvtqVVAKH8gD3XeX1/vIDHWLKUIt1CnGY2jQoFECn11hymTJmEm3G6XcsS2lyhqqt45i","mhjfbmdgcfjbbpaeojofohoefgiehjai":"djEwmtrNQXU3uHfY/EFbcDJLxIIgLyZnGJka+pcyoVFBzK2fkdLHsykP4IblNF63Kfc5ChS7aWZhD8QcbB+E"},"ui":{"developer_mode":"2DBEBCCD41AA2009A8A787B8BD6D40749D4BAE6F5B4C817F2185B896E17E2F88","developer_mode_encrypted_hash":"djEwzVUgVB8GMd6G9uXs3Go9LZxkWrdYvZNPw45bAmfFyLR5Kr1fdO8NHYr5EW+UxHS8kDKayJ4u51lbq6rx"}},"google":{"services":{"last_signed_in_username":"072FB2F17167EF75B4CFC99246F44C08AC2BBEF6A9E38CE03B2024A42C23FE84","last_signed_in_username_encrypted_hash":"djEwX9b5Tuz21PIuysyAmDs5x/L0V6XoWLxJaeuN2tNw+GQcjIEIsHTyyxv0Zs/eion3RXeVV9S3XcqfSP+T"}},"homepage":"78069B504433DDA1B1E463C057E727B790FEF1FCC64CAB5672F563FF4BE366FF","homepage_encrypted_hash":"djEwJDPrl1w78AmwYbt3hE3CW/INl+GjItryUiBCbpHfDYPk9AWXWtkb0Gl/Uc1d2U3WDPTx1Ae4wpYZG6YV","homepage_is_newtabpage":"F733D8383D60B3033BE28BA305EECEDE724D34C8FD94B30025F423B51393A590","homepage_is_newtabpage_encrypted_hash":"djEwHmDRsT56AL3edBMCwOfphMJ1v7m5hnLS9QiP8AB32Wat2KAJvcWI4h+BIA2M4kEknr2nSFekREuUqU07","media":{"cdm":{"origin_data":"D37EC83B68B1EF5650F106F4A24081A49B4DF9F5678E7EC6A85E161A98A08E4B","origin_data_encrypted_hash":"djEwYZWrwlLwvlhAiNrQ7K6jPhWi/7WdubojgREORnjFpfhQaFL2juMW9GFwzaYcbbhIHFWHmrYPNRAqHZZK"},"storage_id_salt":"B2E9290C6F6859BEB974309F06D9E137958B4AE07302B17AAE243C417F7EA569","storage_id_salt_encrypted_hash":"djEwZ55iar03s+XzH3G91HJKglyeGleoKT9DSy0uwY6ikkXvIK86bIqzf87iVVFNG98n6wGpDL5/XyPnHPxR"},"pinned_tabs":"6EE16DC2F5850603ED8BDEA03AEFF18B572EE9FFFBC60EA1A9EED8FA68C0F5DB","pinned_tabs_encrypted_hash":"djEw7UfQ/v1wQMoP1ClGHj3Ex2whN8C4AxozwCqx3VqoW69XWocRIN6j/pu8M/KA7StF17xfQ3OYD0n1zxMH","prefs":{"preference_reset_time":"15C19F277D4917DCF71B31F461B2D0C8DBB3B848428CA9BC3C5C6BC48574AC87","preference_reset_time_encrypted_hash":"djEw+7Xg6l4If4IeoFR77qNTeYBQQ5/l8AKddBQkPfW96QnlTETum3TXkW6Pey9zrScFGq/3nLko2pe/abHN"},"safebrowsing":{"incidents_sent":"939F8A46FD612B2F11302FE860AA28AC2BB97403B61A579D55FF125171603A19","incidents_sent_encrypted_hash":"djEw0YOjYAZ1mUmZos4/1JGb6VB67e5FTS4KUWeiQ2mqDPFcUhO6Rh+umEspotOWC/Knx8+ZNZV0T69v9ul6"},"schedule_to_flush_to_disk":"B921C47CB1B9AF2645B0B218E94D712899746A4B87F5FEC16D80E7E8628354BE","schedule_to_flush_to_disk_encrypted_hash":"djEwM3JXC8dVo8cKHTyC61IA99E3dfDxIZneCdOye9TbL7F8Ot3F07Kp0LI8Er4PdCCIIgAoDYR/eQYhkhCV","search_provider_overrides":"F89D61352813CEF1214763E778885A6264DB78F18556CF125DB7E7269A975DEA","search_provider_overrides_encrypted_hash":"djEwsXUkHR0+aa8lbZIqA8RvL5ZOKtzr41sTJOUOAWrarpejnIlpZhI2NBr1R1+YnC/oANMO1mDN1MQ9TX/H","session":{"restore_on_startup":"01D0DC40F4692ABDB2D5ACF617641F9F792DFAF368CDC870D173736D7C3A2DF1","restore_on_startup_encrypted_hash":"djEwEX9YKErXMtFZYIH5nm8z2QAkEzFYbMr+uoGJn0j65vAiSnfwjVQ1oSxC8pBlx06cYOm+DB3WVRrhv+rR","startup_urls":"D1197E0D92DA48044470C7DAA2988BB7F626A57B23FF417848ECDAC833189798","startup_urls_encrypted_hash":"djEwXe94kk+fUDOyfOu/Mj61ZpzCnt8C6voLEGgM5x8XiPBbg/aEvLiJ+PorLY5MqnpgYLU12FFyjGZd9Tqw"}},"super_mac":"1D3E585592FFD00D2A9D892B60E0AA5572BFC09E57F76B4084F2CAF6EAC2EECA"},"schedule_to_flush_to_disk":"13423060788537557"} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/000003.log b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/000003.log index de23708542bf9f398c5d0600f9077a50cb35d35c..82a7b60449e9220b532d3d34a32d5e9a27e744d7 100644 GIT binary patch delta 451 zcmbQldrWx4B(}*4Y(+q<#$j>z z42;4I2!KUMvsUJH8c@~bS{6w|b4K^P#N5>4g2d!hT~o6(BMZw!gLq4$mJc)P1BsKsHD+0j) diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG index a70c1ba..e69de29 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG @@ -1,3 +0,0 @@ -2026/05/10-18:30:40.323 292c Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/MANIFEST-000001 -2026/05/10-18:30:40.324 292c Recovering log #3 -2026/05/10-18:30:40.325 292c Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG.old b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG.old index 149d0de..7eddd10 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG.old +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Session Storage/LOG.old @@ -1,3 +1,3 @@ -2026/05/10-01:32:21.088 744 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/MANIFEST-000001 -2026/05/10-01:32:21.089 744 Recovering log #3 -2026/05/10-01:32:21.090 744 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/000003.log +2026/05/11-17:52:05.695 22c0 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/MANIFEST-000001 +2026/05/11-17:52:05.698 22c0 Recovering log #3 +2026/05/11-17:52:05.700 22c0 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Session Storage/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/000003.log b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/000003.log index b02e28df52b23051e2f0a730155c7b4bbc6c3915..c4c4024f7d74911277f5703da046758edd58a89a 100644 GIT binary patch delta 35 ncmXTe!8oCSgG)$G%8`MQd7^>7;L5M<7ubZDI2fdWSP6&$oqPu~ delta 5 McmdnNSTLag00w~qDgXcg diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/LOG.old b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/LOG.old index 3bd0c2e..8db5fdc 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/LOG.old +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Site Characteristics Database/LOG.old @@ -1,3 +1,3 @@ -2026/05/10-01:32:20.822 1518 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 -2026/05/10-01:32:20.823 1518 Recovering log #3 -2026/05/10-01:32:20.823 1518 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Site Characteristics Database/000003.log +2026/05/11-17:52:04.553 14e8 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Site Characteristics Database/MANIFEST-000001 +2026/05/11-17:52:04.555 14e8 Recovering log #3 +2026/05/11-17:52:04.556 14e8 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Site Characteristics Database/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Sync Data/LevelDB/LOG.old b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Sync Data/LevelDB/LOG.old index 8aa050a..8fc2794 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Sync Data/LevelDB/LOG.old +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Sync Data/LevelDB/LOG.old @@ -1,3 +1,3 @@ -2026/05/10-01:32:20.822 1df8 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001 -2026/05/10-01:32:20.823 1df8 Recovering log #3 -2026/05/10-01:32:20.823 1df8 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Sync Data\LevelDB/000003.log +2026/05/11-17:52:04.556 4154 Reusing MANIFEST C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/05/11-17:52:04.557 4154 Recovering log #3 +2026/05/11-17:52:04.557 4154 Reusing old log C:\Users\eslusarz\Documents\eclipse-workspace\.metadata\.plugins\org.eclipse.swt\EBWebView\Default\Sync Data\LevelDB/000003.log diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Top Sites b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/Top Sites index be2a99cc482eea903071c155484b5ed51fb0b961..040f08294d3aba046acd3cfd4c83cd69a3de1cf5 100644 GIT binary patch literal 20480 zcmeI(O>fgk7zc2_q(GM@W)D@x_R!H*4OAjd;zC(AiXeamSwg#{DS`vCrpdT?>v)Vk zPT|<1a^tgb;v4LR)1LRhfx})`;)XcwI88!Ysp|Gtp}(tX{PMW-%x{u|pGnsqH9WzH z%cCw8WJ$T8sH$>{5Jgcm*(PKgZs~DmcpzWZvHhcVHN|}UHEVoPGP!q(v1$C3duLod zDj4S>009U<00Izz00bZa0SG_<0t0~^O+Py`H>d8b3A*7k!9ypO&#&=lCv&H1*IG7d z)owRzGCF-ZiG0$spR~xzs%-0x2Kl{Ne^_fiB@gVUSL9VEqQMraue9uYc5@VUMR>wz z2k%@gXU@#nbE@J69riMQ;mZUZnh4%Mc1C?V<io>q5?{j|GG(6ng>l1aeI5)9&Hw5CXz5N23&aZR=H@(gJRe7)31^T>}DA8PSO?yuTz!5=I}-qhGt0HTXd6| zf6yK^2XXmfd?3HqUA6bSS+Gj=yLO(2p+D&0@SjUO)9WyEn@3w4ENDN^ZzMs-XNSWM z_c{z4JknLKnoBp#l4+H!<+n!`Nq2a;zeZfO%JTMd zDc|P4j9##oXn%9v{DvItX2fM$h0#UJO@CZ>Fiau`ng0Jc`Ave5yR6529?HdMlIBw= zEt7|qvMaQSz3REjNhTv5fVEu2RHSop%v96^xt{O)`%_>oleHuac_ie=cK(=;Zh!qh zyP)LWWEZghe+(8bLjVF0fB*y_009U<00Q5?z^;?otEne>cts`QB$Whx_gQAIdLm#{ U2mXJdM*B&xOpd>M$Es!j0kbW@5dZ)H delta 119 zcmZozz}T>Wae_1><3t%}M#hZ^3-vh}7#JA&?=tY;-7KiEgMZ=#X?9^73-M{Is;pnQ{OQ>ZRwX(?uFP8@mw3H2kf diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/favorites_diagnostic.log b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/favorites_diagnostic.log index 892cbf7..a90710c 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/favorites_diagnostic.log +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/favorites_diagnostic.log @@ -1,3 +1,5 @@ 2026-05-09 18:34:50.289: [INFO] OnDoneLoading sync enabled: 0 2026-05-09 23:32:20.836: [INFO] OnDoneLoading sync enabled: 0 2026-05-10 16:30:39.960: [INFO] OnDoneLoading sync enabled: 0 +2026-05-11 15:52:04.577: [INFO] OnDoneLoading sync enabled: 0 +2026-05-12 11:59:48.537: [INFO] OnDoneLoading sync enabled: 0 diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/shared_proto_db/000003.log b/.metadata/.plugins/org.eclipse.swt/EBWebView/Default/shared_proto_db/000003.log index f2ce9e005ac241e96e7da1ac334c592c24393a07..1dec7131a3f265adbab07b230e740cde6308db14 100644 GIT binary patch delta 15 UcmaE=^j>8{s^H`Y0<9nn06c~VQ2+n{ delta 7 OcmaE_@>FRm011`7~Rl(c62zcF#X{KNvDO$s@zCh80f6M`5R r7lIU|wB*d#UHWvk+6H|F7_A1B2dN2xsu8{OUj?LpW5EO@EXV@@r${5Q delta 85 zcmZp8z|`=7N%HV1mV*ooObj5P0>tVd1`7iN<3veo#`=wk^W`TN@N81ZVHHqgV3-iZ Wz_<{kK)#`48Axtp!2~31$^!s#K^HIp diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/GrShaderCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/GrShaderCache/data_1 index 6ee37127b0bf61af0578fe4a8b0d4474e4e7b0bb..a456fd6145e92509a20fc2b89e5f7d032adb65e7 100644 GIT binary patch delta 360 zcmZoTAkc6?K=tq`mV*ooObm<+Kma5(K{N|U1k45T7+y_OHD$Elm^fd4VgcJE1rA9K zurPvP12TDmSa7nULO7$w#6)or;V$XI15wigRSMI$dhsp@)I_(8NR;7I$W&MUxX;UMnQ0JDECyKp>c`at2YZ VE}meXqpdB-`5Ox+&>5SF0{|k-U!VX0 delta 250 zcmZoTAkc6?K=tq`mV*ooObm<+Kma5(Kr{;5bL-w3+ zc$$+mr)e&yxsv9tG*{DHyU5wi6HyPj4&F)SC-5DX_3Zd0*+#&K(T_5XfB9i}5sPmq zbC{{5)zY5oZj7h88?1Pnxijd_D`xlp=3Vvi_O8;rr@gbYHQC%6>%p+h*!hZvaz`;! zvpFR*+B9j-jIWTTz|#);E*Lsh;Pl^w!LbYKi6NV3qxZF_Iu!Q69}hJHx)QV;o;=hV zfRCsp+0jQ@g+?D}nI@y{WFz}5GiiJPqswR|jD~0cZagDV_-;9w4_`kgwIzk?L2Z&Q zs0eX$cGcNu&q;$afSPHTExmn4ond^)*YPSdRY<7m?c*yr?#rxCT6;Gp63G?}T#fGP zweGff!s-!(pdbY6jG&PtydhdZUI+IdLc+i_A|wz<2qK}w>a7x^u(ZHy%Tx!rQDfvw zK&j5O;$8bJ1cVR}i(4ICRk)Q|mtND0mBd>+_x9{Ve8`<&wYnN^ucSVB{4Y^`b%;3F z8Vj4To*5sbc)qcGv3?~@6*@1k4i zAjx;>$$O=b(7guTOr!x(sjut>x&rtn_9TqSqE;9jCmOu`lr_(gBq8^G=N_ z^Vk~%9!>q0=VnY7rZ?wf=+u5L9_7=qA_k9M3pp`qXTIy2ibc(x*XkXOuE!+Y-f%=N z1#2@g{1TV+GDmewGnKe)E+S7w=n5FN+7y`E6j<66SlblX+7#HADR3Ov*w7$9ibum>G!2ZVfzdQDng&K<8kpG7001ZF BL4yDQ diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/GraphiteDawnCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/GraphiteDawnCache/data_1 index 20fd5d471467f62bb11dddaa33bb54f58b4ecaa2..4e559bb58038bf5cb8e7c915db3db0f4c1bb73f7 100644 GIT binary patch delta 32 mcmZoTAkc6?V8aasCKsNGfqKmxitQYVj6lq^okNlN$3FnK5ekz4 delta 32 mcmZoTAkc6?V8aasCOyuHfqKmxitQYVj6lq^okNlN$3FnH?h1MU diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Local State b/.metadata/.plugins/org.eclipse.swt/EBWebView/Local State index 9f55b3b..164e4e4 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Local State +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Local State @@ -1 +1 @@ -{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"FivBD7Ft8QE="},"breadcrumbs":{"enabled":true,"enabled_time":"13422825290225753"},"default_browser":{"browser_name_enum":6},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1778491645"},"domain_actions_config":"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","edge":{"manageability":{"edge_last_active_time":"13422965242399717"},"mitigation_manager":{"renderer_app_container_compatible_count":1},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"num_healthy_browsers_since_failure":3},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":1,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.778505320058342e+12,"network":1.778505325e+12,"ticks":77277954672.0,"uncertainty":1712561.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"147.0.3912.98","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACiPxEnG1/CSY1jnLc4XUkbEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAA5m+RU369qlDRNJw536rgYo0g7lbaG+8+1UYQKgVe5UwAAAAAOgAAAAAIAACAAAACdbioUEYXU0KmGVxkd+xO2PXzKDPnf35QIuaeuTDcNSjAAAAANUwQ1tAvl+bBa1dzjsYMVbdkI+ZGjD+J775LQjaGPbvJrVu+gH3jebbxz/FxLsl9AAAAAASWIjwzqxz0hwJWQhbROUd+FJv0v6KT2yDPhU5+s5kl2GMzbnJrtQFGQVlo7h8M6D6TLD0LO4nAWEO1sQzurdQ=="},"performance_intervention":{"last_daily_sample":"13422913239998106"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13422911690226895"},"profile":{"info_cache":{"Default":{"active_time":1778491640.805231,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13422911690225981","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"147.0.3912.98","signin_last_updated_time":1778438139.955908},"sentinel_creation_time":"0","session_id_generator_last_value":"339850313","signin":{"active_accounts_last_emitted":"13422911690194951"},"startup_boost":{"last_browser_open_time":"13422987292739334"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.84","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13422913239945839","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":10,"window_count_max":10},"telemetry_client":{"cloned_install":{"user_data_dir_id":11297294},"governance":{"last_dma_change_date":"13422825290206518","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQ3LjAuMzkxMi45OFx0ZWxjbGllbnQuZGxs","sample_id":28518521},"uninstall_metrics":{"installation_date2":"1778351690"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"rrf@0.74","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"46.0.0.0"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"rrf@0.29","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"rrf@0.48","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2026.3.23.1"},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"rrf@0.05","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"rrf@0.76","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"laoigpblnllgcgjnjnllmfolckpjlhki":{"cohort":"rrf@0.96","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"rrf@0.35","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.84"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"rrf@0.68","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"rrf@0.36","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"rrf@0.85","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":-105,"updateclientlastupdatecheckerrorcategory":5,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\eslusarz0s:05D2D359-2B14-4013-B5BA-6ED5F41F2761","diagnostics":{"last_data_collection_level_on_launch":1},"limited_entropy_randomization_source":"94FB2CB93E02CD91F8FEEE6A7854498F","low_entropy_source3":4436,"machine_id":492731,"payload_counter":1,"pseudo_low_entropy_source":452,"reporting_enabled":false,"reset_client_id_deterministic":true,"session_id":2,"stability":{"browser_last_live_timestamp":"13422986728606217","exited_cleanly":true,"stats_buildtime":"1777534620","stats_version":"147.0.3912.98-64","system_crash_count":0}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"P-R-1736541-5-5,P-R-1315481-1-8,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-61206-24-23,P-R-60617-8-21,P-R-45373-10-87,P-R-1075865-4-8","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13422975320478873","variations_last_runtime_fetch_time":"13422978920358685","variations_runtime_compressed_seed":"H4sIAAAAAAAAAG2Py07DMBBF/2W2ZFQ/Jo4diQ1pIGFVqq6gLEJjTBF1mpdEqPLvqLW66/Lcc6U7c4Ks8Z97Vy57SGGFa+TMSEExchQUhUArRshRJhdOtGQKOXIdUCpxwWCV5CpGQqEuGEtBEgUGSYwZifIqpU6IUKMJVnJtDAqDZEy0wiVyHmvFCQVeL5E6UQwFcgYR5LWz69EP+4MNT0B6gvxwHKabxvrq48c+2moYO9tD+gbWdjt4n+cIClvVtuvPtawZ/dBNWVNbSKHcnIc2lYMUtvASP7PClbtGqwffHkXjstxNrL/7Jfpqiz/vn8R3vXhdtO5+CzDP/+zFLFRfAQAA","variations_runtime_config_ids":"P-R-1093245-1-24,P-R-108604-1-37,P-R-78306-1-18,P-R-73626-1-17,P-R-63165-4-26,P-R-53243-2-7,P-R-40093-3-26,P-R-38744-8-97,P-R-31899-29-499,P-D-1158614-2-4,P-R-1038760-2-10","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbXPiNhD+Kxl9tlLL79DpB8JLjh7c0QCXdnqZjLDXjiayRCUZwmT47x1ZhIT0mFz5wHh3n93n2dVafkbD/hx1n1GfMxCmL0XJqkZRw6RYrgtqYLgBYSxiANzQiayGgq44FKhbUq7BQ6OG8zmY85GRgn8aEPkOdYnv7z00fMp5U8DwyYASlDvScaHHYiIr1DWqAQ8570RWC6oqMKiLoKjgXhvLgWyVogIHatUxbQMTmVP+BcxWqsdenoPW/QfIHy2icIgRUNMo0Kj7NzqD1uhu76HtJphTUazk05nssZacGjiAoBiXitbgkg9yRozDfKcN1G/Kc6bNmZLv8QOmIDdS7cYG3KFccekquL4slxv77begVxTMYiifKWnTPzPOoVgAhxqM2llSEO85a30Lq28Mth/nW7Z5kT84xnPl7MFYVAv/YznuW+Ca2uEYUBb0jAStAXVR/kCFAI48tKG8sZ4R2nvHMKxl/vAmGPru9xajwCgqdM1Muxn3UtxvmYJ7w2qQjbmvGedMQy5Fod+UCmwVK/DrBpRiBSw/T/W5jpaP9bXc2GUVOUzs8d15ZzpqwS81W+gr55TlSmpZmssRU9rMqDK7w/bd2FdEmxvQDTce8Uj866m89jU8K9BFe5zL7UfyWuiHAm9hdaXkVoO6nClp5KopL5efp5duOWdKloyD51udP5FkqNGXE1nNDVXG873o/yT1Zb3mYKDNc0M5buRMrufUhtt/JqpzAxpJlcMx7Yj2UK3tFQPaLAUrpaoHTBvFVo19Dz4xbWSlaH1+npWSzTo6yngzS3K6pi0w/glgASVtuLm2+LPwu/3hAmwX6aYRrxfhsF6b3Y9D/x0MQKly1FabQ1WDMO0lY8EjJYVhoHpNwUDklvqLFFbJtDfucY66qL3mkYdub4enDp2vy8Z6/Pa5aqgqXowNqPZxGiZxXyo4zexLYUCYOagNy0G/44HVn4tT1xUT1anHtn7qOe7aUlvug3/voU9Ai/Y8n9FwQSvURd8R/PJ1MMtnoXnQo3U4Hq9JXk5mtfx9ES2X5SYjV+VqOdwkf12Pf/uOLN/TmrXTRHNqvAu/czGlu4vAD5IL0umGUTeOL66ni7a3Rhi168vCDnNsXXbJG33wtFfSy4dvPHC67NcZzfANJmlM4sTHBBOvtf0siNPWto4BjoIwy3CAE3T6bTxkh0kcERzj2GWHJI4yggnOnB1HhKQEJ7hzsIMs8H0c4sjZhIRxSHB0iCdZlEa4g0ngTBL4CQ4iHITO9hOS4gwHTmsUh2mIiY+zFP14b51IP42zJMYRztD7hTx0QZKUtJWI73RFaeiT5LUPEnc6WYzJS5+EhB0S4yB2Y7IknSwMI0xw4qQmfpphgsOjlR6zEz/LAkywazIK/SzA4SEWBWlkqwRov/8X5nU8zUYJAAA=","variations_safe_seed_date":"13422900277000000","variations_safe_seed_fetch_time":"13422975320478873","variations_safe_seed_locale":"en-GB","variations_safe_seed_milestone":147,"variations_safe_seed_signature":"","variations_seed_client_version_at_store":"147.0.3912.98","variations_seed_date":"13422975325000000","variations_seed_etag":"\"e/ODPcP3thsFp3IIp1cfLPmoJT4UUfv81BfbUEv6YGI=\"","variations_seed_milestone":147,"variations_seed_runtime_etag":"\"Q5J0HgIco86Bnqp2ogCEgy0s+x44hqHznnG2jd/Z/qg=\"","variations_seed_runtime_serial_number":"\"Q5J0HgIco86Bnqp2ogCEgy0s+x44hqHznnG2jd/Z/qg=\"","variations_seed_serial_number":"\"e/ODPcP3thsFp3IIp1cfLPmoJT4UUfv81BfbUEv6YGI=\"","variations_seed_signature":"","was":{"restarted":false}} \ No newline at end of file +{"accessibility":{"captions":{"common_models_path":"","soda_translation_binary_path":""}},"autofill":{"ablation_seed":"FivBD7Ft8QE="},"breadcrumbs":{"enabled":true,"enabled_time":"13422825290225753"},"default_browser":{"browser_name_enum":6},"desktop_session_duration_tracker":{"last_session_end_timestamp":"1778491645"},"domain_actions_config":"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","edge":{"manageability":{"edge_last_active_time":"13422965242399717"},"mitigation_manager":{"renderer_app_container_compatible_count":2},"retrigger_features":[],"tab_stabs":{"closed_without_unfreeze_never_unfrozen":0,"closed_without_unfreeze_previously_unfrozen":0,"discard_without_unfreeze_never_unfrozen":0,"discard_without_unfreeze_previously_unfrozen":0},"tab_stats":{"frozen_daily":0,"unfrozen_daily":0}},"edge_ci":{"num_healthy_browsers_since_failure":5},"hardware_acceleration_mode_previous":true,"identity_combined_status":{"aad":1,"ad":1},"legacy":{"profile":{"name":{"migrated":true}}},"local":{"password_hash_data_list":[]},"network_time":{"network_time_mapping":{"local":1.778587190216709e+12,"network":1.778587194e+12,"ticks":40445706866.0,"uncertainty":1537319.0}},"optimization_guide":{"model_execution":{"last_usage_by_feature":{}},"model_store_metadata":{},"on_device":{"last_version":"147.0.3912.98","model_crash_count":0}},"os_crypt":{"audit_enabled":true,"encrypted_key":"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAACiPxEnG1/CSY1jnLc4XUkbEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAAA5m+RU369qlDRNJw536rgYo0g7lbaG+8+1UYQKgVe5UwAAAAAOgAAAAAIAACAAAACdbioUEYXU0KmGVxkd+xO2PXzKDPnf35QIuaeuTDcNSjAAAAANUwQ1tAvl+bBa1dzjsYMVbdkI+ZGjD+J775LQjaGPbvJrVu+gH3jebbxz/FxLsl9AAAAAASWIjwzqxz0hwJWQhbROUd+FJv0v6KT2yDPhU5+s5kl2GMzbnJrtQFGQVlo7h8M6D6TLD0LO4nAWEO1sQzurdQ=="},"performance_intervention":{"last_daily_sample":"13423001237299175"},"phoenix":{"user_laf_toggle_state_static":2},"policy":{"last_statistics_update":"13423001237299252"},"profile":{"info_cache":{"Default":{"active_time":1778491640.805231,"avatar_icon":"chrome://theme/IDR_PROFILE_AVATAR_20","background_apps":false,"edge_account_cid":"","edge_account_environment":0,"edge_account_environment_string":"","edge_account_first_name":"","edge_account_last_name":"","edge_account_oid":"","edge_account_sovereignty":0,"edge_account_tenant_id":"","edge_account_type":0,"edge_create_profile_shortcut":false,"edge_non_signin_profile_type":1,"edge_profile_can_be_deleted":true,"edge_profile_can_be_edited":true,"edge_test_on_premises":false,"edge_wam_aad_for_app_account_type":0,"enterprise_label":"","force_signin_profile_locked":false,"gaia_given_name":"","gaia_id":"","gaia_name":"","hosted_domain":"","is_consented_primary_account":false,"is_ephemeral":false,"is_glic_eligible":false,"is_managed":0,"is_using_default_avatar":true,"is_using_default_name":true,"managed_user_id":"","metrics_bucket_index":1,"name":"Profile 1","signin.with_credential_provider":false,"user_name":""}},"last_active_profiles":["Default"],"metrics":{"next_bucket_index":2},"profile_counts_reported":"13423001237298717","profiles_order":["Default"]},"profile_network_context_service":{"http_cache_finch_experiment_groups":"None None None None"},"profiles":{"edge":{"guided_switch_pref":[],"multiple_profiles_with_same_account":false},"edge_sso_info":{"msa_first_profile_key":"Default","msa_sso_algo_state":1},"signin_last_seen_version":"147.0.3912.98","signin_last_updated_time":1778527637.299286},"sentinel_creation_time":"0","session_id_generator_last_value":"339850461","signin":{"active_accounts_last_emitted":"13423001237298827"},"startup_boost":{"last_browser_open_time":"13423062980146491"},"subresource_filter":{"ruleset_version":{"checksum":860988201,"content":"10.34.0.84","format":37}},"tab_stats":{"discards_expired":0,"discards_external":0,"discards_proactive":0,"discards_urgent":0,"last_daily_sample":"13423001237299042","max_tabs_per_window":1,"reloads_expired":0,"reloads_external":0,"reloads_urgent":0,"total_tab_count_max":4,"window_count_max":4},"telemetry_client":{"cloned_install":{"user_data_dir_id":11297294},"governance":{"last_dma_change_date":"13422825290206518","last_known_cps":0},"host_telclient_path":"QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxNaWNyb3NvZnRcRWRnZVdlYlZpZXdcQXBwbGljYXRpb25cMTQ3LjAuMzkxMi45OFx0ZWxjbGllbnQuZGxs","sample_id":28518521},"uninstall_metrics":{"installation_date2":"1778351690"},"updateclientdata":{"apps":{"alpjnmnfbgfkmmpcfpejmmoebdndedno":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"46.0.0.0"},"eeobbhfgfagbclfofmgbdfoicabjdbkn":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"1.0.0.10"},"fgbafbciocncjfbbonhocjaohoknlaco":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"2026.3.23.1"},"jbfaflocpnkhbgcijpkiafdpbjkedane":{"cohort":"","cohortname":"","installdate":-1},"kpfehajjjbbcifeehjgfgnabifknmdad":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"120.0.6050.0"},"laoigpblnllgcgjnjnllmfolckpjlhki":{"cohort":"","cohortname":"","installdate":-1},"ndikpojcjlepofdkaaldkinkjbeeebkl":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"10.34.0.84"},"oankkpibpaokgecfckkdkgaoafllipag":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"6498.2025.9.4"},"ohckeflnhegojcjlcpbfpciadgikcohk":{"cohort":"","cohortname":"","fp":"","installdate":-1,"max_pv":"0.0.0.0","pv":"0.0.1.7"},"ojblfafjmiikbkepnnolpgbbhejhlcim":{"cohort":"","cohortname":"","installdate":-1}}},"updateclientlastupdatecheckerror":0,"updateclientlastupdatecheckerrorcategory":0,"updateclientlastupdatecheckerrorextracode1":0,"user_experience_metrics":{"chrome_download_action_count":0,"client_id2":"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}C:\\Users\\eslusarz0s:05D2D359-2B14-4013-B5BA-6ED5F41F2761","diagnostics":{"last_data_collection_level_on_launch":1},"limited_entropy_randomization_source":"94FB2CB93E02CD91F8FEEE6A7854498F","low_entropy_source3":4436,"machine_id":492731,"payload_counter":1,"pseudo_low_entropy_source":452,"reporting_enabled":false,"reset_client_id_deterministic":true,"session_id":4,"stability":{"browser_last_live_timestamp":"13423062588504930","exited_cleanly":true,"stats_buildtime":"1777534620","stats_version":"147.0.3912.98-64","system_crash_count":0}},"variations_compressed_seed":"safe_seed_content","variations_config_ids":"P-R-1736541-5-5,P-R-1315481-1-8,P-R-1541171-6-9,P-R-1528200-3-4,P-R-1113531-4-9,P-R-68474-9-12,P-R-61206-24-23,P-R-60617-8-21,P-R-45373-10-87,P-R-1075865-4-8","variations_crash_streak":0,"variations_failed_to_fetch_seed_streak":1,"variations_google_groups":{"Default":[]},"variations_last_fetch_time":"13423060788989366","variations_last_runtime_fetch_time":"13423060790429457","variations_runtime_compressed_seed":"H4sIAAAAAAAAAG2Py07DMBBF/2W2ZFQ/Jo4diQ1pIGFVqq6gLEJjTBF1mpdEqPLvqLW66/Lcc6U7c4Ks8Z97Vy57SGGFa+TMSEExchQUhUArRshRJhdOtGQKOXIdUCpxwWCV5CpGQqEuGEtBEgUGSYwZifIqpU6IUKMJVnJtDAqDZEy0wiVyHmvFCQVeL5E6UQwFcgYR5LWz69EP+4MNT0B6gvxwHKabxvrq48c+2moYO9tD+gbWdjt4n+cIClvVtuvPtawZ/dBNWVNbSKHcnIc2lYMUtvASP7PClbtGqwffHkXjstxNrL/7Jfpqiz/vn8R3vXhdtO5+CzDP/+zFLFRfAQAA","variations_runtime_config_ids":"P-R-1093245-1-24,P-R-108604-1-37,P-R-78306-1-18,P-R-73626-1-17,P-R-63165-4-26,P-R-53243-2-7,P-R-40093-3-26,P-R-38744-8-97,P-R-31899-29-499,P-D-1158614-2-4,P-R-1038760-2-10","variations_safe_compressed_seed":"H4sIAAAAAAAAAJVVbXPiNhD+Kxl9tlLL79DpB8JLjh7c0QCXdnqZjLDXjiayRCUZwmT47x1ZhIT0mFz5wHh3n93n2dVafkbD/hx1n1GfMxCmL0XJqkZRw6RYrgtqYLgBYSxiANzQiayGgq44FKhbUq7BQ6OG8zmY85GRgn8aEPkOdYnv7z00fMp5U8DwyYASlDvScaHHYiIr1DWqAQ8570RWC6oqMKiLoKjgXhvLgWyVogIHatUxbQMTmVP+BcxWqsdenoPW/QfIHy2icIgRUNMo0Kj7NzqD1uhu76HtJphTUazk05nssZacGjiAoBiXitbgkg9yRozDfKcN1G/Kc6bNmZLv8QOmIDdS7cYG3KFccekquL4slxv77begVxTMYiifKWnTPzPOoVgAhxqM2llSEO85a30Lq28Mth/nW7Z5kT84xnPl7MFYVAv/YznuW+Ca2uEYUBb0jAStAXVR/kCFAI48tKG8sZ4R2nvHMKxl/vAmGPru9xajwCgqdM1Muxn3UtxvmYJ7w2qQjbmvGedMQy5Fod+UCmwVK/DrBpRiBSw/T/W5jpaP9bXc2GUVOUzs8d15ZzpqwS81W+gr55TlSmpZmssRU9rMqDK7w/bd2FdEmxvQDTce8Uj866m89jU8K9BFe5zL7UfyWuiHAm9hdaXkVoO6nClp5KopL5efp5duOWdKloyD51udP5FkqNGXE1nNDVXG873o/yT1Zb3mYKDNc0M5buRMrufUhtt/JqpzAxpJlcMx7Yj2UK3tFQPaLAUrpaoHTBvFVo19Dz4xbWSlaH1+npWSzTo6yngzS3K6pi0w/glgASVtuLm2+LPwu/3hAmwX6aYRrxfhsF6b3Y9D/x0MQKly1FabQ1WDMO0lY8EjJYVhoHpNwUDklvqLFFbJtDfucY66qL3mkYdub4enDp2vy8Z6/Pa5aqgqXowNqPZxGiZxXyo4zexLYUCYOagNy0G/44HVn4tT1xUT1anHtn7qOe7aUlvug3/voU9Ai/Y8n9FwQSvURd8R/PJ1MMtnoXnQo3U4Hq9JXk5mtfx9ES2X5SYjV+VqOdwkf12Pf/uOLN/TmrXTRHNqvAu/czGlu4vAD5IL0umGUTeOL66ni7a3Rhi168vCDnNsXXbJG33wtFfSy4dvPHC67NcZzfANJmlM4sTHBBOvtf0siNPWto4BjoIwy3CAE3T6bTxkh0kcERzj2GWHJI4yggnOnB1HhKQEJ7hzsIMs8H0c4sjZhIRxSHB0iCdZlEa4g0ngTBL4CQ4iHITO9hOS4gwHTmsUh2mIiY+zFP14b51IP42zJMYRztD7hTx0QZKUtJWI73RFaeiT5LUPEnc6WYzJS5+EhB0S4yB2Y7IknSwMI0xw4qQmfpphgsOjlR6zEz/LAkywazIK/SzA4SEWBWlkqwRov/8X5nU8zUYJAAA=","variations_safe_seed_date":"13422975325000000","variations_safe_seed_fetch_time":"13423060788989366","variations_safe_seed_locale":"en-GB","variations_safe_seed_milestone":147,"variations_safe_seed_signature":"","variations_seed_client_version_at_store":"147.0.3912.98","variations_seed_date":"13423060793000000","variations_seed_etag":"\"e/ODPcP3thsFp3IIp1cfLPmoJT4UUfv81BfbUEv6YGI=\"","variations_seed_milestone":147,"variations_seed_runtime_etag":"\"Q5J0HgIco86Bnqp2ogCEgy0s+x44hqHznnG2jd/Z/qg=\"","variations_seed_runtime_serial_number":"\"Q5J0HgIco86Bnqp2ogCEgy0s+x44hqHznnG2jd/Z/qg=\"","variations_seed_serial_number":"\"e/ODPcP3thsFp3IIp1cfLPmoJT4UUfv81BfbUEv6YGI=\"","variations_seed_signature":"","was":{"restarted":false}} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/ShaderCache/data_1 b/.metadata/.plugins/org.eclipse.swt/EBWebView/ShaderCache/data_1 index 59f2c79fea8c8aeeaa746a5fe998d39b205c541c..31b5c1249a8ab887ae4334021bd75dc5c7aa08c0 100644 GIT binary patch delta 32 mcmZoTAkc6?V8aasCKsNGfqKmxitQYVj6lq^okNlN$3FnK5ekz4 delta 32 mcmZoTAkc6?V8aasCOyuHfqKmxitQYVj6lq^okNlN$3FnH?h1MU diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/SmartScreen/local/uriCache_ b/.metadata/.plugins/org.eclipse.swt/EBWebView/SmartScreen/local/uriCache_ index 3cfdb1c..06c4bd3 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/SmartScreen/local/uriCache_ +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/SmartScreen/local/uriCache_ @@ -1 +1 @@ -{"version":1,"cache_data":[{"file_hash":"145d0023f037c9bf","server_context":"1;f94c025f-7523-6972-b613-ce2c246c55ce;unkn:100;0.01","result":1,"response_category":"Allowed","expiration_time":1778470341295392},{"file_hash":"f4df362a8544bc8c","server_context":"1;f94c025f-7523-6972-b613-ce2c246c55ce;unkn:100;0.01","result":1,"response_category":"Allowed","expiration_time":1778470341295392}]} \ No newline at end of file +{"version":1,"cache_data":[{"file_hash":"145d0023f037c9bf","server_context":"1;f94c025f-7523-6972-b613-ce2c246c55ce;unkn:100;0.01","result":1,"response_category":"Allowed","expiration_time":1778615525476298},{"file_hash":"f4df362a8544bc8c","server_context":"1;f94c025f-7523-6972-b613-ce2c246c55ce;unkn:100;0.01","result":1,"response_category":"Allowed","expiration_time":1778615525474682}]} \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.swt/EBWebView/Variations b/.metadata/.plugins/org.eclipse.swt/EBWebView/Variations index a157215..5d75f57 100644 --- a/.metadata/.plugins/org.eclipse.swt/EBWebView/Variations +++ b/.metadata/.plugins/org.eclipse.swt/EBWebView/Variations @@ -1 +1 @@ -{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":0} \ No newline at end of file +{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":1} \ No newline at end of file diff --git a/.metadata/version.ini b/.metadata/version.ini index b80b2b8..8872af9 100644 --- a/.metadata/version.ini +++ b/.metadata/version.ini @@ -1,3 +1,3 @@ -#Sun May 10 18:29:39 CEST 2026 +#Tue May 12 13:59:16 CEST 2026 org.eclipse.core.runtime=2 org.eclipse.platform=4.39.0.v20260226-0420 diff --git a/asdl/bin/list/mylinkedlist/MyLinkedList$MyLinkedListIterator.class b/asdl/bin/list/mylinkedlist/MyLinkedList$MyLinkedListIterator.class new file mode 100644 index 0000000000000000000000000000000000000000..1eb3b0f60947056180c37c51316581aee0dc1b93 GIT binary patch literal 3777 zcmbVO{Zo|J6@Jd{!t(JNK8oN6QCwGrT@;9tiV!rh5J+I9!C*9P^o4zu7nfbK`z~sm zwz1R6Fa1i}IMa~MG)Y_1rgmCW&}lNQ{VAD#{M`P~f2EW3Iq!XC7jY!hQTE<@?mg$8 z^E~IA`~LmY5B~z-Ni0SY5**IB1+Q!VTE@*@cGCW0{Mwkm7~@X7d@<@ddE3k7qlgIV z=j=thD`RIbb)A}?b7s6KDh18HwCK5+E>*v$A*jkaSG`m&?FjabZE~j`>lai{x|g!H zSIko<@p*IxP7n1DQn6|w?<|_Ttc+doo^xm<>!bzIgH&t~V&y+rHW1jwwOpBx9(CV5@~X)Yl-477Gp7CJ488OzF-J3l^%X(TZJBJSy1r za8xYpMimXuI(Ays_gILkIz6&bYi9c_Y{4UfIuhuliu2P>{9vPF;K|SInjh zLsw^<1<%c8Yj6lHs{WXT!+z+V?PjXci!Vm;IBh%}uec_Fg`>WvCZB2^v(WDgG(!Xx zu3j$KGU?efm&fge0GQ~k9i$1#Iwz>*dV(5mu1LI^+B?Qd{+r|{92M;y%)c5E@+Av{ zI3C3?Gpke&soZ37W_Bp!%sW}HEXpB`vKONkp24#ODQ$bU683;An%A>@+0ZlZbu();n|1Oh*~kixW?#9{Qh$vYFRD^b z!5hgHJhU+f!u+e?zmT>H&a2t@L#W{&8^*ddJJGr|+Xzr!uf2;pwcKk!BY(fZ)p_cN zIPOU#SJ9NXgXV;+VtXRFf}N{q(?u*1UPb(tf8Bom?m#6VkDyv=*$C>;EcMta4QP`_ z9N@l1(=>>7ba2$m66P{F${@m&-B^EF>szR8<%P*#qV^*kI(rA*cUza}$wnvqV{g+x z`qifUJ?fw8s*4*H-oxHRVg+q0IHC$>+NU~aR}ha}pcZBE)^|Spj|Lcq26zt5^t&kt za4TZcg8i}$hh#er%MKiso#>NYtfAd(3vEcr9!yCLXC%&q+K064hbsq=k#<~>4t!e@ z_#W49NT&}_vyb?V03gDF0WuWA6TEvXDnBE_;V2}ERstDqeza*f@naJ*D00RZk4I}Y znvYQtxf#C6rSZK|x1_s_h}z&Dway&UM~1zGze<0(t=NNY^*-FzQGR`df@FNkxA`kx zqbW6*xQ&xbO6d?Oefq8ee`L&OL32z6N`=|*30h+%`3G8v_;l=I!b6UsPWsUz1K2H3 z;D8L`F*%L_IZ+1bU=V5xW$eF`ZIL>+5g}5FXK4|pbU0#)NH6AigC?@kPn*4gNZWk zD%J{ea!t91r&T$s%8~T_>d%*{N7vL(W1G2K{!FGLRR1T{w|}yZ>FpFXv4<>Uzs_#s z`7_G1iq^FizuVkWeY4xMj83EQ!WmQKfjmeQ8qiWNsg1GtkBsxDFLkhU6-PP`uA(o= z_Tc{<2`tB!vBi|UGL+!KwgeBx)Hri48KF37j4~dRcX_@Xke5i_1%A@m*eBEImKpR) z8pp)pdwdZm#AW%ptEIgK2>GE11BGenY>`jQ$E|A-slRe3i4XpWkg9%_;p< zFsJlcFsJluRdc=pk-F~3Kh^K8Uh|)aU-J9Ec}Xs4I>|C$7;Vx2PWpV>tlXKqAEEbb zQsfTOYqqsiO2RLX*~9_$~|6Kv?q zYiH+zvwn|X>kPLvKUjQyI2pWvjtff2cZQTZt*QyGKj1U|N9>gq-(llQ we9htbeJz#u1a7Kx5rpdKAab0Cun;^5FC))&BPGIODsb%O=<%zi=$~u-AJ?`IWB>pF literal 0 HcmV?d00001 diff --git a/asdl/bin/list/mylinkedlist/MyLinkedList$Node.class b/asdl/bin/list/mylinkedlist/MyLinkedList$Node.class index c7eb928ec88efe278dd1ab1a91516ace9bb83715..f831781a11fb5c2d5e37ffc978b46b86f803d789 100644 GIT binary patch delta 29 kcmX@kew=-S4zr*H0}F#B11EzN10RDlgD`{4WLxGg08k+Wng9R* delta 29 kcmX@kew=-S4zr*r0}F!~11Ezx10RC~gD`{SWLxGg08d^7ivR!s diff --git a/asdl/bin/list/mylinkedlist/MyLinkedList.class b/asdl/bin/list/mylinkedlist/MyLinkedList.class index 388912d640b37fb6f8e3abe488eb785693884ef2..1fb99ad548d403b7a41ff3713bd9a80de8cb1060 100644 GIT binary patch literal 8465 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 ASO5S3 literal 6738 zcmc&&>vI#=6+dgOELoDV@iWGOh>!$HmW_Fs7#mD@7?81LiXEpwD6FM5UeGJ6m3cRW zIB65wyxKGgZD*j#l$j3cgiZ+4FjGEurvFC&f__Lpbkd~1bMH!8+ftxk%-GWIy?gGt z=lp)>aaaHN?(4r1(JuPLLp2JmNf~)-L;8Hm$ehuWVlZ}oR18M(#6zk=ji!a~*3j1(?;;{ui{F@*l03or2D$(QHCXO=+gVV|!AyW{tc;!H1X%1KSoZKc6eA zco;NA4?RYHIGwZ33x|#>R6k*9i8Etb&Nc;Z!fWp--P&iE41G%|Ji3@97~&3vftiQa zgXi+&cp;TKlr=JzZVsPI=sC;CW_8u>B1)uy?|&aCqX#HwEk&<0lRHdquP!GKFM6$3+tTMk`7fUS*H4CPwPO9~PN z(*(lyqC78JU(xQRuAt~hM}#I1K-(*V*UuG!T13_Qi+*$vb#)ELw{-wg^w-GGcR3I=)!W_X&V({YD1w4W>q%z zRfR4;E>kCu9cOC;+-_s&$C{Nz-CkAf=A~FHK0{2t{upxCX`X<$vs9%knfT^oNSg&F z+G*oO6}2I4TL7s8&bJl1xZLa)%@R<0aR|VHHk0?#FBN)ixos)#?#OO0I<#))b(|g6 zE`V)9f2E*j5_)n^HkHC_0GiyOpWO6*fZm}Ga0Xl;&6O2LCf`K1U?y;6;)C@{XaDQr zW~$JR?ZX30OUTgDDLGRLxZ+_s5X)qAa}SzgUdQ=dl?MZVT+dr$Iv?uuv=#>u7d~!$ z*YJw~?(6UpR6{;|@H((yjF$pDTZK8iJm9+#qmz(RaBYd)qm>cmE;aL4Ys7Vz+V5cA zMIHEV!wy7GlS-?he+||@Ma>wm!fZgUr%rkjqty#$)?lPSHfZm52v^?CANi8nuajH7 z?YfPjDmJMVkJdYs`j;r>8CJR$A2`nMJptGuec6R8Yj?AD)+>#ddb=EY-AnZHj5Kx~ zJp)K2h|ey7s2ysX|4#n<^xTnq6nenJFDd*5Hj)l7=7dvW1NAyKYhSV%&p4c5DsYr6 z?YdFy`cFYB(ZMdqmiH-gq)Som(WWtpU}Gc_Jqo_S+bw#6EsEZyz9`?^rTz#8&5ddSrYso}-wl=78>vDFb7Jgg9mhhfab{~L_^7Vo-%6S-@N6W+Bd zC#}p0B>Ds=t;|V3bJF(%oV)~+e+;CKfRm%(CAEYWr?8u|1s-Q34jr{D7B3k=6Q(G%#Y7eS7 z(JZ3X04ArAsb`R>DP(FIc4UyhS>$Vuc9MyR%{%ZIDP`+ODO)$&+1d*{Mi$}0@-lB( zUgj;!bBs!P2Of3?HzP(5LYJ(+lR$y%uOl@V^^p~#j?6*lS*$we2+T&?+H(Kk8Ma5E zQRH6{@wh0C7RFp_n2#{LFaX+ZR`)Hc?@&?62Gn`C((3M1lQ+Nrmz;5TsEC*T?hX}E)7|05 zeTQ2_P=zvom|9@kYe3*C1!*2>{RR^1P5dhK7Hy)pQS`5&=)Z%6dJn<#K8@1{G=-~1 zA0p&FLU?^l7JWh&=sI1Y-(kh?1&Rl7)PTz+6t5v+>jm}K1fDg}ctC`j3wn1WmAR;o zQY#X=9)Qi#I;6E1cZ~ZMT%|UNJL}j1n57O5I;q149de})E0~og@&x>zy87>^4ebQ~ z;y~~+N<}eTej>udu?r{~H5GYhNWuz5zV{ zfV0Y{2+Ysm!>35YKRQybw}eQqjYtQQ_5?hw!IMVey=)6I)>xi>mQuwA86Y*_`7hP6 zKOUfZ5_}Z>nHK(hgE3<^Sk0ffYpV)}y15(9t4ga1kG{buJfL#T33sUFPWUv;Bl;6u zyA4A=N7el^0_Ai32>J!i0(TG~e-SPY2?z#DE)JGR=hH$DOzOZ%jGcAiB)C#It3rbp zmAVJ;Gu5&ivJOc#uVkv_N~T)M?|?iLY(wD_P&6v2_c{PU-eD&`@!~XbpJt9U&EBKa z4=_@oiD0L~-;htEa#WJfRFywoQ9f5i-bBSM>*q6)w8yF implements List { @@ -178,6 +181,325 @@ public class MyLinkedList implements List { return oldData; } + public String toString() { + StringBuffer result = new StringBuffer(); + for (Object x : this) result.append(x + " "); + return result.toString(); + } + + public boolean remove(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) { + + // Caso in cui esso sia un primo nodo + if (currentNode == head) { + removeFirst(); + return true; + } + + // Caso in cui esso sia un ultimo nodo + if (currentNode == tail) { + removeLast(); + return true; + } + + // Caso in cui sia in mezzo + Node prevNode = currentNode.prev; + Node nextNode = currentNode.next; + + prevNode.next = nextNode; + nextNode.prev = prevNode; + currentNode.prev = null; + currentNode.next = null; + + size--; + + return true; + } + currentNode = currentNode.next; + } + return false; + } + + public boolean contains(Object object) { + if (object == null || head == null) return false; + Node currentNode = head; + while (currentNode != null) { + if (currentNode.data.equals(object)) return true; + currentNode = currentNode.next; + } + return false; + } + + public Object[] toArray() { + if (head == null) return null; + Object[] array = new Object[size]; + Node currentNode = head; + int i = 0; + while (currentNode != null) { + array[i++] = currentNode; + currentNode = currentNode.next; + } + return array; + } + + public boolean equals(Object object) { + return object == this; + } + + // Parte iteratori + + public Iterator iterator() { + return new MyLinkedListIterator(); + } + + public ListIterator listIterator() { + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements ListIterator { + + // Variabili adoperate + private Node nextNode; + private Node prevNode; + private Node lastReturned = null; + private int posNext; + + public MyLinkedListIterator() { + nextNode = head; + prevNode = null; + posNext = 0; + } + + public MyLinkedListIterator(int index) { + if ((index < 0) || (index > size)) throw new IndexOutOfBoundsException(); + // Caso in cui sia il primo + if (index == 0) { + nextNode = head; + prevNode = null; + posNext = 0; + return; + } + // Caso in cui sia l'ultimo + if (index == size) { + nextNode = null; + prevNode = tail; + posNext = size; + return; + } + nextNode = head; + prevNode = null; + posNext = 0; + while (posNext < index) { + nextNode = nextNode.next; + prevNode = nextNode.prev; + posNext++; + } + } + + @Override + public boolean hasNext() { + return nextNode != null; + } + + @Override + public boolean hasPrevious() { + return prevNode != null; + } + + @Override + public E next() { + if (!hasNext()) throw new NoSuchElementException(); + E data = nextNode.data; + lastReturned = nextNode; + prevNode = nextNode; + nextNode = nextNode.next; + posNext++; + return data; + } + + @Override + public E previous() { + if (!hasPrevious()) throw new NoSuchElementException(); + E data = prevNode.data; + lastReturned = prevNode; + nextNode = prevNode; + prevNode = prevNode.prev; + posNext--; + return data; + } + + @Override + public int nextIndex() { + return posNext; + } + + @Override + public int previousIndex() { + return posNext - 1; + } + + /* + * Il metodo remove si occupa della rimozione del nodo appena restituito + */ + @Override + public void remove() { + // Se non è stato restituito alcun nodo + if (lastReturned == null) throw new NoSuchElementException(); + // Se l'ultimo elemento ad essere stato restituito è la testa + if (lastReturned == head) { + removeFirst(); + nextNode = head; // Head dopo la rimozione del primo nodo è il successivo a quello appena rimosso + prevNode = null; + posNext = 0; + lastReturned = null; + return; + } + // Se l'ultimo elemento ad essere stato restituito è la coda + if (lastReturned == tail) { + removeLast(); + nextNode = null; + prevNode = tail; + posNext = size; + lastReturned = null; + return; + } + // Se è un elemento generico + Node removingNode = lastReturned; + Node nNode = removingNode.next; + Node pNode = removingNode.prev; + + pNode.next = nNode; + nNode.prev = pNode; + removingNode.prev = null; + removingNode.next = null; + + if (lastReturned == prevNode) posNext--; + + nextNode = nNode; + prevNode = pNode; + size--; + lastReturned = null; + } + + /* + * Quando viene richiamata la add, l'elemento viene aggiunto a sinistra del cursore. + * Esempio di seguito: + * A | B + * chiamata add(X) + * A X | B + * Come detto prima la X viene aggiunta a sinistra + */ + @Override + public void add(E data) { + if (data == null) throw new NullPointerException(); + Node newNode = new Node(data, null, null); + // Se la lista è vuota + if (size == 0) { + tail = head = newNode; + prevNode = newNode; + size++; + posNext = 1; + return; + } + // Se il cursore è prima dell'HEAD + if (prevNode == null) { + addFirst(data); + prevNode = head; + posNext++; + return; + } + // Se il cursore è dopo la TAIL + if (prevNode == tail) { + addLast(data); + prevNode = tail; + posNext++; + return; + } + // Generico + newNode.prev = prevNode; + newNode.next = nextNode; + prevNode.next = newNode; + nextNode.prev = newNode; + lastReturned = null; + posNext++; + size++; + } + + @Override + public void set(E data) { + if (lastReturned == null) throw new NoSuchElementException(); + if (data == null) throw new NullPointerException(); + lastReturned.data = data; + } + } + @Override + public T[] toArray(T[] a) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean containsAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(int index, Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean removeAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean retainAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public E remove(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int indexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int lastIndexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public ListIterator listIterator(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List subList(int fromIndex, int toIndex) { + // TODO Auto-generated method stub + return null; + } }

s-sze$Edw)hSNg*ki(gh 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 z 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