{"id":1260,"date":"2015-03-31T08:51:35","date_gmt":"2015-03-31T06:51:35","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1260"},"modified":"2019-07-29T14:35:00","modified_gmt":"2019-07-29T12:35:00","slug":"java-kiegeszito-lecke-tobbszoros-rendezes","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1260","title":{"rendered":"Java kieg\u00e9sz\u00edt\u0151 lecke &#8211; T\u00f6bbsz\u00f6r\u00f6s rendez\u00e9s"},"content":{"rendered":"<h3><strong>Csak akkor olvass tov\u00e1bb, ha a <a title=\"T\u00f6bbsz\u00f6r\u00f6s rendez\u00e9s\" href=\"http:\/\/www.webotlet.hu\/?p=1081\">t\u00f6bbsz\u00f6r\u00f6s rendez\u00e9s<\/a> feladatot megoldottad, vagy nem siker\u00fclt megoldani.<\/strong><\/h3>\n<p>Adott teh\u00e1t egy Kutya oszt\u00e1ly. Minden kuty\u00e1r\u00f3l 2 tulajdons\u00e1got tartunk nyilv\u00e1n. Ezt kellene el\u0151bb fajta, majd azonos fajta eset\u00e9n \u00e9letkor szerint rendezni.<\/p>\n<h4>A megold\u00e1s<\/h4>\n<p>A feladat megold\u00e1sakor k\u00e9tszer rendez\u00fcnk. El\u0151sz\u00f6r az els\u0151 tulajdons\u00e1g szerint egy tetsz\u0151leges rendez\u00e9si algoritmussal:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nKutya&#x5B;] kutyak =\r\n  {\r\n    new Kutya(&quot;tacsko&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 7),\r\n    new Kutya(&quot;labrador&quot;, 5),\r\n    new Kutya(&quot;vizsla&quot;, 1),\r\n    new Kutya(&quot;labrador&quot;, 2),\r\n    new Kutya(&quot;vizsla&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 1),\r\n    new Kutya(&quot;tacsko&quot;, 2)\r\n  };\r\n\r\n\/\/ els\u0151 rendez\u00e9s az els\u0151 tulajdons\u00e1g szerint (fajta)\r\nKutya csere;\r\nfor( int i = 0; i &lt; kutyak.length-1; i++ )\r\n{\r\n  for( int j = i+1; j &lt; kutyak.length; j++ )\r\n  {\r\n    if( kutyak&#x5B;i].getFajta().compareTo( kutyak&#x5B;j].getFajta() ) &gt; 0 )\r\n    {\r\n      csere = kutyak&#x5B;i];\r\n      kutyak&#x5B;i] = kutyak&#x5B;j];\r\n      kutyak&#x5B;j] = csere;\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Ha ez megvan, akkor \u00fagy rendez\u00fcnk a m\u00e1sodik tulajdons\u00e1g alapj\u00e1n, hogy az els\u0151 tulajdons\u00e1gokat m\u00e1r nem keverj\u00fck \u00f6ssze. A kiemelt sorban l\u00e1that\u00f3 az a felt\u00e9tel, mely biztos\u00edtja, hogy csak akkor vizsg\u00e1ljuk meg a m\u00e1sodik tulajdons\u00e1got, ha az els\u0151 tulajdons\u00e1guk megegyezik! Ha ez teljes\u00fcl \u00c9S az \u00e9letkor nem j\u00f3 sorrendben \u00e1ll, akkor cser\u00e9l\u00fcnk. Nagyon fontos a k\u00e9t felt\u00e9tel vizsg\u00e1lat\u00e1nak sorrendje!<\/p>\n<pre class=\"brush: java; gutter: true; highlight: [6]; title: ; notranslate\" title=\"\">\r\n\/\/ m\u00e1sodik rendez\u00e9s a m\u00e1sodik tulajdons\u00e1g eset\u00e9n\r\nfor( int i = 0; i &lt; kutyak.length-1; i++ )\r\n{\r\n  for( int j = i+1; j &lt; kutyak.length; j++ )\r\n  {\r\n    if( kutyak&#x5B;i].getFajta().equals( kutyak&#x5B;j].getFajta() ) &amp;&amp;\r\n        kutyak&#x5B;i].getKor() &gt; kutyak&#x5B;j].getKor() )\r\n    {\r\n      csere = kutyak&#x5B;i];\r\n      kutyak&#x5B;i] = kutyak&#x5B;j];\r\n      kutyak&#x5B;j] = csere;\r\n    }\r\n  }\r\n}\r\n\/\/ ki\u00edrat\u00e1s ellen\u0151rz\u00e9sk\u00e9pp, a sorrend val\u00f3ban megfelel\u0151\r\nfor( Kutya k : kutyak )\r\n{\r\n  System.out.println( k.toString() );\r\n}\r\n<\/pre>\n<p>A megold\u00e1s k\u00e9t ciklust ig\u00e9nyel, ami az\u00e9rt l\u00e1ssuk be, nem t\u00fal hat\u00e9kony. Lehet-e m\u00e9g optimaliz\u00e1lni, egyszer\u0171s\u00edteni rajta?<\/p>\n<h4>Egyszer\u0171bb megold\u00e1s<\/h4>\n<p>L\u00e1ssunk egy olyan megold\u00e1st, amely egyetlen ciklussal oldja meg a k\u00e9t oszlop szerinti rendez\u00e9st:<\/p>\n<pre class=\"brush: java; gutter: true; highlight: [19,21,22]; title: ; notranslate\" title=\"\">\r\nKutya&#x5B;] kutyak =\r\n  {\r\n    new Kutya(&quot;tacsko&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 7),\r\n    new Kutya(&quot;labrador&quot;, 5),\r\n    new Kutya(&quot;vizsla&quot;, 1),\r\n    new Kutya(&quot;labrador&quot;, 2),\r\n    new Kutya(&quot;vizsla&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 1),\r\n    new Kutya(&quot;tacsko&quot;, 2)\r\n  };\r\n\r\nKutya csere;\r\nfor( int i = 0; i &lt; kutyak.length-1; i++ )\r\n{\r\n  for( int j = i+1; j &lt; kutyak.length; j++ )\r\n  {\r\n\/\/ ha a fajt\u00e1juk szerint az el\u0151l l\u00e9v\u0151 a nagyobb (abc rend)\r\n    if( kutyak&#x5B;i].getFajta().compareTo( kutyak&#x5B;j].getFajta() ) &gt; 0 ||\r\n\/\/ ha a fajt\u00e1juk egyenl\u0151 \u00c9S az el\u0151l l\u00e9v\u0151 \u00e9letkora nagyobb\r\n        ( kutyak&#x5B;i].getFajta().equals( kutyak&#x5B;j].getFajta() ) &amp;&amp;\r\n          kutyak&#x5B;i].getKor() &gt; kutyak&#x5B;j].getKor() ) )\r\n    {\r\n      csere = kutyak&#x5B;i];\r\n      kutyak&#x5B;i] = kutyak&#x5B;j];\r\n      kutyak&#x5B;j] = csere;\r\n    }\r\n  }\r\n}\r\nfor( Kutya k : kutyak )\r\n{\r\n  System.out.println( k.toString() );\r\n}\r\n<\/pre>\n<p>Akkor t\u00e9telesen a magyar\u00e1zat a kiemelt sorokra vonatkoz\u00f3an:<\/p>\n<ul>\n<li>12 &#8211; Ha a k\u00e9t kutya fajt\u00e1j\u00e1t \u00f6sszehasonl\u00edtjuk, \u00e9s az el\u0151l l\u00e9v\u0151 a nagyobb, akkor meg kell cser\u00e9lni a kett\u0151t. Mivel a k\u00f6vetkez\u0151 felt\u00e9tel VAGY m\u0171velettel kapcsol\u00f3dik, ez\u00e9rt ekkor a t\u00f6bbi felt\u00e9telt nem is vizsg\u00e1ljuk, ha az els\u0151 igaz<\/li>\n<li>14 &#8211; Ha az el\u0151z\u0151 felt\u00e9tel hamis, vagyis az el\u0151l l\u00e9v\u0151 nincs h\u00e1tr\u00e9bb az abc rendben, akkor megn\u00e9zz\u00fck, hogy ugyanabba a fajt\u00e1ba tartoznak-e. Ha igen, csak akkor vizsg\u00e1ljuk meg az \u00e9letkorukat, \u00edgy nem keverj\u00fck \u00f6ssze a fajt\u00e1kat.<\/li>\n<li>15 &#8211; \u00c9S ha egyez\u0151 fajta eset\u00e9n az el\u0151l l\u00e9v\u0151 az id\u0151sebb, akkor megcser\u00e9lj\u00fck \u0151ket<\/li>\n<\/ul>\n<p>Ha jobban megn\u00e9zed, gyakorlatilag a k\u00e9t rendez\u00e9ses feladat felt\u00e9teleit kellett VAGY-gyal \u00f6sszek\u00f6tni, \u00e9s egy ciklussal megoldhat\u00f3 a feladat.<\/p>\n<h4>Tiszt\u00e1bb megold\u00e1s<\/h4>\n<p>Most hogy m\u00e1r ezt a feladatot is meg tudod oldani, m\u00e9g egy picit terelgetn\u00e9lek a jobb programoz\u00e1si technik\u00e1k fel\u00e9. A helyzet az, hogy az ilyen rendez\u00e9si felt\u00e9telt, ami esetleg t\u00f6bbsz\u00f6r is felhaszn\u00e1l\u00e1sra ker\u00fclhet, vagy nagyon \u00e1tl\u00e1thatatlann\u00e1 teszi a k\u00f3dot, \u00e9rdemesebb kiszervezni egy met\u00f3dusba. Ennek az az oka, hogy k\u00e9s\u0151bb ak\u00e1r mag\u00e1ba a Kutya oszt\u00e1lyba is berakhatjuk, aminek a be\u00e9p\u00edtett rendez\u00e9sek nagyon fognak \u00f6r\u00fclni!<\/p>\n<p>A k\u00f3d gyakorlatilag \u00edgy m\u00f3dosul, l\u00e1ssuk egyben az eg\u00e9szet:<\/p>\n<pre class=\"brush: java; gutter: true; highlight: [22,36,37,38,39,40,41,42,43,44,45,46,47,48]; title: ; notranslate\" title=\"\">\r\npublic static void main( String&#x5B;] args )\r\n{\r\n  Kutya&#x5B;] kutyak =\r\n  {\r\n    new Kutya(&quot;tacsko&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 7),\r\n    new Kutya(&quot;labrador&quot;, 5),\r\n    new Kutya(&quot;vizsla&quot;, 1),\r\n    new Kutya(&quot;labrador&quot;, 2),\r\n    new Kutya(&quot;vizsla&quot;, 3),\r\n    new Kutya(&quot;labrador&quot;, 1),\r\n    new Kutya(&quot;tacsko&quot;, 2)\r\n  };\r\n\r\n  System.out.println();\r\n\r\n  Kutya csere;\r\n  for ( int i = 0; i &lt; kutyak.length - 1; i++ )\r\n  {\r\n    for ( int j = i + 1; j &lt; kutyak.length; j++ )\r\n    {\r\n      if ( rendezesFajtaEletkor( kutyak&#x5B;i],kutyak&#x5B;j] ) )\r\n      {\r\n        csere = kutyak&#x5B;i];\r\n        kutyak&#x5B;i] = kutyak&#x5B;j];\r\n        kutyak&#x5B;j] = csere;\r\n      }\r\n    }\r\n  }\r\n  for ( Kutya k : kutyak )\r\n  {\r\n    System.out.println(k.toString());\r\n  }\r\n}\r\n\r\npublic static boolean rendezesFajtaEletkor( Kutya a, Kutya b )\r\n{\r\n  if ( a.getFajta().compareTo( b.getFajta() ) &gt; 0 ||\r\n       ( a.getFajta().equals( b.getFajta() ) &amp;&amp;\r\n         a.getKor() &gt; b.getKor() ) )\r\n  {\r\n    return true;\r\n  }\r\n  else\r\n  {\r\n    return false;\r\n  }\r\n}\r\n<\/pre>\n<p>A l\u00e9nyeg, hogy a rendez\u00e9s \u00f6sszetett felt\u00e9tel\u00e9t kirakjuk egy olyan nev\u0171 met\u00f3dusba, melynek neve term\u00e9szetesen utal arra, hogy az mit fog csin\u00e1lni. Ez a met\u00f3dus csak egy v\u00e1laszt ad arra, hogy a felt\u00e9telnek megfelel\u0151en ki kell-e cser\u00e9lni a k\u00e9t kuty\u00e1t, vagy nem. K\u00e9s\u0151bb ezt a met\u00f3dust \u00e1trakhatjuk k\u00f6zvetlen\u00fcl a Kutya oszt\u00e1lyba, ha ez lesz a kuty\u00e1k \u00e1ltal\u00e1nos sorba rendez\u00e9si m\u00f3dja.<\/p>\n<p>A met\u00f3dus m\u00e9g mindig egyszer\u0171s\u00edthet\u0151::<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npublic static boolean rendezesFajtaEletkor( Kutya a, Kutya b )\r\n{\r\n  return a.getFajta().compareTo( b.getFajta() ) &gt; 0 ||\r\n         ( a.getFajta().equals( b.getFajta() ) &amp;&amp;\r\n           a.getKor() &gt; b.getKor() );\r\n}\r\n<\/pre>\n<p>Nincs felt\u00e9telvizsg\u00e1lat, hiszen az \u00f6sszetett kifejez\u00e9s \u00f6nmag\u00e1ban m\u00e1r a v\u00e1laszt jelenti, hogy kell-e cser\u00e9lni, vagy sem.<\/p>\n<p>K\u00e9t tulajdons\u00e1g szerinti t\u00f6bbszint\u0171 rendez\u00e9sn\u00e9l bonyolultabb nem hinn\u00e9m, hogy lenne a rendez\u00e9s t\u00e9mak\u00f6rb\u0151l k\u00f6z\u00e9piskolai szinten. Ott is \u00fagy gondolom, hogy ink\u00e1bb bizonyos feladatok megold\u00e1s\u00e1t k\u00f6nny\u00edti meg. Ha az egy ciklusos megold\u00e1sig eljutsz \u00fagy, hogy alkalmazni is tudod, akkor m\u00e1r nem volt hi\u00e1ba ez a feladat. De a v\u00e9gs\u0151 c\u00e9l az, hogy az ilyen rendez\u00e9si m\u00f3dokat \u00e1t helyezni met\u00f3dusba, ami majd az objektumok \u00f6sszehasonl\u00edt\u00e1s\u00e1t k\u00f6nny\u00edti meg a be\u00e9p\u00edtett rendez\u00e9seknek.<\/p>\n<h4>Nincs hat\u00e1r<\/h4>\n<p>Nincs korl\u00e1tja annak, h\u00e1ny oszlop szerint lehet rendezni, ennek csak \u00e9s kiz\u00e1r\u00f3lag a tud\u00e1sod szabhat hat\u00e1rt. Ha a kuty\u00e1knak lenne egy sz\u00edn tulajdons\u00e1ga is, akkor olyan rendez\u00e9s is \u00edrhat\u00f3, melyben el\u0151sz\u00f6r fajta, majd \u00e9letkor, v\u00e9g\u00fcl sz\u00edn szerint rendezi \u0151ket. Csak a felt\u00e9tel lesz bonyolultabb, a megold\u00e1s azon m\u00falik, \u00f6ssze tudod-e rakni. Akkor m\u00e1r h\u00e1rom ciklust sp\u00f3rolhatsz meg azzal, hogy meg\u00e9rtetted a felt\u00e9telek \u00f6sszevon\u00e1s\u00e1t. Nyilv\u00e1n a met\u00f3dus nev\u00e9ben is szerepeltetni kell, hogy mit csin\u00e1l, ahogy eddig is tetted. De csak hogy bizony\u00edtsam, hogy t\u00e9nyleg lehets\u00e9ges, itt a met\u00f3dus hozz\u00e1, kuty\u00e1kat is adok, de az oszt\u00e1lyt gy\u00e1rtsd le magadnak hozz\u00e1. A met\u00f3dusban p\u00e1r b\u00f3nusz \u00fcres sorral az\u00e9rt m\u00e9g seg\u00edtek, hogy meg\u00e9rthesd. J\u00f3 bogar\u00e1sz\u00e1st!<\/p>\n<p>Kuty\u00e1k:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nKutya&#x5B;] kutyak =\r\n{\r\n  new Kutya(&quot;tacsko&quot;, 3, &quot;fekete&quot;),\r\n  new Kutya(&quot;vizsla&quot;, 6, &quot;arany&quot;),\r\n  new Kutya(&quot;vizsla&quot;, 3, &quot;fekete&quot;),\r\n  new Kutya(&quot;labrador&quot;, 7, &quot;zsemle&quot;),\r\n  new Kutya(&quot;labrador&quot;, 5, &quot;arany&quot;),\r\n  new Kutya(&quot;vizsla&quot;, 3, &quot;arany&quot;),\r\n  new Kutya(&quot;labrador&quot;, 7, &quot;fekete&quot;),\r\n  new Kutya(&quot;vizsla&quot;, 3, &quot;barna&quot;),\r\n  new Kutya(&quot;labrador&quot;, 7, &quot;barna&quot;),\r\n  new Kutya(&quot;labrador&quot;, 1, &quot;zsemle&quot;),\r\n  new Kutya(&quot;tacsko&quot;, 2, &quot;fekete&quot;)\r\n};\r\n<\/pre>\n<p>Met\u00f3dus:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npublic static boolean rendezesFajtaEletkorSzin( Kutya a, Kutya b )\r\n{\r\n  return  a.getFajta().compareTo( b.getFajta() ) &gt; 0 ||\r\n\r\n          ( a.getFajta().equals( b.getFajta() ) &amp;&amp;\r\n            a.getKor() &gt; b.getKor() ) ||\r\n\r\n          ( a.getFajta().equals( b.getFajta() ) &amp;&amp;\r\n            a.getKor() == b.getKor() &amp;&amp;\r\n            a.getSzin().compareTo( b.getSzin() ) &gt; 0 );\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Csak akkor olvass tov\u00e1bb, ha a t\u00f6bbsz\u00f6r\u00f6s rendez\u00e9s feladatot megoldottad, vagy nem siker\u00fclt megoldani. Adott teh\u00e1t egy Kutya oszt\u00e1ly. Minden kuty\u00e1r\u00f3l 2 tulajdons\u00e1got tartunk nyilv\u00e1n. Ezt kellene el\u0151bb fajta, majd azonos fajta eset\u00e9n \u00e9letkor szerint rendezni. A megold\u00e1s A feladat <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1260\">Tov\u00e1bb <span class=\"screen-reader-text\">  Java kieg\u00e9sz\u00edt\u0151 lecke &#8211; T\u00f6bbsz\u00f6r\u00f6s rendez\u00e9s<\/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":[101],"tags":[86,143,28,102],"class_list":["post-1260","post","type-post","status-publish","format-standard","hentry","category-java-kiegeszito-leckek","tag-java","tag-programozas","tag-rendezes","tag-tobbszoros-rendezes"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1260","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=1260"}],"version-history":[{"count":3,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1260\/revisions"}],"predecessor-version":[{"id":2475,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1260\/revisions\/2475"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}