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

Клас масиви

Публикувано в групата
Здравей отново! :) В днешния урок ще говорим за класа Arrays в Java. В миналия урок се запознахме с такава структура от данни, наречена масив. Научихме How да ги създаваме и да ги попълваме с данни. И разгледахме How се съхраняват в паметта. Днес ще разгледаме някои задачи и примери за работа с масиви, които често ще виждате в реална работа. Например, представете си следната ситуация: Имаме масив от 10 произволни числа.

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Нашата задача е да сортираме този масив във възходящ ред: от най-малкия до най-големия. В крайна сметка трябва да изглежда така: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Как да направим това? Тази задача не е тривиална. Никога не сме правor това преди :/ НяHowви идеи? Опитай се да познаеш. Ето едно решение:
  • Преминете през всички елементи на масива. Сравнете всеки елемент със следващия ([0] с [1], [1] с [2], [2] с [3] и т.н.). Ако текущият елемент е по-голям от следващия, ние ги разменяме и след това преминаваме към следващия елемент. Ако не, оставете ги такива, Howвито са, и продължете напред
  • Така след първото преминаване през елементите най-голямата стойност (167) гарантирано е в последната клетка.
  • Сега отново ще прегледаме всички елементи, но този път ще започнем с индекс [0] до предпоследния елемент (най-големият номер вече е на мястото си) и ще направим същите сравнения и размени. След това преминаване, в предпоследната клетка, ще имаме втората по големина стойност (99).
  • Повторете този процес толкова пъти, колкото имаме елементи от масива.
Имаме идеята. Сега остава само да напишем codeа. Изглежда така: Клас масиви и използването му - 2

public class Main {

   public static void main(String[] args) {
      
       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Ъъъ... Изглежда малко сложно -_- Дори общият принцип да е разбираем, все още трябва да напишем доста code, за да решим такава проста задача. Добре, може би просто сме се надценor? Задачата, с която се заехме, вероятно все още е твърде сложна за нас. Нека опитаме нещо по-просто. Например вземете същия масив от числа.

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Нашата задача е да копираме съдържанието му в друг масив.

int [] numbersCopy = new int[10];
Помислете How бихте го направor, като използвате това, което вече знаете за масивите? Например, можете да преминете през масива с числа в цикъл и последователно да запишете неговите елементи в numbersCopy :

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];
      
       for (int i = 0; i < numbers.length; i++) {
          
           numbersCopy[i] = numbers[i];
       }

   }
}
Е, ъъъ, ето че в общи линии го направихме! Изглежда, че сме решor проблема. Въпреки това, ако трябва да правите това често, вашият code ще има куп идентични цикли. Всъщност тези (и други) задачи отдавна са решени от създателите на Java. Не е нужно да „преоткриваме колелото“ и да codeираме собственото си решение. Има специален статичен клас ( Arrays ), който ви помага да изпълнявате общи задачи при работа с масиви. Към този клас са добавени методи за изпълнение на най-честите задачи, пред които са изпequalsи Java програмистите. Например задачата за сортиране на масив, с която се опитахме да се справим, се решава в един ред:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
      
       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Методът Arrays.sort() сортира масива. И неговият алгоритъм е много по-ефективен от codeа, който написахме. Конзолен изход: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Забележка: За да преобразуваме масива в низ, използвахме друг метод от класа Arrays : Arrays.toString() . Масивите в Java не заменят метода toString() сами по себе си. Така че, ако просто пишете

System.out.println(numbers.toString());
ще бъде извикан toString() на класа Object . За масив изходът ще бъде нещо като това: [I@4554617c Няма да навлизаме в подробности сега защо точно това е изходът. Основното е, че очевидно не е това, от което се нуждаем. Но Arrays.toString() прави точно това, което искаме. Между другото, копирането също се осъществява лесно с класа Arrays :

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Предаваме на метода Arrays.copyOf() нашия оригинален масив (от който искаме да копираме стойности) и дължината на новия масив, в който копираме данните. В този случай ние посочихме numbers.length като дължина, тъй като искаме да копираме целия масив. Ако искаме да копираме само първите няколко елемента, можем да посочим дължината на нов по-малък масив:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Тук посочихме 4 като дължина на новия масив. Съответно само първите 4 елемента от числа ще бъдат копирани в новия масив. Конзолен изход: [167, -2, 16, 99] Между другото, Arrays също ви позволява да копирате част от масив от средата, а не от началото на масива:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Изход: [16, 99, 26, 92] Числата бяха копирани в новия масив от втория масив от втория (включително) до шестия (не включително) елемент. Може също да се наложи да сравним два масива. Както при метода toString() , самите масиви не заместват метода equals() . Така че, ако се опитаме да ги сравним по този начин

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
тогава получаваме false. Това е така, защото ще бъде извикан Object.equals() , който сравнява препратките. И очевидно са различни! Но това, от което се нуждаем, е да сравним съдържанието на масива, а не препратките. Класът Arrays замества метода equals() , за да го направи точно това, което искаме:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Изход: true Между другото, класът Arrays работи не само с обикновени масиви, но и с двумерни:

public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));
      
       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Изход: Равни ли са тези двумерни масиви? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Както можете да видите, методът Arrays.copyOf() успя да копира двуизмерен масив. И класът има специални методи за сравняване и показване на двумерни масиви: deepEquals и deepToString() . В бъдеще многократно ще виждате (и ще се радвате на факта), че създателите на Java са предвидor много ситуации, с които често се сблъскват програмистите, и са имплементирали готови решения за тях в езика. Използването на тези решения е много по-лесно и удобно от преоткриването на колелото, нали? :) Не забравяйте да прочетете documentацията за класа Arrays на уебсайта на Oracle . Успех в учението!
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION