Класс arrays, часть 2

Обновление БИОС на материнской плате

  1. Нажать кнопку включения. При первых секундах загрузки появится логотип материнской платы. Жмите сразу кнопку F4,чтобы вызвать меню EasyFlash. Если не получилось, жмите F2 для того чтобы выполнить вход в БИОС. Выберите вкладку Advanced, а в ней уже Start Easy Flash. После нажатие Enter вы увидите интерфейс программы.
  2. В каталоге используя стрелки, выберите файл БИОСа.
  3. После выбора нужного диска, выбрать через накопитель файл прошивки, потом Enter.
  4. Далее увидите на экране окно. Используя стрелки, энтером подтвердите запрос на прошивку r. Easy Flash обновит БИОС.
  5. Подтвердите нажатием кнопки Ок. После окончания форматирования появится сообщение.
  6. Далее Easy Flash выключится после проверки установки.

Динамический массив в Java

Минус массива — статичность, то есть необходимость задавать размер заранее. Для этого и придумали динамический массив, который может менять размер в процессе выполнения программы.
Например, статические массивы работают по следующей схеме:

А динамические массивы в Java функционируют несколько иначе:

Так как для копирования массива используется специальная нативная функция, проблем с «переездом» не возникает.

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

Поиск с помощью Arrays.binarySearch()

Класс Arrays содержит набор методов с именем binarySearch(). Этот метод поможет вам выполнить бинарный поиск в массиве. Сначала массив должен быть отсортирован. Вы можете сделать это самостоятельно или с помощью метода Arrays.sort(), описанного ранее в этом тексте. Вот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 6);

System.out.println(index);

Вторая строка этого примера ищет в массиве значение 6. Метод binarySearch() возвращает индекс в массиве, в котором был найден элемент. В приведенном выше примере метод binarySearch() вернет 3.

Если в массиве существует более одного элемента с искомым значением, нет гарантии, какой элемент будет найден.

Если элемент с данным значением не найден, будет возвращено отрицательное число. Отрицательным числом будет индекс, по которому будет вставлен искомый элемент, а затем минус один. Посмотрите на этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 7);

System.out.println(index);

Число 7 не найдено в массиве. Номер 7 должен был быть вставлен в массив по индексу 4, если 7 должен был быть вставлен в массив (и порядок сортировки сохранен). Следовательно, binarySearch() возвращает -4 — 1 = -5.

Если все элементы в массиве меньше искомого значения, то двоичная Search() вернет — длина массива — 1. Посмотрите на этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 12);

System.out.println(index);

В этом примере мы ищем 12 в массиве, но все элементы в массиве меньше 12. Поэтому binarySearch() вернет -length(-6) — 1 = -6 -1 = -7.

Метод Arrays.binarySearch() для поиска части массива. Вот как это выглядит:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 0, 4, 2);

System.out.println(index);

В этом примере выполняется поиск в массиве значения 2, но только между индексами 0 и 4 (без 4).

Эта версия binarySearch() работает так же, как и другая версия, за исключением случаев:

  • Если не найдено ни одного элемента, совпадающего в пределах интервала индекса, то все равно вернется индекс того места, где должно было быть вставлено значение.
  • Если все значения в интервале меньше искомого значения, вернется -toIndex -1, а не -array length — 1.

Таким образом, этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 0, 4, 12);

вернет -5, а не -7, как в двоичном поиске (целых, 12).

Инициализация

Теперь есть два способа инициализировать двумерный массив в Java:

  1. используя литерал массива во время создания.
  2. используя вложенный цикл for.

В следующем примере мы узнаем, как выполнить цикл через двумерный массив, инициализировать каждый элемент и вывести (напечатать).

// initializing two dimensional array as literal 
String[][] names = { 
 {"Sam", "Smith"},
 {"Robert", "Delgro"},
 {"James", "Gosling"},
};
 int[][] board = new int;
 for (int i = 0; i < board.length; i++) {
 for (int j = 0; j < board.length; j++) {
 board = i + j;
 }
                   }

