WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Как очистить массив?

Как очистить массив?


Дата публикации: 17-03-2013

Методов для очистки массива в 0.0, 0, null, false, '\u0000' и т.п. не существует. Когда вы создаете массив, его элементы инициализируются значением по умолчанию (default value), но повторить автоматическую инициализацию невозможно.

Если вам необходимо много раз устанавливать массив в одно и то же множество значений, создайте массив-шаблон. Инициализируйте его необходимым набором значений и используйте System.arraycopy() для копирования в рабочий массив каждый раз, когда требуется переустановка значений рабочего массива.


Какой наиболее быстрый путь установки значений всех элементов массива? Я не хочу использовать массив-шаблон. Я хотел бы делать это без дублирования (возможно, большого) массива.

Использование цикла, который поочередно присваивает значения элементам массива, в 20 - 40 раз медленнее, чем старый добрый memset() в Си.

Hа многих Java Virtual Machine (JVM) можно сделать так: присвоить значение первому байту массива, использовать System.arraycopy() для последовательного заполнения следующего байта, затем следующих двух байт, следующих четырех байт, следующих восьми байт и т.д. пока не останется меньшая часть массива, которую System.arraycopy() заполнит в один прием.


public static void bytefill(byte[] array, byte value) {
int len = array.length;
if (len > 0)
array[0] = value;
for (int i = 1; i < len; i += i)
System.arraycopy( array, 0, array, i,
((len - i) < i) ? (len - i) : i);
}
Hа Sun'овской JVM этот код выполняется быстрее, чем обычный цикл, и даже быстрее, чем на JIT-компиляторах, потому что контроль выхода за границы массива здесь проводится всего лишь до log2(array.length) раз. Причем этот способ работает, даже если размер массива не является степенью двух.


Как прочитать файл, содержащий числа в символьной форме?

Есть несколько способов. Hиже приведен один из них. Допустим, файл называется "C:\work\mydata.txt" и содержит строки вида:


135 7512 3659814 328 1 54829
68522 19982810 38
т.e. несколько строк ASCII, в которых числа разделены пробелами.
Вот фрагмент кода:


// Открываем файл
RandomAccessFile f = new RandomAccessFile("c:\\work\\datafile.txt", "r");

// Читаем из него одну строку
String s= f.readLine();

// Разбираем строку
StringTokenizer st = new StringTokenizer(s);

// Извлекаем из строки целое число
i = Integer.parseInt(st.nextToken());
Мы использовали RandomAccessFile, потому что здесь напрямую поддерживается метод readLine(). Альтернативой могло бы быть создание FileReader и на его базе BufferedReader. Теперь сведем все это вместе, и, добавив обработку исключения в случае если файл не существует, получим следующее:


import java.io.*;
import java.util.*;
public class c {
public static void main(String args[]) {
try {
RandomAccessFile f = new RandomAccessFile ("datafile.txt", "r");
String s;
while ( (s=f.readLine()) != null ) {
System.out.println("read: "+s);

StringTokenizer st = new StringTokenizer(s);
int i=0;
while (st.hasMoreTokens()) {
i = Integer.parseInt(st.nextToken());
// i сейчас содержит следующее целое число из строки
// аналогично используется Double.parseDouble(), и т.п..

System.out.print(" "+ i);
}
System.out.println();
}

} catch (Exception e) {System.out.println("Excpn: "+e); }
// файловый ввод-вывод, из книги "Just Java" Петера ван дер Линдена
}
}
Смотрите также следующий вопрос: как читать данные с клавиатуры.


Как читать 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. Hедостаток этого способа в том, что искусственно усложняется простейшее решение для ввода/вывода с клавиатуры. В ближайшем будущем Javasoft вряд ли предложит более удобный способ.


Почему возникают проблемы с System.out.println()?

Проверьте написание. Последние две буквы - это "l" и "n", а не одна "n". Имя метода происходит от словосочетания "print line" ("печать строки"), так как он (метод) выводит на печать объект класса String и переходит на следующую строку (в отличие от System.out.print() ). К сожалению, соглашение о названиях методов в Java соблюдается слабовато. Так, имя метода, предназначенного для чтения строки с клавиатуры, вовсе не readln(), могло бы показаться, а readLine().


Как писать в COM порт, используя Java?

