Ответы пользователя по тегу Java
  • Как дописать строку в конец текстового файла в Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Открывать каждый раз файл в методе write не на перезапись с начала файла, как сделано здесь, а на дозапись. Конкретные параметры и вызовы не помню)))
    Ответ написан
    Комментировать
  • Почему hashset добавляет одинаковые объекты?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Переписывать нужно методы hashСode и equals вместе.
    Получилось так, что equals, вызываемый при обнаружении равенства hasСode, унаследован от Object. А он там сравнивает объекты по их адресу в памяти. Которые, для разных объектов, само собой, разные. Поэтому Ваш HashSet и считает что ВСЕ новые объекты, какой бы ни был у них hashcode, будут разными!

    Просто перепишите и equals, чтобы он сравнивал между собой соответствующие друг другу поля класса у разных его экземпляров. И при их равенстве HashSet отвергнет второй объект, у которого тот же hashCode и те же значения полей.

    Больше про эти дела, например тут.

    И вообще это очень полезное и железное правило: одновременно менять (или проверять работоспособность этой сладкой парочки) hashCode и equals.
    Ответ написан
    2 комментария
  • Какая средняя ЗП у .Java разработчика в Новосибирске?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    На взгляд со стороны работника, любая средняя в РФ (и не только, был опыт и с забугорьем) контора подбирает людей по принципу минимальной зарплаты. И торгуется за эту зарплату из принципа.

    Понятно, что любой средний владелец любого (и самого минимального) капитала оптимизирует прежде всего свою личную прибыль на ближайший финансовый год.

    Казалось бы, ты просчитай, продумай, что тебе выгоднее, одного брать и на много, или двух на чуть-большую сумму. Или ещё что! Нет, он берёт одного и на меньшую)))

    Такова диалектика личной прибыли и заинтересованности. Это - закономерность, и исключения её не опровергают.

    В Перми, знаю, начинающие программеры любого рода и вида берутся на 50-70 грязными. В Москве, полагаю, программеры однозначно хотят побольше. Тем более, что они в Москве все родом из перми или новосибирска и потратились на переезд. А вот дадут-ли - это уже вопрос везения, а не рыночных суб-материй.

    Всё - ПМСМ!
    Ответ написан
    Комментировать
  • История местоположения google, как получить даты посещения конкретной точки?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Гугль, значит, следит за тобой, маленький братец? Ну-ну (задумчиво отключает всякий Гугль 5 лет тому назад и не включает Яндекс).
    Ответ написан
  • Какие библиотеки существуют для разработки десктопного приложения на Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Основной смысл существования Java в том, что она работает везде приблизительно одинаково. Посему не следует использовать какой-либо софт, использующий нативные интерфейсы, за исключением собственно Java VM.

    В этом случае решение - только Swing. На нём реально можно писать приложения, нисколько не уступающие нативным на Windows, скажем. И выглядят они неотличимо. По крайней мере, лучше Delphi ))) Чтобы вид Java-десктоп не отличался от натbвиного, достаточно одной строки кода. Тогда в разных системах приложение будет выглядеть слегка по разному (углы, цвета), но сохраняя основные геометрические соотношения между элементами GUI и взаимодействуя одинаково с файловой системой, БД, графикой!

    Возможно, стоит поискать более высокоуровневые надстройки над Swing. Или самому сделать свою библиотеку, делающую нужные Вам вещи в 1-2 строки кода.

    Есть и разнообразные компоненты, работающие со звуком, видео, 3D. Видел Doom-3 на Java через OpenGL.
    Ответ написан
    Комментировать
  • Народ как заставить рандом работать с вероятностю в java???

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    // JAVA code
    
        public static void main( String[] args ) throws Exception
        {
            for(int num: new int[]{10,100,1000, 10000,100000,1000000})
                probByNum( num );
        }
    
        private static void probByNum( int num )
        {
           //final char[] chars = { 'а', 'б', 'в' };
            final double[] probs  = { 0.12d, 0.5d, 1.0d }; // cumulative probability for each value
    
            int[] res = new int[ 3 ];
    
            Random rnd = new Random( ( new Date() ).getTime() ); // each time different seed
            for ( int i = 1; i <= num; i++ )
            {
                double prob = rnd.nextDouble();
                for ( int j = 0; j < 3; j++ )
                {
                    if ( prob < probs[ j ] )
                    {
                        res[ j ]++; // count detected probability
                        break;
                    }
                }
            }
    
            System.out.println(
                String.format( Locale.ENGLISH,"Probability with %10d trials to hit 0.120, 0.380, 0.500 is: %4.3f, %4.3f, %4.3f",
                    num,
                    ( ( ( double ) res[ 0 ] ) / ( double ) num ),
                    ( ( ( double ) res[ 1 ] ) / ( double ) num ),
                    ( ( ( double ) res[ 2 ] ) / ( double ) num ) ) );
        }
    // Results:
    Probability with         10 trials to hit 0.120, 0.380, 0.500 is: 0.100, 0.200, 0.700
    Probability with        100 trials to hit 0.120, 0.380, 0.500 is: 0.080, 0.410, 0.510
    Probability with       1000 trials to hit 0.120, 0.380, 0.500 is: 0.122, 0.375, 0.503
    Probability with      10000 trials to hit 0.120, 0.380, 0.500 is: 0.124, 0.377, 0.499
    Probability with     100000 trials to hit 0.120, 0.380, 0.500 is: 0.122, 0.377, 0.501
    Probability with    1000000 trials to hit 0.120, 0.380, 0.500 is: 0.119, 0.380, 0.501
    Ответ написан
    Комментировать
  • Долго собирается проект tomcat + maven?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    HotSwap - наше всё (см. предыдущий ответ).

    У меня glassfish (на localhost) + maven + слабый компьютер. Среда разработки JIdea. Полный цикл, из исходников до показа страницы в браузере, в автоматическом режиме запуска проекта в JIdea, выполняется за 6-8 минут.
    При отладке без изменения структуры классов (только код внутри методов) компилируются и дозагружаются (hotswap)прямо в glassfish отдельные классы, это занимает несколько секунд. В принципе, для отладки достаточно.

    C Tomcat hotswap работает точно также. Проверено с Eclipse.

    Собранный через maven EAR для загрузки в glassfish, в котором почти нет внешних библиотек, кроме небольших от Apach, имеет около 40 гигабайт. Сам ре-деплой занимает около 40 секунд. Для Tomcat, полагаю , ре-деплой будет ещё быстрее.
    Ответ написан
    Комментировать
  • Как сохранить bitmap в файл?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Не знаю как в Андроиде, а в обычной файловой системе я бы сначала проверил, существует ли указанная директория с полным путём (без имени файла). И если не существует, то создал бы её, если есть права. Для нашего случая это будет так:
    if ( !file.getParentFile().exists())
    {
         java.nio.file.Files.createDirectory( file.getParentFile().toPath() );
    }

    для простоты обработка ошибок опущена. Вопрос, почему директория не существует, требует отдельного изучения.
    Ответ написан
    Комментировать
  • Какая библиотека самая эффективная на данный момент в задачах парсинга XML?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Для обработки (парсинга) XML есть два идеологически различающихся подхода:
    а) DOM, когда считывают весь XML в память, строя в ней полную иерархию структуры и
    б) SAX - когда проходят по файлу вдоль него, посещая все элементы один раз, причём последовательно.

    DOM хорош только для небольших файлов с внутренними зависимостями элементов, когда может потребоваться обратиться к данным произвольных элементов в любой момент времени.

    SAX работает максимально быстро (на 1-2 порядка быстрее, чем DOM) но может потребовать реализации сложной логики хранения нужных данных, если логика задачи также потребует возврата к данным предыдущих элементов.

    И DOM и SAX имеют устойчивые и надёжные реализации для всех языков и операционных систем мира. Выбор между ними зависит только от задачи и среды разработки.

    Есть и смешанные подходы, в частности JAXB - когда с помощью SAX считывают и помещают данные XML не в DOM объект, но в примитивные объекты классов языка, на которых уже и реализуется конкретная бизнес-логика. Проблема JAXB в том, что он может обрабатывать ТОЛЬКО уже известные ему структуры XML, т.е. практически это компиляция XSD в Java/C# и т.д. код. Поменялась XSD - меняй и Java/C# и т.д. код и адаптируй логику программы под новые данные. Зато - максимум достижимой эффективности в процессе работы.

    Я лично всегда выбираю SAX, т.к. однажды, лет 10 назад, наблюдал большие затруднения по работе с многосотмегбайтными XML при использовании DOM. При том, что внутри были просто сотни тысяч отдельных мелких логически независимых единиц информации (телефонные счета для рассылки клиентам). А на SAX решили эту же задачу тупо и в лоб, по API документации, без каких-либо хитростей и проблем.

    В чём проблема больших объектов DOM? В том, что им требуется много-много маленьких кусочков памяти. А это есть самый плохой случай доступа к данным, как для оперативной памяти, так и для дисковой. Каждый наблюдал это явление, когда запись файла может занимать в десятки раз больше времени, чем его считывание. Собственно, вся обработка данных чисто исторически затачивается на считывание многих данных (кэширование!!!) и запись немногих (write through). Один раз обновил - считывай сотни раз. Именно под такую логику и разрабатываются и оптимизируются процессоры, память, диски, софт!

    Насчёт многопоточности - это вопрос не обработки одиночного XML, а а способов слияния результатов обработки отдельных XML в общую БД. Так и так каждый отдельный XML объект может быть обработан ТОЛЬКО в одном потоке. Так уж он устроен. Если представить себе какой-то гигантский XML, структура данных которого позволяет параллельную обработку, то всё равно хотя бы раз его придётся полностью пройти в одном потоке, чтобы разделить на автономные единицы параллельной обработки.

    Кстати, Oracle умеет достаточно эффективно обрабатывать поля своей БД, содержащие XML. И делает это именно через SAX )))
    Ответ написан
    1 комментарий
  • Как редактировать GUI IntelliJ IDEA?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Пробовал писать ГИП в JIdea. Не понравилось. Теперь пишу только руками. Через Swing. Это обеспечивает полный контроль над графикой. Но комментариев надо писать тоже много. Чтобы не потерять нить логики построения ГИП.
    Ответ написан
    Комментировать
  • Для каких задач Java лучше подходит, чем С++?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Для задач, разрабатываемых на одной платформе, а работающих на других. В частности, писал модули (без графики, естественно) для сервера ФМС РФ на винде (JIdea), а работали они, без малейших нареканий, на IBM'овском сервере по Юниксом. Java была 4-й версии)))

    Вообще для кросс-платформенных приложений Java - пока лучший язык, вернее, среда исполнения. Да, С или С++, если не использовать разные ненужные хитрости и прибамбасы, можно без особых усилий компилировать на той или иной платформе. Но чтобы программа шла просто переносом бинарных файлов - это к Java.
    Ответ написан
    Комментировать
  • Как придумывать осмысленные имена для классов?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Назови по русски (или на том языке, на котором мыслите), а потом переведите на английский. Так, чтобы было понятно тебе, в первую очередь. Иногда Гугль или Яндекс дают неплохие переводы, а иногда - отвратные. Для скорости можно использовать их, но обязательно и тщательно проверять смысл ими содеянного.

    И старайтесь называть покороче, используя общепринятые сокращениями, на английском, конечно. Button == Btn, Rectangle == Rect, Point = Pnt, Control == Ctrl|Cntrl etc. RectangularButton == RectBtn, EscapeButton == EscBtn etc etc etc.
    Ответ написан
    Комментировать
  • Что происходит с кодировкой при конкатенации строк Java?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Возможно, ваш исходник на диске в кодировке Windows-1251. Сохраните его как UTF-8 (без BOM, скорее всего)). Если так и было, то, по кр. мере, теперь вся выводная строка будет в единой кодировке. И должна выводиться или искажаться равномерно)))
    Ответ написан
    Комментировать
  • Какие нужны знания java для разработки под андроид?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Достаточно SE. И учить Android SDK. Он достаточно специфичен и существенно отличается от всего, что было на нормальных ПК.
    Ответ написан
    Комментировать
  • Каков ответ логической задачи?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    "Стоит" лист бумаги на столе? Пусть покажут, как они поставят лист бумаги на любое ребро, остальное чепуха.

    P.S. Предполагаю, что собеседование было в ГосЦирке.
    Ответ написан
    Комментировать
  • Какой использовать алгоритм сортировки, если требуется сложность не более O(n) и максимальная производительность?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Сортировка слиянием отсортирует любой объём данных, помещающихся на жёстком или ином диске.
    Ответ написан
    Комментировать
  • Что означает фраза " учите не язык, учите технологию "?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Возможно, имелось в виду и это:
    "Знание некоторых принципов легко возмещает незнание некоторых фактов". Клод Гельвеций.
    Ответ написан
    Комментировать
  • Как получить список файлов в папке?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Вот текст статической подпрограммы из собственного класса Files (часто встречающиеся операции с файлами, сбор имён не требовался ), стирающей всё содержимое заданной директории. В т.ч. и рекурсивно (по параметру). Для чего требуется стереть все файлы и во всех вложенных директориях.Переработать в нужном направлении нетрудно, добавив параметр для сбора имён обнаруженных файлов и его заполнение в нужном формате:
    /**
    	 * Tries to remove all files (and sub-directories optionally) in the designated
    	 * directory
    	 *
    	 * @param dir_path  directory path to clear from other files and optionally
    	 *                  directories
    	 * @param recursive deletes sub-dirs also if set to {@code true}
    	 * @return {@code true} if operation completed successfully that is no errors
    	 *         occurs during operation, else {@code false}
    	 */
    	public static boolean clearDirectory( String dir_path, boolean recursive )
    	{
    		File dir = new File( dir_path );
    		if ( !dir.isDirectory() )
    		{
    			return false;
    		}
    		boolean res = true;
    		String[] files = dir.list();
    		String fdir = Files.resetDir( dir_path );
    		String fpath;
    		StringBuffer sb = new StringBuffer();
    		for ( int i = 0; i < files.length; i++ )
    		{
    			sb.delete( 0, Integer.MAX_VALUE ).append( fdir ).append( files[ i ] );
    			File file = new File( fpath = sb.toString() );
    			if ( file.isDirectory() && recursive )
    			{
    				res = clearDirectory( fpath, recursive );
    			}
    			else
    			{
    				try
    				{
    					res = file.delete();  // TODO: здесь забирать конкретное имя фала в общий выходной массив
    				}
    				catch ( SecurityException se )
    				{
    				}
    			}
    		}
    		return res;
    	}


    Вызываемый дополнительно код ниже:

    /**
    	 * The system-dependent default name-separator character. This field is
    	 * initialised to contain the first character of the value of the system
    	 * property file.separator. On UNIX systems the value of this field is '/'; on
    	 * Microsoft Windows systems it is '\\'.
    	 */
    	public static final char FileSeparator = File.separatorChar;
    
    	/**
    	 * The system-dependent default name-separator character. This field is
    	 * initialised to contain the first character of the value of the system
    	 * property file.separator. On UNIX systems the value of this field is '/'; on
    	 * Microsoft Windows systems it is '\\'.
    	 */
    	public static final char FS = File.separatorChar;
    
    	/**
    	 * appends system dependent file separator char
    	 *
    	 * @param FilePath - string to check for file separator existence
    	 * @return new string with appended file separator or the same string if it
    	 *         already was present
    	 */
    	public static String appendFileSeparator( String FilePath )
    	{
    		return appendFileSeparator( FilePath, FileSeparator );
    	}
    
    	/**
    	 * appends system dependent file separator char
    	 *
    	 * @param FilePath - string to check for file separator existence
    	 * @param sep      character to be a last separator in the input string
    	 * @return new string with appended file separator or the same string if it
    	 *         already was present
    	 */
    	public static String appendFileSeparator( String FilePath, char sep )
    	{
    		if ( Text.isEmpty( FilePath ) )
    		{
    			return "" + sep;
    		}
    		char ch = FilePath.charAt( FilePath.length() - 1 );// get last symbol
    		if ( ( ch != '/' ) && ( ch != '\\' ) )// check it to be a separator one
    		{
    			return FilePath + sep;
    		}
    		else
    		{
    			return FilePath.substring( 0, FilePath.length() - 1 ) + sep;
    		}
    	}
    
    
    	/**
    	 * the same as {@link #appendFileSeparator} but with shorter name :o)
    	 *
    	 * @param path path to append file separator
    	 * @return path with trailing current file names separator
    	 */
    	public static String resetDir( String path )
    	{
    		if ( path == null )
    		{
    			return null;
    		}
    		return appendFileSeparator( path );
    	}
    Ответ написан
    Комментировать
  • Какие крупные компании России работают с C#?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Крупных компаний по разработке софта в РФ нет. И вообще крупные компании в РФ - это только по экспорту невозобновляемых природных ресурсов в интересах членов кремлёвского кооператива.

    Тот же "Техносерв" - сотня разработчиков самых разнообразных воззрений и эклектических решений. Берутся руководители департаментов, РП и ПМ за всё, что движется, а отвечают за результаты разработчики.
    И на чём делать - им всё равно. Работая там, использовал и C# и Java EE.
    Ответ написан
  • Можно ли писать на Java под Windows?

    @odissey_nemo
    Программист, ГИС-системы, растры, космоснимки
    Писал существенные консольные приложения на Java с разработкой на Windows для могучего IBM сервера ФМС. Всё всегда работало с первого раза. Был приятно удивлён. Java 1.4, нужно отметить. Без enum'ов и прочего блуда. Чистый код, без примесей фреймворков.
    Ответ написан
    Комментировать