Вам понадобится столько циклов, какова размерность массива. Например, для явной инициализации трехмерного массива потребуются три вложенных цикла for. С другой стороны, для инициализации двумерного массива достаточно двух вложенных циклов for.

Как вывести

Если вы хотите получить доступ к каждому элементу, то вам нужно выполнить итерацию по двумерному массиву, используя два цикла for. Почему? Потому что вам нужно два индекса для доступа к отдельному элементу.

Вы можете использовать расширенный для каждого цикла или классический для цикла со счетчиком. Для того, чтобы напечатать(сделать вывод) содержимое 2D массива, вы можете использовать либо этот метод, либо Arrays.deepToString(), который возвращает строку всех элементов.

import java.util.Arrays;

/**
* Java Program to initialize and print two dimensional array in Java.
*/
class Basics {

public static void main(String args[]) {

// initializing two dimensional array as literal
String[][] names = {
{"John", "Smith"},
{"Javin", "Paul"},
{"James", "Gosling"},
};

// how to initialize two dimensional array in Java
// using for loop
int[][] board = new int;

for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
board = i + j;
}
}

// now let's print a two dimensional array in Java
for (int[] a : board) {
for (int i : a) {
System.out.print(i + "\t");
}
System.out.println("\n");
}

// printing 2D array using Arrays.deepToString() method
System.out.println("another way to print 2D arrays");
System.out.println(Arrays.deepToString(board));

}

}
Output:
0 1 2

1 2 3

2 3 4

another way to print 2D arrays
, , ]

Map an Array to Another Type

It’s often useful to apply operations on all array items, possibly converting them to another type of object.

With this objective in mind, we’ll try to create a flexible helper method using Generics:

If we don’t use Java 8 in our project, we can discard the Function argument, and create a method for each mapping that we need to carry out.

We can now reuse our generic method for different operations. Let’s create two test cases to illustrate this:

For primitive types, we’ll have to box our values first.

As an alternative, we can turn to Java 8’s Streams to carry out the mapping for us.

We’ll need to transform the array into a Stream of Objects first. We can do so with the Arrays.stream method.

For example, if we want to map our int values to a custom String representation, we’ll implement this:

How to Print an Array

Same as with the equals method, the array’s toString function uses the default implementation provided by the Object class, which isn’t very useful.

Both Arrays and ArrayUtils classes ship with their implementations to convert the data structures to a readable String.

Apart from the slightly different format they use, the most important distinction is how they treat multi-dimensional objects.

The Java Util’s class provides two static methods we can use:

  • toString: doesn’t work well with jagged arrays
  • deepToString: supports any Object-based arrays but doesn’t compile with primitive array arguments

On the other hand, Apache’s implementation offers a single toString method that works correctly in any case:

Сортировка массивов

 Метод  Arrays.sort([]a)

Метод sort() из класса Arrays использует усовершенствованный алгоритм Быстрой сортировки (Quicksort), который эффективен  для большинства  набора данных.  Метод упорядочивает весь массив в порядке возрастания значений элементов.

Формат метода

Arrays.sort([]a),

[]a – исходный массив, после работы метода массив будет содержать упорядоченные значения элементов в порядке возрастания.

Пример.

//исходный массив
double a[] = { 41.5, 11.4, 11.2, 3.1, 4.3, 5.5 };
//сортировка
Arrays.sort(a);
//результат сортировки
for(int i=0; i<a.length; i++)
System.out.print(a+"  ");  //3.1  4.3  5.5  11.2  11.4  41.5 
System.out.println();

 Метод  Arrays.sort([]a,index1,index2)

выполняет сортировку части массива по возрастанию массива от index1 до index2 минус единица

 Формат метода

Arrays.sort([]a,index1,index2),

 []a – исходный массив

index1, index2 — начальный и конечный индексы, определяющие диапазон упорядочивания элементов по возрастанию. 

Пример.

//исходный массив
int b[] ={2,1,0,50,30,20,10};
//сортировка  от 0 элемента до 3, сам третий элемент не входит
Arrays.sort(b,0,3);
//результат сортировки
for(int i=0; i<b.length; i++)
System.out.print(b+"  ");  // 0  1  2  50  30  20  10
System.out.println();
 
//сортировка  элементов от 3 до конца массива bb.length
Arrays.sort(b,3,b.length);
for(int i=0; i<b.length; i++)
System.out.print(b+"  "); //0  1  2  10  20  30  50
System.out.println();

 Сортировка  массива по убыванию

Формат метода

 Arrays.sort([]a, Collections.reverseOrder());

 При сортировке массива в обратном порядке (по убыванию) нужно использовать вместо примитивного типа, объектный тип.

Пример.

//// сортировrка по убыванию
//вместо примитивного типа double
//используем объектный тип   Double
   Double a[] = new Double;
   //заполняем массив случаными числами
   for(int i = 0; i <  a.length; i++) {
     a =  (double)(Math.random() * 20);
      System.out.format("%.2f   ", a);
         }
System.out.println();  
System.out.println("Массив,отсотированный по убыванию");
//Сортируем массив
    Arrays.sort(a, Collections.reverseOrder());
//Выводим отсортированный массив на консоль.
for(int i = 0; i <  a.length; i++) {
     System.out.format("%.2f   ", a);
     }
System.out.println();  

Результат

15,39   1,54   17,47   15,50   3,83   16,43   18,87   15,54   8,23   12,97  

Массив,отсотированный по убыванию

18,87   17,47   16,43   15,54   15,50   15,39   12,97   8,23   3,83   1,54   

1 Массивы в памяти

Картинки в предыдущих примерах немного неточны.

При создании массивов (как и при создании строк) в памяти выделяются два блока памяти: один для хранения самого массива (контейнера), а второй — под переменную, которая хранит его адрес. Уточненная ситуация изображена на картинке ниже:

Зеленым цветом изображен массив на элементов типа и переменная типа , которая хранит
адрес (ссылку) массива типа в памяти.

Для сравнения синим цветом обозначена обычная переменная типа , которая хранит значение .

Чем-то напоминает хранение строк в памяти, не находите?

Верно, строки. И как при работе со строками, «переменные типа массив» можно присваивать друг другу:

Код Пояснение
Создаем массив на элементов типа .
В ячейку с индексом записываем значение .
В ячейку с индексом записываем значение .
В переменную сохраняем адрес, который есть в переменной .
Теперь и указывают на один и тот же объект-массив в памяти.
В ячейку с индексом объекта-массива записываем сумму значений, которые хранятся в ячейках (хранится ) и (хранится ).

При этом объект-массив будет оставаться там, где и был, а переменные и будут хранить одинаковые адреса (ссылки) на один и тот же объект. Смотрите картинку:

Копирование

Возможно несколькими способами.

Копирование массива путем итерации массива

Первый способ — это перебрать массив и скопировать каждое значение исходного массива в целевой массив. Вот как выглядит копирование массива с использованием этого метода:

int[] source = new int;
int[] dest   = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

for(int i=0; i < source.length; i++) {
    dest = source;
}

Первые два массива int созданы. Во-вторых, исходный массив инициализируется значениями от 0 до 9 (от 0 до длины массива минус 1). В-третьих, каждый элемент в исходном массиве копируется в целевой массив.

Копирование с помощью Arrays.copyOf()

Вот как выглядит копирование массива:

int[] source = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

int[] dest = Arrays.copyOf(source, source.length);

Метод Arrays.copyOf() принимает 2 параметра. Первый — это массив для копирования. Второй — это длина нового массива — можно использовать для указания количества копируемых элементов из исходного массива.

Копирование с использованием Arrays.copyOfRange()

