methodichkaA5
.pdfДве пары квадратных скобок показывают, что массив является двумерным.
Во время инициализации необходимо указать размерность массива, т.е.
задать количество столбцов и строк – f = new float[8][8]; или float f = new float[8][8];
В примере задается двумерный массив 8х8, который структурой напоминает шахматную доску, в каждую клетку которой можно записать число типа float. Принцип работы с двумерным массивом напоминает принцип работы с одномерным, только при указании ячейки надо задавать две координаты вместо одной. Графически двумерный массив MxN можно представить следующим образом.
0 1 2 3 4 … N
0
15
27
M
Впримере в ячейке a[1][1] записано число «5». В ячейке a[2][4] записано число
«7».
Для того чтобы записать или считать значение из ячейки двумерного массива необходимо указать имя массива, номер столбца в квадратных скобках, затем номер строки в квадратных скобках. Принцип работы с каждой отдельной ячейкой массива подобен работе с обычной переменной.
a[0][0]=1; a[0][1]=2; a[0][2]=3;
a[1][0]=4; a[1][1]=5; a[1][2]=6;
a[2][0]=7; a[2][1]=8; a[2][2]=9;
Пример.
Создать двумерный массив 5х10 и заполнить его случайными числами. Затем вывести массив на консоль в виде матрицы 5х10.
package arrays; import java.lang.*; public class ArrTst1 {
public static void main(String[] argv) { //объявление массива
int[][] f = new int[5][10];
//заполнение массива случайными двузначными числами for(int i=0;i<5;i++){
for(int j=0;j<10;j++){
f[i][j] = (int)Math.round(Math.random()*(double)89)+10;
}
31
}
//вывод массива на экран
for(int k=0;k<5;k++){
for(int m=0;m<10;m++){
System.out.print(f[k][m]+" ");
}
System.out.println();
}
}
}
Результат.
83 27 59 89 47 98 97 93 65 85
13 72 17 94 53 96 57 32 72 80
86 16 49 90 88 43 27 64 68 12
41 85 75 21 58 40 59 51 69 41
86 27 58 42 90 81 14 20 70 39
Пример.
Создать двумерный массив 8х8. Заполнить его числами 0 и 1 в шахматном порядке.
package arrays; import java.lang.*; public class ArrTst2{
public static void main(String[] argv) { int[][] f = new int[8][8];
for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ if((i+j)%2==0){
f[i][j]=1;
}else{
f[i][j]=0;
}
}
}
for(int k=0;k<8;k++){ //вывод массива на экран for(int m=0;m<8;m++){ System.out.print(f[k][m]+" ");
}
System.out.println();
}
}
}
Результат.
32
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
Пример.
Создать массив 8х8, заполнить его случайными двузначными числами.
Вывести на консоль элементы двух главных диагоналей.
package arrays; import java.lang.*; public class ArrTst3{
public static void main(String[] argv) { int[][] f = new int[8][8];
for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) {
f[i][j] = (int) Math.round(Math.random() * (double) 89) + 10;
}
}
for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) {
System.out.print(f[i][j] + " ");
}
System.out.println();
}
System.out.println(); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) {
if ( (i == j) || (j == 8 -1- i)) { System.out.print(f[i][j]+" ");
}
}
}
}
}
Результат.
30 72 30 79 28 47 39 27
33
68 69 49 34 63 42 44 95
46 69 61 43 74 41 32 34
56 47 91 53 40 59 41 90
44 84 69 89 49 96 24 28
39 34 78 51 40 62 79 26
27 79 93 26 76 87 76 15
71 17 15 92 98 73 91 35
30 27 69 44 61 41 53 40 89 49 78 62 79 76 71 35
4.Строковые типы данных в java
4.1.Строки
Строки – это последовательности символов, например "Hello". В языке
Java нет встроенного типа для строк. Вместо этого стандартная библиотека языка Java содержит встроенный класс String. Каждая строка, заключенная в кавычки, представляет собой экземпляр класса String.
String e = ""; // Пустая строка.
String greeting = "Hello";
Язык Java, как и большинство языков программирования, дает возможность использовать знак + для объединения (конкатенации) двух строк.
String expletive = "Вставка";
String PG13 = "удаленная";
String message = expletive + PG13;
Код, приведенный выше, присваивает переменной message строку
"Вставкаудаленная". (Обратите внимание на отсутствие пробела между словами: знак + объединяет две строки точно в указанном порядке.).
При конкатенации строки со значением, которое строкой не является, это значение преобразовывается в строку. Например, код
int age = 13;
String rating = "PG" + age;
присваивает переменной rating строку "PG13".
Это свойство широко используется в операторах вывода. Например,
оператор
System.out.println("Ответ равен " + answer);
34
выводит на печать все, что требуется (причем вставляет пробел после слова
"равен").
4.2.Подстроки
Спомощью метода substring класса String можно выделить подстроку из заданной строки. Например, код
String greeting = "Hello";
String s = greeting.substring(0, 4);
образует строку, состоящую из символов "Hell". В языке Java символы в строке подсчитываются довольно своеобразно: первый символ строки занимает нулевую позицию.
Например, символ 'H' в строке “Hello” занимает нулевую позицию, а
символ 'о' четвертую. Таким образом, первый параметр метода substring
задает позицию символа в строке greeting, с которого будет начинаться новая подстрока. Второй параметр метода substring задает позицию символа, кото-
рый уже не попадет в подстроку. Допустим, необходимо скопировать символы из позиций 0, 1, 2 и 3 (от позиции 0 до позиции 3 включительно), т.е.
метод substring будет копировать символы из позиций от 0 до 4
исключительно.
Такой способ имеет определенное преимущество: легко вычислить длину подстроки. Строка s.substring(a, b) всегда состоит из b-а символов. Например,
подстрока "Неll" имеет длину 4-0 = 4.
4.3. Редактирование строки
Для определения длины строки нужно использовать метод length,
например:
String greeting = "Hello";
int n = greeting.length () ; // Длина строки равна 5.
Если тип char означает символ в формате Unicode, то класс String означает последовательность символов в кодировке Unicode. Из строки можно выделить отдельный символ. Вызов метода s.charAt(n) возвращает символ в
35
кодировке Unicode, находящийся в позиции n, где число n лежит в диапазоне
от 0 до s.length() - 1, например:
char last = greeting. charAt (4); // Четвертый символ - 'о'.
Однако класс String не дает методов, позволяющих изменить символ в заданной строке. Нет возможности просто изменить последнюю позицию в строке greeting, поместив в нее восклицательный знак, чтобы преобразовать строку greeting в строку "Hell!". Для того чтобы модифицировать строку в языке Java достаточно просто выделить подстроку, которую необходимо оставить без изменения, и конкатенировать ее с символами, которые надо поставить в нужные позиции:
greeting = greeting.substring(0, 4) + "!";
С помощью такого оператора можно присвоить переменной greeting
строку "Hell!".
Поскольку, программируя на языке Java, нет возможности изменять отдельные символы в строке, (как число 3 всегда равно 3, так и строка "Hello"
всегда содержит символы 'Н', 'е', 'l' , 'l' и 'о') то изменить эти значения напрямую невозможно. Однако, как только что было показано, можно изменить содержимое строковой переменной greeting и заставить ее ссылаться на другую строку так же, как числовой переменной, в которой хранится число
3, можно присвоить число 4.
Не происходит ли при этом большой потери эффективности? Кажется,
было бы намного проще изменять символы, чем создавать новую строку заново. Возможно, это и так. Действительно, неэффективно создавать новую строку, образованную с помощью конкатенации строк "Hell" и "!". Однако неизменяемые строки имеют одно большое преимущество: компилятор может делать строки совместно используемыми.
4.4. Проверка строк на равенство
Чтобы проверить, совпадают ли две строки, следует использовать метод equals; вызов метода s.equals(t) возвращает значение true, если строки s и t равны между собой, в противном случае он возвращает значение false. Отметим, что
36
строки s и t могут быть как переменными, так и константами. Например,
выражение
"Hello!".equals(command);
вполне допустимо. Чтобы проверить идентичность строк, игнорируя различие между прописными и строчными буквами, следует использовать метод
equalsIgnoreCase.
"Hello".equalsIgnoreCase("hello") ;
Для проверки строк на равенство нельзя применять оператор «!» Он проверяет лишь, хранятся ли обе строки в одной и той же области памяти.
Разумеется, если обе строки хранятся в одном и том же месте, они должны совпадать между собой. Однако вполне возможна ситуация, при которой идентичные строки хранятся в разных местах.
String greeting = "Hello"; // Инициализирует
//переменную
// greeting строкой.
if (greeting = "Hello") .. .
// Возможно, это условие истинно.
if (greeting.substring (0, 4) == "Hell") ...
// Возможно, это условие ложно.
Если виртуальная машина всегда позволяет совместно использовать одинаковые строки, то для проверки их равенства можно применять оператор
== (два знака «равно»). Однако совместно использовать можно лишь константы, а не строки, являющиеся результатами таких операций, как + или substring. Следовательно, либо нужно навсегда отказаться от проверок строк на равенство с помощью оператора == (два знака «равно»), либо будет получена программа, содержащая наихудшую из возможных ошибок – перемежающуюся ошибку, появление которой невозможно предсказать.
Класс String в языке Java содержит более 50 методов. Неожиданно большое количество из них оказались полезными, так что можно легко себе представить, что они используются довольно часто. В таблице 10 дается информация о некоторых методах класса String. В таблице представлены не все методы класса String. За более полной информацией необходимо обратиться к официальной документации.
37
Таблица 10 – методы класса String
Тип |
|
|
|
|
|
|
|
выдав. |
Метод |
|
Пояснение |
|
|
||
знач. |
|
|
|
|
|
|
|
char |
charAt(int index) |
Возвращает символ, расположенный в |
|||||
|
|
|
указанной позиции. |
|
|
||
int |
compareTo(String |
other) |
Возвращает отрицательное значение, если |
||||
|
|
|
строка предшествует строке other в |
||||
|
|
|
лексикографическом порядке, положи- |
||||
|
|
|
тельное значение — если строка other |
||||
|
|
|
предшествует |
данной |
строке |
в |
|
|
|
|
лексикографическом порядке, и 0 - если |
||||
|
|
|
строки идентичны. |
|
|
|
|
boolea |
endsWith(String |
suffix) |
Возвращает значение true, если строка |
||||
n |
|
|
заканчивается подстрокой suffix. |
|
|||
boolea |
equals(Object other) |
Возвращает значение true, если строка |
|||||
n |
|
|
равна строке other . |
|
|
||
boolea |
equalsIgnoreCase(String |
Возвращает значение true, если строка |
|||||
n |
other) |
|
равна строке other без учета различий |
||||
|
|
|
между прописными и строчными буквами. |
||||
int |
index(String str) |
|
Возвращает начало первой подстроки, |
||||
int |
indexOf(String str, int from) |
совпадающей со строкой str, начиная с |
|||||
|
|
|
позиции 0 или frorm. |
|
|
||
int |
lastlndexOf(String str) |
Возвращает начало последней подстроки, |
|||||
int |
lastlndexOf(String str, int |
равной строке str, начиная с позиции 0 или |
|||||
|
from) |
|
from. |
|
|
|
|
int |
length() |
|
Возвращает длину строки. |
|
|
||
String |
replace(char С1, char C2) |
Возвращает строку, полученную заменой |
|||||
|
|
|
всех символов С1 в строке символом C2. |
|
|||
boolea |
startWith(String prefix) |
Возвращает значение true, если строка |
|||||
n |
|
|
начинается подстрокой prefix. |
|
|
||
String |
substring(int bx) |
|
Возвращает строку, состоящую из всех |
||||
String |
substring (int bx, int ex) |
символов, начиная с позиции bx и |
|||||
|
|
|
заканчивая концом строки или позицией ex, |
||||
|
|
|
исключая его. |
|
|
|
|
String |
toLowerCase() |
|
Возвращает новую строку, состоящую из |
||||
|
|
|
всех символов исходной строки, при этом |
||||
|
|
|
все прописные буквы преобразовываются в |
||||
|
|
|
строчные. |
|
|
|
|
String |
toUpperCase() |
|
Возвращает строку, состоящую из всех |
||||
|
|
|
символов исходной строки, при этом все |
||||
|
|
|
строчные |
буквы |
преобразовываются |
в |
|
|
|
|
прописные. |
|
|
|
|
String |
trim() |
|
Возвращает новую строку, из которой |
||||
|
|
|
исключены |
все |
предшествующие |
и |
|
|
|
|
замыкающие пробелы. |
|
|
38
Пример.
Создать строку, занести в нее значение «Мама мыла раму». Вывести на консоль строчку некоторое количество раз, причем при каждом последующем выводе требуется обрезать в конце строки на один символ больше. Выполнять вывод до тех пор, пока не закончатся символы в строке.
package sss;
public class sssClass{
public static void main(String[] argv) { String st = "Мама мыла раму"; for(int i=0; i<st.length(); i++){
System.out.println(st.substring(0, st.length() – i ));
}
}
}
Результат.
Мама мыла раму Мама мыла рам Мама мыла ра Мама мыла р Мама мыла Мама мыла Мама мыл Мама мы Мама м Мама Мама Мам Ма
М
4.5. Считывание ввода
Уже было показано, как легко можно вывести информацию на "стандартное устройство вывода" (т.е. консольное окно), вызвав метод System.out.println. К сожалению, считать информацию со "стандартного устройства ввода" (т.е. клавиатуры) немного сложнее.
Однако создать диалоговое окно для ввода данных с клавиатуры достаточно легко. Вызов метода
JOptionPane.showInputDialog(promptString)
39
выводит на экран диалоговое окно, в котором пользователь может набрать свои данные (рис. 7). Этот метод возвращает строку, набранную пользователем в этом окне.
Рисунок 7 – Запрос на ввод данных
Например, здесь показано, как запросить имя пользователя при запуске
программы. String name = JOPtionPane.showinputDialog("What is your name?");
Чтобы считать число, нужно выполнить более сложную работу. Метод JOptionPane.showInputDialog возвращает строку, а не число. Для преобразования этой строки в число нужно использовать метод Integer.parselnt или
Double.parseDouble, например:
String input = JOptionPane. showInputDialog ("How old are you?") ;
int age = Integer.parselnt(input);
Если пользователь наберет на клавиатуре число 40, то строковой переменной input будет присвоена строковое значение "40". Метод Integer.parselnt преобразовывает строку в соответствующее число, т.е. 40.
Если параметр метода parselnt содержит символы, не являющиеся цифрами, метод возбуждает исключительную ситуацию. Если программа не "перехватывает" эту исключительную ситуацию, виртуальная машина прекращает ее выполнение и выводит на консоль сообщение об ошибке.
Пример.
Программа запрашивает имя пользователя и его возраст, а затем выводит на экран подобное сообщение: Здравствуй, Вася. В следующем году тебе, возможно, исполнится 25.
import javax.swing.*; public class InputTest{
public static void main(String[] a){ // Первый ввод.
String name = JOptionPane.showInputDialog("Ваше имя") ; // Второй ввод.
String input = JOptionPane.showInputDialog("Ваш возраст") ;
40