tag:blogger.com,1999:blog-757496094257544869.post2560347677040750337..comments2023-03-26T13:25:47.303+03:00Comments on Java-Bulldozer: Поиск по ключу входящему в числовой диапазон.Никита Кокшаровhttp://www.blogger.com/profile/05394947096577510025noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-757496094257544869.post-39126392365395655522010-11-29T09:07:33.320+03:002010-11-29T09:07:33.320+03:00Bura, а ты используй чужой JIT компилятор,тогда вс...Bura, а ты используй чужой JIT компилятор,тогда все будет ок! Проверено!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-6277289339179550392010-11-06T20:26:06.820+03:002010-11-06T20:26:06.820+03:00Но на самом деле, лучше использовать стандартные р...Но на самом деле, лучше использовать стандартные реализации (если они уже есть) и не изобретать своих велосипедов. Как известно.. свой код JIT оптимизирует лучше чем чужой.Burahttps://www.blogger.com/profile/05010964563973969079noreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-10330086116309772742010-11-06T20:15:44.238+03:002010-11-06T20:15:44.238+03:00"но что если вместо индекса будет объект?&quo..."но что если вместо индекса будет объект?"<br />Можно, например, использовать вот такую конструкцию:<br />Object[][] array = {<br />{new Integer(10), любой объект},<br />...<br />}Burahttps://www.blogger.com/profile/05010964563973969079noreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-51284267932812179272010-11-06T12:28:46.470+03:002010-11-06T12:28:46.470+03:00Я вижу использовали уровни как индекс в массиве, н...Я вижу использовали уровни как индекс в массиве, но что если вместо индекса будет объект? В своем посте я хотел показать именно пример поиска.<br /><br />NPE можно избежать, если добавить<br />lMap.put(Integer.MAX_VALUE, 10);<br /><br />В моем приложении такое произойти не может, т.к. опыт не может быть больше границы 300.Никита Кокшаровhttps://www.blogger.com/profile/05394947096577510025noreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-5498577962859965062010-11-05T23:09:11.930+03:002010-11-05T23:09:11.930+03:00Коллеги, вот пример:
public class Test{
privat...Коллеги, вот пример:<br /><br />public class Test{<br /> <br /> private static final NavigableMap lMap = new TreeMap();<br /> <br /> private static final Integer[] array = {<br /> 12, 30, 67, 100, 129, 148, 174, 200, 240, 300 <br /> };<br /> <br /> static {<br /> lMap.put(12, 1);<br /> lMap.put(30, 2);<br /> lMap.put(67, 3);<br /> lMap.put(100, 4);<br /> lMap.put(129, 5);<br /> lMap.put(148, 6);<br /> lMap.put(174, 7);<br /> lMap.put(200, 8);<br /> lMap.put(240, 9);<br /> lMap.put(300, 10);<br /> }<br /> <br /> public static Integer findLevel1(Integer exp) {<br /> return lMap.ceilingEntry(exp).getValue();<br /> }<br /> <br /> public static Integer findLevel2(Integer exp) {<br /> for (int i = 0; i < array.length; i++) {<br /> if (array[i] >= exp) {<br /> return i + 1;<br /> }<br /> }<br /> <br /> return array.length;<br /> }<br /> <br /> public static void main(String[] args) {<br /> Integer[] testArr = {<br /> 3, 130, 180, 290, 300<br /> };<br /> for (Integer n : testArr) {<br /> long start = System.nanoTime();<br /> System.out.println("first: score=" + n <br /> + "; level=" + findLevel1(n)<br /> + "; time=" + (System.nanoTime() - start));<br /> }<br /> for (Integer n : testArr) {<br /> long start = System.nanoTime();<br /> System.out.println("second: score=" + n <br /> + "; level=" + findLevel1(n)<br /> + "; time=" + (System.nanoTime() - start));<br /> }<br /> }<br /> <br />}<br /><br />Надеюсь с форматированием разберетесь :)<br /><br />и мой стектрейс:<br /><br />first: score=3; level=1; time=388038<br />first: score=130; level=6; time=20114<br />first: score=180; level=8; time=24863<br />first: score=290; level=10; time=18438<br />first: score=300; level=10; time=18438<br />second: score=3; level=1; time=25981<br />second: score=130; level=6; time=17600<br />second: score=180; level=8; time=17880<br />second: score=290; level=10; time=22629<br />second: score=300; level=10; time=18438<br /><br />Вот такой вот интересный результат.<br /><br />И еще, у варианта 1 есть недостаток: Если значение привесит максимально допустимое, то в результате мы получим NullPointerException.. со вторым вариантом такого не произойдет.Burahttps://www.blogger.com/profile/05010964563973969079noreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-62049594326636421932010-11-05T21:21:35.496+03:002010-11-05T21:21:35.496+03:00Таблица уровней в приложении существует лишь в одн...Таблица уровней в приложении существует лишь в одном экземпляре, потому я особо не беспокоюсь о памяти. А вот по поводу использования массива не могли бы привести пример?Никита Кокшаровhttps://www.blogger.com/profile/05394947096577510025noreply@blogger.comtag:blogger.com,1999:blog-757496094257544869.post-33343549564960879012010-11-03T19:12:54.404+03:002010-11-03T19:12:54.404+03:00Интерфейс интересный, не обращал на него внимания....Интерфейс интересный, не обращал на него внимания. Но в данном случае, казалось бы, простой массив верхних границ уровней, + binarySearch по нему будет иметь ту же асимптотику, но меньший коэффициент, и экономнее по памяти -- нет?Ruslan Chereminhttps://www.blogger.com/profile/01023948540752159657noreply@blogger.com