Как отсортировать два массива, один из которых сортируется на основе сортировки другого?

#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:

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