Метод Arrays.copyOfRange() копирует диапазон массива, не обязательно полный массив. Процесс копирования с ним:

int[] source = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

int[] dest = Arrays.copyOfRange(source, 0, source.length);

Метод Arrays.copyOfRange() принимает 3 параметра. Первый — это массив для копирования. Второй  — это первый индекс в исходном массиве, который нужно включить в копию. Третий  — это последний индекс в исходном массиве, который будет включен в копию (исключено — поэтому передача 10 будет копировать до и включая индекс 9).

Processing Arrays

When processing array elements, we often use either for loop or foreach loop because all of the elements in an array are of the same type and the size of the array is known.

Example

Here is a complete example showing how to create, initialize, and process arrays −

public class TestArray {

   public static void main(String[] args) {
      double[] myList = {1.9, 2.9, 3.4, 3.5};

      // Print all the array elements
      for (int i = 0; i < myList.length; i++) {
         System.out.println(myList + " ");
      }
     
      // Summing all elements
      double total = 0;
      for (int i = 0; i < myList.length; i++) {
         total += myList;
      }
      System.out.println("Total is " + total);
      
      // Finding the largest element
      double max = myList;
      for (int i = 1; i < myList.length; i++) {
         if (myList > max) max = myList;
      }
      System.out.println("Max is " + max);  
   }
}

This will produce the following result −

Как объявить двумерный массив в Java?

Вместо одной скобки вы будете использовать две, например, int [] [] — двумерный целочисленный массив. Определяется это следующим образом:

int[][] multiples = new int; // 2D integer array 4 строки и 2 столбца 
String[][] cities = new String; // 2D String array 3 строки и 3 столбца

Кстати, когда вы изначально объявляете, вы должны помнить, что нужно указать первое измерение, например, следующее объявление является неверным:

int[][] wrong = new int[][]; // not OK, you must specify 1st dimension 
int[][] right = new int[];

Выражение выдаст ошибку «переменная должна предоставить либо выражения измерения, либо инициализатор массива» во время компиляции. С другой стороны, при заполнении, второе измерение является необязательным и даже если вы не укажете, компилятор не будет ругаться, как показано ниже:

String[][] myArray = new String[]; // OK 
String[][] yourArray = new String; // OK

Потому что двумерный массив не что иное, как массив из одномерных массивов, из-за этого, вы также можете создать двумерный, где отдельные одномерные имеет разную длину, как показано в следующем примере.

class 
TwoDimensionalArray { public static void main(String[] args) {
String[][] salutation = {
{"Mr. ", "Mrs. ", "Ms. "},
{"Kumar"}
};
 // Mr. Kumar
System.out.println(salutation + salutation);
// Mrs. Kumar
System.out.println(salutation + salutation);
    }
}
The output from this program is: 
Mr. Kumar 
Mrs. Kumar

В этом примере вы можете видеть объявление двумерного массива, но его первая строка имеет 3 элемента, а вторая строка имеет только один элемент.

Вы можете получить доступ к элементам, используя оба индекса или только один индекс. Например, salutation представляет единственную строку в Java, в то время как salutation представляет одномерный.

Пока мы только что объявили и создали массив, но не инициализировали. Здесь можно увидеть значения по умолчанию для различных типов.

boolean[][] booleans = new boolean; 
System.out.println("booleans : " + booleans); 
byte[][] bytes = new byte; 
System.out.println("bytes : " + bytes); 
char[][] chars = new char; 
System.out.println("chars : " + (int)chars); 
short[][] shorts = new short; 
System.out.println("short : " + shorts); 
int[][] ints = new int; 
System.out.println("ints : " + ints); 
long[][] longs = new long; 
System.out.println("longs : " + longs); 
float[][] floats = new float; 
System.out.println("floats : " + floats); 
double[][] doubles = new double; 
System.out.println("doubles : " + doubles);
Object[][] objects = new Object; 
System.out.println("objects : " + objects); 
Output booleans : false bytes : 0 chars : 0 short : 0 ints : 0 longs : 0 floats : 0.0 doubles : 0.0 objects : null

Массив символов немного сложнее, потому что, если вы печатаете 0 как символ, он напечатает нулевой символ, и поэтому я использовал его целочисленное значение, приведя к int.

14 ответов

Прежде всего, является свойством, поэтому это будет вместо .

И он вернет 10, заявленный размер. Элементы, которые вы не объявляете явно, инициализируются с 0.

Чтобы узнать длину массива , используйте свойство. Это как , не используйте в основном используется для размера объектов, связанных со строками.

Свойство length всегда показывает общее выделенное пространство для массива во время инициализации.

Если у вас возникнут какие-либо проблемы подобного рода, просто запустите их. Удачного программирования!

Массивы — это статическое распределение памяти, поэтому, если вы инициализируете массив целых чисел:

Длина будет всегда 15, независимо от того, сколько индексов заполнено.

И еще одна вещь, когда вы инициализируете массив целых чисел, все индексы будут заполнены «0».

В этом случае arr.length вернет 10, размер выделенного вами массива. Логический размер здесь не применим, так как это массив фиксированной длины.

Когда вы инициализируете массив:

Java создаст массив из 10 элементов и инициализирует все из них до 0. См. для получения подробных сведений о начальных значениях для этого и других примитивных типов.

В Java ваш «фактический» и «логический» размер совпадают. Во время выполнения все слоты массива заполняются значениями по умолчанию при выделении. Итак, ваш содержит 10.

