Все зависит от размера ваших массивов.Это решение будет использовать первый массив для выполнения сортировки, но будет выполнять перестановку для нескольких массивов.
Таким образом, это может иметь некоторые проблемы с производительностью, если используемому алгоритму сортировки потребуется много перестановок.
Здесь,Я взял базовый алгоритм сортировки, по которому я добавил некоторые действия, которые я могу выполнить во время обмена двумя ячейками.Это позволяет использовать некоторые лямбда-выражения для замены нескольких массивов одновременно на основе одного массива.
public static void sortArray( int[] array, BiConsumer<Integer, Integer>... actions ) {
int tmp;
for ( int i = 0, length = array.length; i < length; ++i ) {
tmp = array[i];
for ( int j = i + 1; j < length; ++j ) {
if ( tmp > array[j] ) {
array[i] = array[j];
array[j] = tmp;
tmp = array[i];
// Swap the other arrays
for ( BiConsumer<Integer, Integer> cons : actions ){
cons.accept( i, j);
}
}
}
}
}
Давайте создадим универсальный метод для замены ячеек, которые мы можем передать как BiConsumer
лямбда (толькоработает для непримитивных массивов):
public static <T> void swapCell( T[] array, int from, int to ) {
T tmp = array[from];
array[from] = array[to];
array[to] = tmp;
}
Это позволяет использовать сортировку массивов, например:
public static void main( String[] args ) throws ParseException {
int[] indexes = new int[] { 0, 2, 8, 5 };
String[] sources = new String[] { "how", "are", "today", "you" };
String[] targets = new String[] { "I", "am", "thanks", "fine" };
sortArray( indexes,
( i, j ) -> swapCell( sources, i, j ),
( i, j ) -> swapCell( targets, i, j ) );
System.out.println( Arrays.toString( indexes ) );
System.out.println( Arrays.toString( sources ) );
System.out.println( Arrays.toString( targets ) );
}
[0, 2, 5, 8]
[как, ты, сегодня]
[Я, хорошо, спасибо]
Это решение не требует (намного) больше памяти, чем уже использованное, так как никакого дополнительного массива илиCollection
требуется.
Использование BiConsumer<>...
обеспечивает общее решение, оно также может принимать Object[]...
, но это больше не будет работать для массива примитивов.Это, конечно, приводит к незначительной потере производительности, поэтому, исходя из необходимости, это можно удалить.
Создание полного решения, сначала давайте определим интерфейс, который будет использоваться в качестве фабрикиа также:
interface Sorter {
void sort(int[] array, BiConsumer<Integer, Integer>... actions);
static void sortArrays(int[] array, BiConsumer<Integer, Integer>... actions){
// call the implemented Sorter
}
}
Затем реализуем простой сортировщик Selection с той же логикой, что и раньше, для каждой перестановки в исходном массиве мы выполняем BiConsumer
:
class SelectionSorter implements Sorter {
public void sort(int[] array, BiConsumer<Integer, Integer>... actions) {
int index;
int value;
int tmp;
for (int i = 0, length = array.length; i < length; ++i) {
index = i;
value = array[i];
for (int j = i + 1; j < length; ++j) {
if (value > array[j]) {
index = j;
value = array[j];
}
}
if (index != i) {
tmp = array[i];
array[i] = array[index];
array[index] = tmp;
// Swap the other arrays
for (BiConsumer<Integer, Integer> cons : actions) {
cons.accept(i, index);
}
}
}
}
}
Давайте также создадим Bubble Sorter:
class BubbleSorter implements Sorter {
public void sort(int[] array, BiConsumer<Integer, Integer>... actions) {
int tmp;
boolean swapped;
do {
swapped = false;
for (int i = 1, length = array.length; i < length; ++i) {
if (array[i - 1] > array[i]) {
tmp = array[i];
array[i] = array[i - 1];
array[i - 1] = tmp;
// Swap the other arrays
for (BiConsumer<Integer, Integer> cons : actions) {
cons.accept(i, i - 1);
}
swapped = true;
}
}
} while (swapped);
}
}
Теперь мы можем просто вызвать один или другой на основе простого условия, длина:
static void sortArrays(int[] array, BiConsumer<Integer, Integer>... actions){
if(array.length < 1000){
new BubbleSorter().sort(array, actions);
} else {
new SelectionSorter().sort(array, actions);
}
}
Таким образом, мы можем вызватьнаш сортировщик просто с
Sorter.sortArrays(indexes,
(i, j) -> swapCell(sources, i, j),
(i, j) -> swapCell(targets, i, j)
);
Полный тестовый набор на ideone (ограничение по размеру из-за тайм-аута)