Сортировка двухмерного массива строк на основе другого массива строк — Java

Как указано в заголовке, я хочу реализовать метод, который позволил бы мне сортировать массив 2d с учетом столбца на основе массива, например. сортировать массив 2d по столбцу 2 в зависимости от порядка массива.

String[][] a1 = new String[][]{
  {x,dog,x}
  {x,monkey,x}
  {x,cat,x}
}
//x being a random string

String[] a2 = new String[]{dog,cat,monkey};

//Output should be:
 a1 = {
  {x,dog,x}
  {x,cat,x}
  {x,monkey,x}
 }

Я не уверен, в каком направлении двигаться с этого момента, я посмотрел на компаратор, но я не уверен, как бы я реализовал его в этом сценарии. Любое руководство, которое поможет мне достичь этого, приветствуется.

Я бы посоветовал узнать больше о классе Comparator. Это то, что вы хотите сделать здесь. Сначала напишите пару простых примеров с компаратором. Например: создайте такой объект, как Автомобиль, с такими полями, как Цвет и Год, затем используйте компаратор, чтобы отсортировать список этих объектов по одному полю, а затем по другому. Тогда вы ясно увидите, как применить это к вашей текущей проблеме.

Kon 15.03.2019 22:04

Можно поменять местами все соответствующие ячейки с помощью логики.

Yassin Hajaj 15.03.2019 22:07

@ coding97 Я так понимаю, вы хотите отсортировать a1 по второму столбцу.... Но какова цель массива a2 ??

Highbrainer 15.03.2019 22:10

@Highbrainer, к сожалению, я привел плохой пример, я хотел, чтобы он отсортировался по порядку a2 независимо от алфавитного порядка. если это имеет смысл

coding97 15.03.2019 22:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
179
4

Ответы 4

Вам нужен Comparator<String[]>, который зависит от a2 массива:

String[] a2 = new String[]{"dog", "cat", "monkey"};

Comparator<String[]> comparator = (arr1, arr2) -> {
    List<String> list = Arrays.asList(a2);

    int index1 = list.indexOf(arr1[1]);
    int index2 = list.indexOf(arr2[1]);

    return Integer.compare(index1, index2);
};

Arrays.sort(a1, comparator);
System.out.println(Arrays.deepToString(a1));

Предполагая, что кошка, собака и обезьяна являются объектами String:

  Arrays.stream(a1).sorted(Comparator.comparingInt(s -> -1 * Arrays.asList(a2).indexOf(s[1]))).toArray(String[][]::new);

Расширяя ответ @Ruslan, Comparator - правильный путь, но вы, вероятно, не захотите делать indexof для каждого сравнения в сортировке, поэтому вы хотите начать с сопоставления вашей ссылочной строки с обратным индексом:

    String[] a2 = new String[]{"dog", "cat", "monkey"};
    Map<String, Integer> order = new HashMap<>();
    for(int i = 0; i < a2.length; i++) {
      order.put(a2[i], i);
    }

    Comparator<String[]> comparator = (arr1, arr2) -> {
      int index1 = order.get(arr1[1]);
      int index2 = order.get(arr2[1]);

      return Integer.compare(index1, index2);
    };

    Arrays.sort(a1, comparator);

Вот фрагмент, который должен вам помочь. Он сортирует массив по строке номер два в порядке, заданном a2. Если строки секунд одинаковы, он сравнивает первую строку, а затем третьи строки. Остерегайтесь, он проверяет нулевые строки.

Важная часть заключается в следующем:

 @Override
    public int compare(String[] o1, String[] o2) {      
        int score1 = types.indexOf(o1[1])-types.indexOf(o2[1]);
        if (score1!=0) {
            return score1;
        }

        int score2 = o1[0].compareTo(o2[0]);
        if (score2!=0) {
            return score2;
        }

        int score3 = o1[2].compareTo(o2[2]);
        return score3;
    }

Видеть :

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

public class SpecialComparatorMain implements Comparator<String[]> {

    private List<String> types;

    public SpecialComparatorMain(List<String> types) {
        this.types = types;
    }

    public static void main(String[] args) {
        String[] a2 = new String[]{"dog","cat","monkey"};
        String[][] a1 = new String[][]{
              {"z","dog","x"},
              {"y","monkey","x"},
              {"x","cat","x"},
              {"x","monkey","x"},
              {"y","cat","x"},
              {"z","monkey","z"},
              {"z","monkey","y"},
              {"z","monkey","x"},
            };
            //x being a random string

            System.out.println("Before");
            Stream.of(a1).map(Arrays::toString).forEach(System.out::println);

            Arrays.sort(a1, new SpecialComparatorMain(Arrays.asList(a2)));

            System.out.println("After");
            Stream.of(a1).map(Arrays::toString).forEach(System.out::println);

    }

    @Override
    public int compare(String[] o1, String[] o2) {      
        int score1 = types.indexOf(o1[1])-types.indexOf(o2[1]);
        if (score1!=0) {
            return score1;
        }

        int score2 = o1[0].compareTo(o2[0]);
        if (score2!=0) {
            return score2;
        }

        int score3 = o1[2].compareTo(o2[2]);
        return score3;
    }

}

Выход:

Before
[z, dog, x]
[y, monkey, x]
[x, cat, x]
[x, monkey, x]
[y, cat, x]
[z, monkey, z]
[z, monkey, y]
[z, monkey, x]

After
[z, dog, x]
[x, cat, x]
[y, cat, x]
[x, monkey, x]
[y, monkey, x]
[z, monkey, x]
[z, monkey, y]
[z, monkey, z]

ХТХ!

Другие вопросы по теме