{"id":1450,"date":"2015-04-22T18:15:21","date_gmt":"2015-04-22T16:15:21","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1450"},"modified":"2015-04-22T18:15:21","modified_gmt":"2015-04-22T16:15:21","slug":"java-egyperces-torles-listabol-megoldasa","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1450","title":{"rendered":"Java egyperces &#8211; T\u00f6rl\u00e9s list\u00e1b\u00f3l megold\u00e1sa"},"content":{"rendered":"<h3><strong>Csak akkor olvass tov\u00e1bb, ha a <a title=\"Java egyperces \u2013 t\u00f6rl\u00e9s list\u00e1b\u00f3l\" href=\"http:\/\/www.webotlet.hu\/?p=1426\">T\u00f6rl\u00e9s list\u00e1b\u00f3l<\/a> feladatot megoldottad, vagy nem siker\u00fclt megoldani.<\/strong><\/h3>\n<p>Az alap feladatot a fenti linken megtal\u00e1lod, az ott megadott oszt\u00e1lyt \u00e9s a felt\u00f6lt\u00f6tt list\u00e1t fogom haszn\u00e1lni. A feladat teh\u00e1t az volt, hogy t\u00f6r\u00f6lj\u00fck ki a vizsl\u00e1k adatait a list\u00e1b\u00f3l. L\u00e1ssuk akkor a megold\u00e1sok evol\u00faci\u00f3j\u00e1t, mely a hib\u00e1s megold\u00e1sokt\u00f3l a jobbak fel\u00e9 halad:<\/p>\n<h4>1. v\u00e1ltozat<\/h4>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; kutyak.size(); i++ )\r\n{\r\n  if( kutyak.get(i).getNev().equalsIgnoreCase(&quot;vizsla&quot;) )\r\n  {\r\n    kutyak.remove(i);\r\n  }\r\n}\r\n<\/pre>\n<p>Els\u0151 megold\u00e1sk\u00e9nt valami ilyesmit szoktak megadni a di\u00e1kok. A gond az, hogy ez a megold\u00e1s nem j\u00f3. Mi\u00e9rt? Mert ez a kimenete:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nKutya{fajta=tacsko, kor=3, szin=fekete}\r\nKutya{fajta=vizsla, kor=3, szin=fekete}\r\nKutya{fajta=labrador, kor=7, szin=zsemle}\r\nKutya{fajta=labrador, kor=5, szin=arany}\r\nKutya{fajta=labrador, kor=7, szin=fekete}\r\nKutya{fajta=labrador, kor=7, szin=barna}\r\nKutya{fajta=labrador, kor=1, szin=zsemle}\r\nKutya{fajta=tacsko, kor=2, szin=fekete}\r\n<\/pre>\n<p>Egy vizsla benne maradt. Val\u00f3ban csak vizsl\u00e1kat t\u00f6r\u00f6lt\u00fcnk ki, de nem mindet. Mi\u00e9rt? Az algoritmus, ha az aktu\u00e1lis objektum fajt\u00e1ja vizsla, akkor elt\u00e1vol\u00edtja az adott helyen l\u00e9v\u0151 elemet. Akkor mi a gond? Az, hogy a lista ett\u0151l kezdve r\u00f6videbb lesz, hiszen a m\u00f6g\u00f6tte l\u00e9v\u0151 elemek, eggyel el\u0151rel\u00e9pnek.<\/p>\n<p>Nem, nem az a gond, hogy t\u00falszaladn\u00e1nk a lista v\u00e9g\u00e9n, mert a for ciklus fut\u00e1si felt\u00e9tel\u00e9ben folyamatosan k\u00f6vetj\u00fck a lista m\u00e9ret\u00e9t, \u00edgy a v\u00e9g\u00e9n biztosan nem szaladunk t\u00fal. A gond akkor jelentkezik, ha k\u00e9t vagy t\u00f6bb t\u00f6rlend\u0151 elem egym\u00e1s ut\u00e1n helyezkedik el. Kit\u00f6rl\u00f6d az els\u0151t, akkor a m\u00f6g\u00f6tte l\u00e9v\u0151k el\u0151rel\u00e9pnek, vagyis a m\u00f6g\u00f6tte l\u00e9v\u0151 sorsz\u00e1ma is i lesz. De a k\u00f6vetkez\u0151 ciklusban az i m\u00e1r eggyel megn\u0151, vagyis a k\u00e9t egym\u00e1s melletti elemb\u0151l csak az els\u0151t t\u00f6r\u00f6lheted! Egy viszonylag egyszer\u0171 tr\u00fckkel azonban ez kiker\u00fclhet\u0151:<\/p>\n<h4>2. v\u00e1ltozat<\/h4>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nfor( int i = 0; i &lt; kutyak.size(); i++ )\r\n{\r\n  if( kutyak.get(i).getNev().equalsIgnoreCase(&quot;vizsla&quot;) )\r\n  {\r\n    kutyak.remove(i--);\r\n  }\r\n}\r\n<\/pre>\n<p>Nagyon eleg\u00e1ns megold\u00e1s. Amikor elt\u00e1vol\u00edtom a megfelel\u0151 elemet, az elt\u00e1vol\u00edt\u00e1s ut\u00e1n az els\u0151 teend\u0151 az, hogy az i-t is visszal\u00e9ptetem, \u00edgy ut\u00e1na hi\u00e1ba l\u00e9p egyet el\u0151re a k\u00f6vetkez\u0151 ciklusban, az helyesen ism\u00e9t a megfelel\u0151 elemre mutat. Lehet ezt m\u00e9g fokozni? Hogyne \ud83d\ude42<\/p>\n<h4>3. v\u00e1ltozat<\/h4>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nfor( int i = kutyak.size()-1; i != -1; i-- )\r\n{\r\n  if( kutyak.get(i).getNev().equalsIgnoreCase(&quot;vizsla&quot;) )\r\n  {\r\n    kutyak.remove(i);\r\n  }\r\n}\r\n<\/pre>\n<p>Mit is csin\u00e1ltam? Most nincs ott az i cs\u00f6kkent\u00e9se. Nincs is r\u00e1 sz\u00fcks\u00e9g, mivel a list\u00e1t h\u00e1tulr\u00f3l kezdtem feldolgozni! Ha tal\u00e1lok egy megfelel\u0151 elemet, elt\u00e1vol\u00edtom. A m\u00f6g\u00f6tte l\u00e9v\u0151k el\u0151rel\u00e9pnek, de ez engem egy\u00e1ltal\u00e1n nem \u00e9rdekel, mert az elt\u00e1vol\u00edtott elem m\u00f6g\u00f6tt m\u00e1r biztosan nem lehetnek t\u00f6rl\u00f6lni val\u00f3k, hiszen onnan \u00e9rkeztem! Haladok el\u0151re, t\u00f6rl\u00f6m a megfelel\u0151 elemeket, \u00e9s a lista v\u00e9g\u00e9t meg h\u00fazom magam m\u00f6g\u00f6tt el\u0151re, de az i mindig a megfelel\u0151 elemre mutat.<\/p>\n<p>Apr\u00f3s\u00e1g, mondhatn\u00e1d, hiszen l\u00e1tsz\u00f3lag csak annyit sp\u00f3roltunk, hogy t\u00f6rl\u00e9skor egy i&#8211; kimarad. Nem, nem csak ennyit. A for ciklus eset\u00e9ben a fut\u00e1si felt\u00e9telt minden ciklusban ki\u00e9rt\u00e9keli. Vagyis nem csak egy i cs\u00f6kkent\u00e9st sp\u00f3rolt\u00e1l meg, hanem azt is, hogy nem kell mindig \u00fajra meg \u00fajra lek\u00e9rdezni a lista m\u00e9ret\u00e9t.<\/p>\n<p>Nem is olyan bonyolult, igaz?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Csak akkor olvass tov\u00e1bb, ha a T\u00f6rl\u00e9s list\u00e1b\u00f3l feladatot megoldottad, vagy nem siker\u00fclt megoldani. Az alap feladatot a fenti linken megtal\u00e1lod, az ott megadott oszt\u00e1lyt \u00e9s a felt\u00f6lt\u00f6tt list\u00e1t fogom haszn\u00e1lni. A feladat teh\u00e1t az volt, hogy t\u00f6r\u00f6lj\u00fck ki a <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1450\">Tov\u00e1bb <span class=\"screen-reader-text\">  Java egyperces &#8211; T\u00f6rl\u00e9s list\u00e1b\u00f3l megold\u00e1sa<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95],"tags":[113,86,16,20,143,112],"class_list":["post-1450","post","type-post","status-publish","format-standard","hentry","category-egyperces-feladatok-megoldasai","tag-eltavolitas","tag-java","tag-lista","tag-objektum","tag-programozas","tag-torles"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1450","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1450"}],"version-history":[{"count":3,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1450\/revisions"}],"predecessor-version":[{"id":1454,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1450\/revisions\/1454"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1450"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1450"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1450"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}