Класс Arrays содержит метод equals() для проверки на равенство целых массивов. Метод перегружен для примитивов и Object. Чтобы два массива считались равными, они должны содержать одинаковое количество элементов, и каждый элемент должен быть эквивалентен соответствующему элементу другого массива (проверка осуществляется вызовом equals() для каждой пары; для примитивов используется метод equals() объектной «обертки» — например, Integer. equals() для int). Пример:
// arrays/ComparingArrays java // Using Arrays equals() import java.util.*;
import static net.mindview.util Print.*;
public class ComparingArrays {
public static void main(String[] args) { int[] al = new int[10]; int[] a2 = new int[10]; Arrays.filHal. 47); Arrays.fill(a2, 47); print(Arrays.equals(al, a2)); a2[3] = 11;
print(Arrays.equals(al, a2)); String[] si = new String[4]; Arrays fill(si. "Hi");
String[] s2 = { new StringC'Hi"), new StringC'Hi"),
new StringC'Hi"). new StringC'Hi") }; print(Arrays equals(sl. s2)),
}
} /* Output
true
false
true *///•-
Сначала массивы al и a2 полностью совпадают, поэтому результат сравнения равен true, но после изменения одного из элементов будет получен результат false. В последнем случае все элементы si указывают на один объект, тогда как s2 содержит пять разных объектов. Однако проверка равенства определяется содержимым (с вызовом Object.equals()), поэтому результат равен true.
Сравнение элементов массивов
Сравнения, выполняемые в ходе сортировки, зависят от фактического типа объектов. Конечно, можно написать разные методы сортировки для всех возможных типов, но такой код придется модифицировать при появлении новых типов.
Главной целью проектирования является «отделение того, что может измениться, от того, что остается неизменным». В данном случае неизменным остается общий алгоритм сортировки, а изменяется способ сравнения объектов. Вместо того, чтобы размещать код сравнения в разных функциях сортировки, мы воспользуемся паттерном проектирования
В Java функциональность сравнения может выражаться двумя способами. Первый основан на «естественном» методе сравнения, который включается в класс при реализации java.lang.Comparable — очень простого интерфейса с единственным методом compareTo(). В аргументе метод получает другой объект того же типа. Он выдает отрицательное значение, если текущий объект меньше аргумента, нуль при равенстве и положительное значение, если текущий объект больше аргумента.
В следующем примере класс реализует Comparable, а для демонстрации совместимости используется метод стандартной библиотеки Java Arrays.sort():
//: arrays/CompType.java
// Реализация классом интерфейса Comparable.
import java.util.*;
import net.mindview.util.*;
import static net.mindview.util.Print.*;
public class CompType implements Comparable
private static int count = 1; public CompType(int nl, int n2) { i = nl; J = n2;
}
public String toStringO {
String result = "[i = " + i + J = " + j + "]"; if(count++ % 3 == 0)
result += "\n"; return result;
}
public int compareTo(CompType rv) {
return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
}
private static Random r = new Random(47); public static Generator
return new CompType(r.nextInt(100),r.nextInt(100));
}
}:
}
public static void main(String[] args) { CompType[] a =
Generated, array (new CompType[12], generatorO); print("перед сортировкой;"); pri nt(Arrays.toStri ng(a)); Arrays.sort(a); print("после сортировки;");
print(Arrays.toString(a));
}
} /* Output: перед сортировкой:
[[1 = 58, j = 55], [i = 93. j = 61]. [i =61. j = 29] . [i = 68, j = 0], [i = 22, j = 7]. [i = 88, j = 28] , [i = 51, j = 89], [i = 9, j = 78], [i = 98. j = 61]
, [i = 20, j = 58]. [i = 16, j = 40], [i - 11. j - 22] ]
после сортировки:
CCi = 9. j = 78], [i - 11. j - 22], [i - 16. j - 40]
. [i = 20. j = 58]. [i = 22, j = 7]. [i = 51. j = 89]
. [i = 58. j = 55]. [i =61. j = 29]. [i = 68. j = 0]
. [i = 88. j = 28]. [i = 93. j = 61]. [i = 98. j = 61] ]
*///:-