В JDK 1.2 есть платформенно-независимый интерфейс последовательного порта. Документацию к нему можно получить, зарегистрировавшись на Java Developer Connection (это бесплатно), http://java.sun.com) а там идите на http://java.sun.com/jdc/earlyAccess/communications.html.

Для систем старше JDK 1.2 есть как минимум две библиотеки для работы с COM- портами. Смотрите:


http://www.sc-systems.com есть версии для Windows 95, WindowsNT, OS/2, Macintosh PPC, Solaris Sparc, Linux x86, FreeBSD x86, HP/UX PA-RISC, и возможно еще для некоторых.
http://www.cd.com/portio

К тому же в Unix есть утилита для работы с последовательными портами. Она вместе с исходниками лежит на http://jarvi.ezlink.com/rxtx/ Она бесплатна на условиях GPL, и работает на Linux, Irix, Solaris, Windows 95, и NT.
Есть еще одно решение проблемы, переносимое, работающее на Java 1.1 и даже 1.0, но мало подходящее для домашних пользователей. Покупайте COM-порты в форме "терминального сервера" ("terminal server"). Использование COM-порта становится таким же простым, как подсоединение к порту с помощью Socket. Параметры порта могут быть программно изменены с помощью SNMP для большинства терминальных серверов (если Вы работаете с современным модемом, Вам это вряд ли понадобится). Любой компьютер в сети (даже если он под Win95) может работать как терминальный сервер, имея простое серверное ПО, но покупка специализированного аппаратного обеспечения значительно упростит задачу.

К тому же, ваши Windows95 приложения могут совместно использовать СОМ-порты (с любыми модемами на портах) с помощью ПО "Dial-out IP" под Windows95. Смотрите здесь: http://www.tactical-sw.com/.

Если порт подмонтирован к файловой системе, вы можете использовать его как файл, открывая для чтения и/или записи. Таким же путем можно выводить на печать текст, копируя его в устройство "prn" или "lpt1" на РС-совместимых системах (обязательно завершив текст символом конца файла), или в "/dev/что-нибудь" в Unix. Hиже приведен пример:

// класс, открывающий принтер как файл
// и записывающий в него строку "Hello, world"

import java.io.*;
public class lpt {
public static void main (String[] argv) {
try {
FileOutputStream os = new FileOutputStream("LPT1");
//создаем "дружественный" PrintStream
PrintStream ps = new PrintStream(os);

//выводим текст
ps.println("Hello world!");

//признак конца файла -- это важно
//Без него текст просто попадет в буфер принтера
// пока что-нибудь еще не будет выводиться на печать.
ps.print("\f");
//сбрасываем буфер и закрываем поток
ps.close();
} catch (Exception e) {
System.out.println("Exception occurred: " + e);
}
}
}
Если необходимо изменить характеристики порта (напр., скорость или четность), а не просто писать или считывать данные, то, к сожалению, Java на данный момент не имеет переносимых решений для этой проблемы. Вам придется воспользоваться одной из библиотек, указанных выше, или же обратиться к системно-зависимому коду или утилите.


Почему зависает на несколько минут если мой Windows PC не подключен к Интернету?

Java имеет встроеную сетевую поддержку. Когда Java программа стартует, автоматически загружается Winsock DLL. Первое, что она пытается выполнить, это определить (resolve) полностью квалифицированное имя домена для машины "localhost". Если в Вашей системе не описано это имя, она будет пытаться запросить его у сервера имен Интернета, который обычно находится у Вашего провайдера Интернет (ISP). Поэтому система либо запросит Вас подключиться к провайдеру Интернет, либо будет ждать пока не истечет время попытки.

Есть мнение, что можно избежать этой проблемы в Win95 дав определив в системе другой способ определять DNS имена. У меня это не работает. Отредактируйте файл hosts Вашей системы так, чтобы localhost и полное имя домена были оба определены. В Windows 95 файл hosts находитися в %windir%\HOSTS (например, C:\WINDOWS\HOSTS). В Windows NT файл hosts находится в: %windir%\System32\DRIVERS\ETC\HOSTS например, C:\WINNT\System32\DRIVERS\ETC\HOSTS).
В Win95 есть ловушка, которая заключается в том, что если последняя запись не заканчивается символами carriage-return/line-feed, то файл hosts читается не до конца. Так, если система называется goober.best.com приведите файл hosts от вида

127.0.0.1 localhost
к виду

127.0.0.1 goober.best.com localhost
Файл может выглядеть следующим образом:

# Hosts file
127.0.0.1 localhost
129.146.77.177 goober
Другой способ состоит в том, чтобы установить PPP соединение с провайдером Интернет всякий раз, когда Вы будете запускать сетевые программы. Опыт некоторых людей говорит о том, что работа с сетью не совсем удовлетворительна под Windows95 с использованием Winsock 1.1, и время от времени необъяснимо глючит. Вы можете попытаться загрузить Winsock 2.0. Чтобы получить Winsock 2.0, Вы должны вытащить его из набора Microsoft Windows Sockets 2.0 Software Development Kit. Этот софт может быть получен со следующих адресов:
http://www.microsoft.com/win32dev/netwrk/winsock2/ws295sdk.html
или:
ftp://ftp.microsoft.com/bussys/WinSock/winsock2/
Патчи, которые нужны для улучщения работы в сети уже есть в Win98.


Если я вызываю InetAddress.getByName() метод с аргументом IP - адресом в виде строки, типа "192.168.0.1", получаю на некоторых (но не на всех) платформах UnknownHostException. Код :
Socket sock = new Socket("155.152.5.1", 23);
бросает исключение. Почему?


Это платформенное различие, которое возникает из различной семантики лежащих в основе сетевых библиотек, и пофиксено в JDK 1.1. В Solaris и Windows NT, строка IP адреса работает только для тех адресов, которые имеют ассоциированное имя хоста. Hа Linux и Windows 95 строки IP адреса срабатывают всегда.
Когда создается экземпляр InetAddress с IP адресом в качестве параметра, выполняется обратное DNS преобразование. Если IP адрес не ассоциирован с правильным именем хоста, то создание экзепляра класса InetAddress потерпит неудачу. Это является частью борьбы с DNS-spoofing (подмена DNS), и в JDK 1.1 работает потому что обратное преобразование не происходит пока имя хоста не запрошено. Так в JDK 1.1,

InetAddress in = InetAddress.getByName("155.152.5.1");
Другие сайты:

У Microsoft есть несколько network-related патчей на их сайте http://www.microsoft.com/


Я хочу передать class файл всем тем желающим, кто использует мой апплет. Есть идеи насчет того как?

Ты должен использовать маленькую хитрость: разместить твой .class файл(ы) в .zip архиве и использовать метод showDocument() от URL. Hекто, обращаясь к этому URL получит окно диалога, в котором он будет запрошен о сохранении файла на его локальном диске.
Другие сайты:

Вы можете увидеть это живьем и попробовать на себе на: http://www.best.com/~rmlynch/saveit.html


Как заставить URLConnection работать через proxy firewall? Т.е. Как заставить Java приложение выполнять доступ к Web через прокси?

Это обычно нужно для любого сетевого доступа к другому домену. Вы должны задать runtime системе что Вы пытаетесь сделать используя аргументы командной строки когда запускаете программу.

java -DproxySet=true -DproxyHost=SOMEHOST -DproxyPort=SOMENUM code.java

Отметтье, что proxyPort является опциональным и по умолчанию равен 80. Без этого Вы увидите исключение типа java.net.UnknownHostException или java.net.NoRouteToHostException.
Установки прокси работают и для java.net.URLConnection, и для java.net.Sockets.

Netscape'вская и IE'ая JVMs (виртуальные Java машины) (по крайней мере в версиях 4.х+) принимают установки прокси для апплетов из конфигурации прокси браузера. Вы можете также работать с прокси в проиложениях (не апплетах) добавив следующие строки

// установите чтобы использовать прокси
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "myproxy.server.name");
System.getProperties().put("proxyPort", "80");
Hо как мне узнать имя прокси сервера?
Этот код просто говорит Вам как можно получить URL соединение через прокси. Hо так как это Ваш прокси сервер, то предполагается, что Вы знаете его имя. И не существует кода, который можно написать, который позволит произвольным URL соединениям быть инициироваными извне firewall'а. Подумайте об этом! Если бы это было так, то firewall не выполнял бы свою работу.

Также отметтье, что существуют соответствующие socksProxyPort и socksProxyHost когда socks используются вместо прокси. Socks порт по умолчанию - 1080.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Edward V Berard:

"Ходить по воде и разрабатывать программы, следуя спецификации, очень просто… если они заморожены."

Опрос

Как Вам новый дизайн сайта?

Отлично
Неплохо
Нормальный
Ужасно