| FAQ Java, часть 1-я - Как читать String/int/boolean... |
|
|
Страница 1 из 2 Sunday, 30 April 2006 | Зэев Фрайман для раздела Ученье – свет Хочу предложить вам несколько ЧаВО (Часто задаваемые вопросы – Frequency Asked Questions) из многочисленного семейства справочных материалов, существующих на просторах Интернета. Те, что будут опубликованы здесь, не относятся ни к самым важным, ни к самым актуальным – просто лично мне показалось, что они достаточно практичны, полезны и не останутся без применения коллегами. Мой решпект создателям сайта FAQS.Org.RuКак читать String/int/boolean/т.п. с клавиатуры?
Самое легкое решение - раздобыть исходники класса EasyIn, лежащие по адресу http://www.afu.com/ (там же, где англоязычная версия этого FAQ). Скомпилируйте их с вашим кодом и используйте, например, так:
EasyIn easy = new EasyIn();
int i = easy.readInt(); // читаем int из System.in
boolean b = easy.readBoolean(); // читаем boolean из System.in
double d = easy.readDouble(); // читаем double из System.in
... и так далее.
EasyIn бесплатен, с его исходниками вы имеете право делать все что вам нравится. В том числе улучшать их.
Если вам необходим только собственноручно написанный код (зачем, интересно), то в JDK 1.0.2
java.io.DataInputStream in = new java.io.DataInputStream(System.in);
String s = in.readLine();
Еще один способ в JDK 1.1:
java.io.BufferedReader in =
new java.io.BufferedReader( new InputStreamReader(System.in));
String s = in.readLine();
Если необходимо разобрать строку, из нее можно легко выделить лексемы любого типа, как уже было показано выше в этом FAQ. Недостаток этого способа в том, что искусственно усложняется простейшее решение для ввода/вывода с клавиатуры. В ближайшем будущем Javasoft вряд ли предложит более удобный способ.
Почему возникают проблемы с System.out.println()?
Проверьте написание. Последние две буквы - это "l" и "n", а не одна "n".
Имя метода происходит от словосочетания "print line" ("печать строки"), так как он (метод) выводит на печать объект класса String и переходит на следующую строку (в отличие от System.out.print() ). К сожалению, соглашение о названиях методов в Java соблюдается слабовато. Так, имя метода, предназначенного для чтения строки с клавиатуры, вовсе не readln(), могло бы показаться, а readLine().
Как мне получить случайные числа?
Если вам нужно быстро найти небольшое случайное число от 0.0 и до 1.0
double myrandom = Math.random(); // [0,1)
Система обозначения "[0,1)" это обычное математическое варажение для "от нуля до .9999999 и т.п." Описания от Sun говорят, что это возвращает значение от 0 до 1, но исследование исходных кодов показывает, что они ошибаются. Однако, следуемые за присущими арифметической плавающей точке неточностями, случайный выбор N до 0.999999 может привести к ошибке.
В JDK 1.2 входит другая версия nextInt, которая позволит более точно и безошибочно возвращать случайные числа, заданного интервала.
Существует небольшая хитрость если вы используете JDK 1.1, и вам надо получить int в определенном интервале. Допустим, в интервале от 1 до 6, чтобы сэмулировать бросок костей или от 1 до 52 чтобы представить игральные карты. Класс Random имеет метод nextInt, который возратит любое число.
import java.util.Random;
Random r = new Random();
int i = r.nextInt();
Однако, есть почти 50% на то, что это число окажется не из правильного интервала. Так, вы просто получите значение abs() и затем разделите его на верхнюю границу интервала.
int dice_throw = 1 + Math.abs(i) % 6;
Исключением является то, что метод abs() грубо ошибается в присутствии Integer.MIN_VALUE (это тоже возращает отрицательный результат!). Поэтому, лучше выполнить логическое умножение(and) для достижения верных значений – при получении числа между определенными высшим и низшим значениями интервала (включительно):
java.util.Random r = new java.util.Random();
int j = (r.nextInt() & Integer.MAX_VALUE) % (high-low+1) + low;
Это решение сработает корректно "(почти) в 50% случаев" потому что существует на одно значение больше в отрицательных числах, чем в положительных в арифметических комлектах, какие использует Java. Для большинства целей, это предубеждение будет незначительным, а мы "и" nextInt() сводим их к нулю. Конечно, это маловероятно, что вам встретится эта ошибка, но вы же не хотите иметь критическую ситуацию, только из-за того, что упустили этот случай при тестировании своего приложения.
Неприятная проблема это то, что с таким алгоритмом, младшие биты попадаются реже, чем старшие, при случайном выборе. Причина в том, что при операции деления (mod 2^n) младшие биты "пропадают" чаще, чем старшие. Можно предположить, что используя java.security.SecureRandom, получится более большая разбросанность случайных чисел, так как это использует "Криптографическую разбросанность" (Cryptograpic hash), но это также потребует более объемных вычислений от компьютера.
|
||||