#java #arrays #algorithm #sorting #mapping
#java #массивы #алгоритм #сортировка #отображение
Вопрос:
Итак, я сталкивался с этой проблемой много раз. Позвольте мне объяснить. Допустим, у меня есть эти два массива: A1={1,2,3,4,5,6,7,8,9,10};
и A2={1,2,3,0,2,1,1,0,0,0};
. Что мне требуется, так это следующее: когда я сортирую A2, какая бы замена и смещение элементов не происходили в A2, то же самое должно происходить и в A1. По сути, я пытаюсь создать карту, используя два массива, вместо создания реальной хэш-карты или хэш-таблицы.
Наконец, массивы должны выглядеть следующим образом: A1={4,8,9,10,1,6,7,2,5,3};
и A2={0,0,0,0,1,1,1,2,2,3};
. Соответствующие значения обоих массивов остаются одинаковыми, но данные сортируются на основе A2. Мне нужен способ выполнить такую сортировку максимально быстрым способом.
Есть предложения по этому поводу?
Комментарии:
1. Пахнет антишаблоном параллельных коллекций . Вы можете решить эту проблему, определив новый класс с двумя полями; одно поле является элементом из A1, а другое поле — соответствующим элементом из A2. Вместо двух массивов используйте один массив экземпляров вашего нового класса. Затем вы можете отсортировать массив с помощью компаратора, который учитывает только поле, которое раньше было элементом из A2.
2. Объявляйте массивы размером 2 внутри массива размером N и сортируйте на основе 2-го индекса.
Ответ №1:
Класс Pair мог бы здесь помочь.
import java.util.*;
public class Main
{
static class Pair implements Comparable<Pair>
{
int a1;
int a2;
Pair (int a1, int a2) //constructor
{
this.a1 = a1;
this.a2 = a2;
}
public int compareTo(Pair other) //making it only compare a2 values
{
return this.a2 - other.a2;
}
}
public static void main(String[] args)
{
int[] A1 = {1,2,3,4,5,6,7,8,9,10};
int[] A2 = {1,2,3,0,2,1,1,0,0,0};
Pair[] pairs = new Pair[A1.length];
for (int i = 0; i < pairs.length; i )
{
pairs[i] = new Pair(A1[i], A2[i]);
}
Arrays.sort(pairs);
//printing values
for (int i = 0; i < A1.length; i )
{
System.out.print(pairs[i].a1 " ");
}
System.out.println();
for (int i = 0; i < A2.length; i )
{
System.out.print(pairs[i].a2 " ");
}
}
}
Создав класс Pair, который содержит 2 переменные a1
и a2
, вы можете переопределить compareTo
метод, чтобы сравнивать только a2
значение, так что при Arrays.sort
вызове пары в массиве Pair будут заменены только в соответствии с a2
значениями. Затем вы можете получить доступ к значениям в парах и распечатать их. Это приведет к желаемому результату.
Комментарии:
1. @Sankeenth Ganeswaran Огромное спасибо! Я уверен, что это выполнит свою работу. Приветствия!
2. А если это три массива?
3. Я не уверен, что вы имеете в виду, сортируя три массива на основе упорядочения только одного из них? Для этого просто потребовалось бы, чтобы класс Pair имел третий атрибут a3.
Ответ №2:
Вы можете создать двумерный массив, где каждый элемент представляет собой массив длины 2
, и отсортировать его на основе второго элемента.
int[] A1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, A2 = { 1, 2, 3, 0, 2, 1, 1, 0, 0, 0 };
final int[][] res = new int[A1.length][2];
for(int i = 0; i < res.length; i ) {
res[i] = new int[] {A1[i], A2[i]};
}
Arrays.sort(res, (a,b)->Integer.compare(a[1], b[1]));
//Alternatively, Arrays.sort(res, Comparator.comparingInt(a -> a[1]));
for(final int[] a : res) {
System.out.println(a[0] " " a[1]);
}
Комментарии:
1. Да, я думаю, это тоже сработает. И кажется более простым. Спасибо! 🙂
2. @AkshatJ. Нет проблем.
Ответ №3:
Вы могли бы попробовать создать объект на основе данных, которые у вас действительно есть. В этом случае объект может содержать два поля, числа и вхождения. Затем реализуйте компаратор для сравнения по полю вхождений.