`

Итак, мы создали массив с объемом памяти 3 …
вот как это выглядит на самом деле

0й 1й 2й ………..> Индекс
2 4 5 ………..> Число

Итак, как вы видите, размер этого массива равен 3, но индекс массива — только до 2, поскольку любой массив начинается с 0-го индекса.

второй оператор ‘output должен быть равен 3, поскольку длина массива равна 3 … Пожалуйста, не путайте значение индекса с длиной массива ….

ура!

Он будет содержать фактический размер массива, так как это то, что вы инициализировали массив, когда он был объявлен. В Java нет понятия «логического» размера массива, поскольку в этом случае значение по умолчанию 0 так же логично, как и значения, которые вы установили вручную.

Он содержит выделенный размер, 10. Остальные индексы будут содержать значение по умолчанию, равное 0.

Если вам нужен логический размер массива, вы можете просмотреть все значения в массиве и проверить их на ноль. Увеличьте значение, если оно не равно нулю, и это будет логический размер. Поскольку размер массива фиксирован, у вас нет встроенного метода, возможно, вам стоит взглянуть на коллекции.

Должно быть:

Скобки следует избегать.

Java-массивы на самом деле имеют фиксированный размер, а другие ответы объясняют, что .length на самом деле не делает то, что вы ожидаете. Я просто хотел бы добавить, что с учетом вашего вопроса вы, возможно, захотите использовать ArrayList, массив, который может увеличиваться и уменьшаться:

Здесь метод .size () покажет вам количество элементов в вашем списке, и вы можете увеличивать его по мере добавления.

если вы подразумеваете под «логическим размером» индекс массива, то просто
    int arrayLength = arr.length-1;
поскольку индекс массива начинается с «0», то логический или «индекс массива» всегда будет меньше фактического размера на «один».

является типом массив с размером . Это массив элементов .
Если мы не инициализируем массив по умолчанию, элементы массива содержат значение по умолчанию. В случае массива int по умолчанию используется значение .

length — это свойство, которое применимо для массива.
здесь даст .

Обработка элементов массива

Существует несколько стандартных алгоритмов
обработки элементов массива:

  1. Удаление значения из массива по
    определенному индексу.

  2. Вставка значения в массив по
    определенному индексу.

  3. Сортировка элементов массива.

Начнем с первого
– удаления элемента из массива. Создадим вот такой массив:

final int N = 9;
short a = new shortN;

запишем туда
значения с 1 по 9:

for(int i=;i < N;++i) ai = (short)(i+1);

Теперь удалим
элемент со значением 6. Для этого нужно проделать такую операцию:

Причем, сначала
перемещаем 7-ку на место 6-ку, затем 8-ку и 9-ку, то есть, двигаемся от
удаляемого элемента к концу массива. Программа будет выглядеть так:

final int N = 9;
short a = new shortN;
 
for(int i=;i < N;++i) ai = (short)(i+1);
 
for (int i = 5; i < N-1; ++i)
    ai = ai + 1;
 
for (short val  a) System.out.print(val+" ");

Здесь мы начали
движение с 5-го индекса (то есть 6-го элемента массива) и на первой итерации
делаем операцию a=a, то есть, 7-ку ставим на место 6-ки.
На следующей итерации уже имеем a=a – перемещаем
8-ку и, затем, a=a – перемещаем 9-ку. Все, в итоге
значение 6 было удалено из массива.

Теперь реализуем второй алгоритм и
вставим значение 4, которого не хватает вот в таком массиве:

short a = new short {1, 2, 3, 5, 6, 7, 8, 9, 9};

Здесь в конце записаны две 9, чтобы мы
могли сдвинуть все элементы на 1 вправо и вставить элемент со значением 4. То
есть, нам следует выполнить такую операцию над элементами массива:

Обратите
внимание, что сдвиг осуществляется с конца массива. Если мы начнем это делать с
4-го, то просто затрем все остальные значения пятеркой

Итак, вот программа,
которая вставляет 4-ку в этот массив:

short a = new short {1, 2, 3, 5, 6, 7, 8, 9, 9};
 
for (int i = 8; i > 3; --i)
 
    ai = ai - 1;
 
a3 = 4;
 
for (short val  a) System.out.print(val+" ");

Здесь счетчик i в цикле сначала
равен 8 – это индекс последнего элемента нашего массива. Затем, делается
операция a=a, то есть, a=a. Таким
образом, мы присваиваем 8-му элементу значение 7-го элемента. Это и есть
смещение значения вправо. На следующей итерации i уменьшается на
1, то есть, равно 7 и операция повторяется: a=a и так далее,
последний смещаемый элемент будет: a=a. После этого
i будет равно 3,
условие цикла становится ложным и он завершается. После смещения, мы
присваиваем 4-му элементу массива значение 4 и выводим получившийся массив на
экран.

Теперь
рассмотрим довольно распространенный алгоритм сортировки элементов массива по
методу всплывающего пузырька. Реализуем его на языке Java.

byte a = {3, 5, 1, 6, 2, 4};
 
for (int i = ; i < a.length-1; ++i) {
    byte min = ai;
    int pos = i;
 
    for (int j = i + 1; j < a.length; ++j)
        if (min > aj) {
            pos = j;
            min = aj;
        }
 
    byte t = ai;
    ai = apos;
    apos = t;
}
 
for (short val  a) System.out.print(val+" ");

Здесь первый
цикл показывает с какого элемента искать минимальный, то есть, это
местоположение той вертикальной черты в методе всплывающего пузырька. Затем,
задаем две вспомогательные переменные min – минимальное найденное
значение, pos – индекс
минимального элемента в массиве. Второй вложенный цикл перебирает все
последующие элементы массива и сравнивает его с текущим минимальным и если
будет найдено меньшее значение, то min становится
равной ему и запоминается его позиция. Вот эти три строчки меняют местами
текущее значение элемента с найденным минимальным, используя вспомогательную
переменную t. И в конце
программы выполняется вывод элементов массива на экран.

Запустим эту
программу и посмотрим как она работает. Кстати, если мы теперь хотим выполнить
сортировку по убыванию, то достаточно изменить вот этот знак на
противоположный.

Видео по теме

#1 Установка пакетов и первый запуск программы

#2 Структура программы, переменные, константы, оператор присваивания

#3 Консольный ввод/вывод, импорт пакетов

#4 Арифметические операции

#5 Условные операторы if и switch

#6 Операторы циклов while, for, do while

#7 Массивы, обработка элементов массива

#8 (часть 1) Строки в Java, методы класса String

#8 (часть 2) Строки — классы StringBuffer и StringBuider

#9 Битовые операции И, ИЛИ, НЕ, XOR

#10 Методы, их перегрузка и рекурсия

Сортировка объектов

Показанный ранее пример Arrays.sort() работает только для массивов примитивных типов данных, которые имеют порядок:

  • естественный;
  • числовой;
  • символьный в таблице ASCII (двоичное число, представляющее символ).

У объектов может не быть естественного порядка сортировки, поэтому вам нужно предоставить другой объект, который может определять порядок ваших объектов. Такой объект называется компаратором — это интерфейс.

Вот первый класс для объектов, которые мы хотим отсортировать:

private static class Employee{
    public String name;
    public int    employeeId;

    public Employee(String name, int employeeId){
        this.name       = name;
        this.employeeId = employeeId;
    }
}

Класс Employee — это простая модель сотрудника, у которого есть имя и идентификатор. Вы можете отсортировать массив объектов Employee по имени или по идентификатору сотрудника.

Вот первый пример сортировки массива объектов Employee по их имени с помощью метода Arrays.sort():

Employee[] employeeArray = new Employee;

employeeArray = new Employee("Xander", 1);
employeeArray = new Employee("John"  , 3);
employeeArray = new Employee("Anna"  , 2);

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.name.compareTo(e2.name);
    }
});


for(int i=0; i < employeeArray.length; i++) {
    System.out.println(employeeArray.name);
}
  1. Сначала объявляется массив.
  2. Три объекта Employee создаются и вставляются в массив.
  3. Метод Arrays.sort() вызывается для сортировки массива. В качестве параметра передаем массив employee и реализацию Comparator, которая может определять порядок объектов Employee. Это создает анонимную реализацию интерфейса Comparator.

В примере важно уловить реализацию метода compare() анонимной внутренней реализации интерфейса Comparator. Этот метод возвращает:

  • положительное число, если первый объект «больше»(позже в порядке сортировки), чем второй объект;
  • 0 — они «равны»(в порядке сортировки);
  • отрицательное число, если первый объект «меньше» (ранее в порядке сортировки), чем второй объект.

В приведенном выше примере мы просто вызываем метод String.compare(), который выполняет для нас сравнение (сравнивает имена сотрудников).

После сортировки массива мы перебираем его и выводим имена сотрудников. Вывод:

Anna
John
Xander

Обратите внимание, как порядок был изменен по сравнению с порядком, в котором они были первоначально вставлены в массив. Сортировка объектов Employee по их идентификатору сотрудника на основании предыдущего примера с измененной реализацией метода compare() анонимной реализации интерфейса Comparator:

Сортировка объектов Employee по их идентификатору сотрудника на основании предыдущего примера с измененной реализацией метода compare() анонимной реализации интерфейса Comparator:

Employee[] employeeArray = new Employee;

employeeArray = new Employee("Xander", 1);
employeeArray = new Employee("John"  , 3);
employeeArray = new Employee("Anna"  , 2);

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        return e1.employeeId - e2.employeeId;
    }
});

for(int i=0; i < employeeArray.length; i++) {
    System.out.println(employeeArray.name);
}

Вывод:

Xander
Anna
John

Чтобы сравнить объекты Employee в массиве сначала по их имени, а если оно совпадает, то по их идентификатору сотрудника, реализация compare():

java.util.Arrays.sort(employeeArray, new Comparator() {
    @Override
    public int compare(Employee e1, Employee e2) {
        int nameDiff = e1.name.compareTo(e2.name);
        if(nameDiff != 0) { return nameDiff; }
    
        return e1.employeeId - e2.employeeId;
    }
});
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector