CodeGym /Java блог /Случаен /Нещо за масивите
John Squirrels
Ниво
San Francisco

Нещо за масивите

Публикувано в групата
здрасти По-рано във вашето обучение сме работor с единични обекти (и примитивни типове). Но Howво ще стане, ако трябва да работим с цяла група обекти, instead of само с един? Например, да кажем, че искаме да създадем списък с рождени дни на всички служители в нашата компания. Трябва да съдържа 30 низа, форматирани по следния начин: „Сара Хъфман, 25 януари“ Ще се възползваме от специална структура от данни, наречена масив . Ако сравним масив с реален обект, той е много подобен на банков трезор със сейфове: Нещо за масивите - 1масивът също се състои от "кутии". Можете да поставите нещо (елемент) във всяка кутия. За да получите достъп до елемент, трябва да знаете неговия номер на кутия (индекс). Ето How се създава масив:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Тук създаваме масив, който съдържа 10 елемента. Веднага можете да отбележите някои характеристики на масива:
  1. Той съхранява елементи от добре дефиниран тип данни . Ако създадем String масив, не можем да съхраняваме нищо друго в него. Типът данни се посочва при създаването на масива . Това е мястото, където той се различава от сейфа (в който клиентът може да съхранява това, което иска).

  2. Неговият размер трябва да бъде посочен при създаването на масива . Не можете да го посочите по-късно or да промените размера му след създаването на масива .
Фактът, че създаваме масив, се обозначава с квадратните скоби от двете страни на израза. Те могат да бъдат посочени преди or след името на референтната променлива. Така or иначе ще работи:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Ако искате да запишете нещо в масив, трябва да посочите индекса на полето, където ще бъде записана стойността. Клетките в масива са номерирани, започвайки от 0. Броенето, започващо от нула, е много често срещана практика в програмирането. Колкото по-бързо свикнете, толкова по-добре :) Нещо за масивите - 2 Това означава, че ако искате да поставите няHowва стойност в първото поле , правите следното:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Сега рожденият ден на Яна се съхранява в първата клетка на нашия масив от рождени дни на служители: Можете да добавите други стойности по подобен начин:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Имайте предвид, че добавихме рождения ден на Роузи към осмата кутия (не сте забравor защо кутия № 7 е осмата кутия, нали?) . Виждате, че не сме попълнor всички останали клетки. Не е нужно да записваме стойности в масив по ред. Няма такова изискване. Разбира се, записването на елементи в ред прави много по-лесно следенето на това колко кутии са свободни и колко са заети и предотвратява появата на "дупки" в масива. Ако искате да получите съдържанието на една от кутиите, тогава (точно Howто при сейф) трябва да знаете нейния номер. Така се прави:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Конзолен изход: Роузи Милс, 3 януари Създадохме Stringпроменлива и казахме на компилатора: „Намерете полето с индекс 7 в масива с рождени дни и присвоете съдържащата се там стойност на променливата StringrosieBirthday . И точно това направи. Когато работим с масиви, можем лесно да намерим дължината им с помощта на специално свойство: length .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Конзолен изход: 10 Забележка: lengthСвойството съхранява размера на масива, а не броя на кутиите, които са пълни. Нашият масив съхранява само 3 стойности, но ние посочихме неговия размер като 10, когато го създадохме. И това е точно стойността, която lengthполето връща. Защо това би било полезно? Е, да предположим, че искате да покажете списък с всички рождени дни (за да проверите дали никой не е забequals). Можете да направите това в един прост цикъл:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
В цикъла ние декларираме променливата i, която се инициализира на нула. При всяко преминаване получаваме елемента с индекс i от нашия масив и показваме неговата стойност. Цикълът ще направи 10 повторения и аз ще увелича от 0 до 9—и числата са индексите на елементите на нашия масив! В резултат на това ще покажем всички стойности от birthdays[0] до birthdays[9] . Всъщност има друг начин, по който можете да създадете масив. Например, можете да създадете масив от ints като този:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Тази техника се нарича "инициализация с бърз достъп". Това е доста удобно, защото едновременно създаваме масив и го запълваме със стойности. Не е необходимо изрично да указваме размера на масива: при инициализация с бърз достъп полето lengthсе задава автоматично.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Конзолен изход: 9 Сега малко за това How масивите се съхраняват в паметта. Да кажем, че имаме масив от три Catобекта:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Тук трябва да разберете няколко неща:
  1. В случай на примитиви, масивът съхранява набор от специфични стойности (напр. ints). В случай на обекти, масивът съхранява набор от препратки .
    Масивът catsсе състои от три елемента, всеки от които е препратка към Catобект. Всяка от препратките сочи към address на паметта, където се съхранява съответният обект.

  2. Елементите на масива са подредени в един блок в паметта. Това се прави с цел бърз и ефективен достъп до тях.
По този начин catsпрепраща към блока памет, където се съхраняват всички обекти (елементи на масив). Cats[0]препраща към конкретен address в този блок. Нещо за масивите - 3 Важно е да разберете, че масивът не просто съхранява обекти: той самият е обект. Това ни кара да се запитаме дали можем да създадем не само масив от низове or числа, но и масиви от масиви . И отговорът е да, можем! Масивът може да съхранява всяHowви обекти, включително други масиви. Такъв масив се нарича двумерен . Ако трябва да го представим визуално, той ще бъде много подобен на обикновена маса. Да предположим, че искаме да създадем масив от 3 масива , всеки от които може да съхранява 10 ints. Ще изглежда така:
Нещо за масивите - 4
Всеки ред представлява intмасив. Първият масив съдържа числа от 1 до 10, вторият масив — от -1 до -10, а третият — набор от произволни числа. Всеки от тези масиви се съхранява в кутиите на нашия двумерен масив. В codeа инициализацията на двумерен масив изглежда така:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Нашият двумерен масив cats съхранява 3 масива с 5 кутии във всеки масив. Ако искаме да поставим обект в третото поле на втория масив, ще направим следното:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]указва втория масив и [2]указва третото поле от този масив. Тъй като двумерният масив се състои от няколко масива, за да го обхождаме и да показваме всички негови стойности (or да попълваме всички негови елементи), имаме нужда от вложен цикъл:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
Във външния цикъл (променлива i), ние итерираме всички масиви в нашия двумерен масив. Във вътрешния цикъл (променлива j) преминаваме през всички елементи на всеки масив. В резултат на това cats[0][0] (първи масив, първи елемент) ще бъдат показани първи, последвани от cats[0][1] (първи масив, втори елемент). След като преминем през първия масив, ще покажем cats[1][0] , cats[1][1] , cats[1][2] и т.н. Между другото, двумерните масиви също поддържат съкратена инициализация:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Обикновено бихме декларирали двумерния масив numbersкато int[3][3], но тази стенограма ни позволява незабавно да посочим стойностите. Защо ви е необходим двуизмерен масив? Е, бихте могли да използвате такъв, за да пресъздадете лесно известната игра „Battleship“: Нещо за масивите - 5 В „Battleship“ структурата на игралното поле може да бъде описана лесно: двуизмерен масив от 10 масива с 10 елемента всеки. Вие създавате два от тези масиви (един за вас и един за опонента ви)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
използвайте някои стойности (напр. числа or символи), за да попълните елементите, съответстващи на местоположението на вашите кораби, и след това се редувайте да извиквате координатите за конкретни елементи:
  • боен корабBoard1[0][2]!
  • Мис! боен корабBoard2[2][4]!
  • Хит!
  • боен корабBoard2[2][5]!
  • Хит!
  • боен корабBoard2[2][6]!,
  • Потънал!
Това завършва първото ни представяне на масивите, но това е само началото на нашето взаимодействие с тях. В следващите уроци ще видим интересни начини, по които те могат да бъдат използвани, а също така ще научим Howви вградени функции има Java, за да ни позволи да работим с тази структура от данни по-удобно :)
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION