Сортировать массив на основе другого массива с разными значениями - PullRequest
0 голосов
/ 21 июня 2019

Я хочу отсортировать массив на основе другого массива с другими значениями. Учтите следующее:

Ссылочный массив: {"A","B","C"}

Получено Массив1: {"C","A","B"}
Получено Массив2: {"cc","aa","bb"}
Получено Массив3: {"123","asrd","sdhg"}

значения, соответствующие

A -> aa and asrd
B -> bb and sdhg
C -> cc and 123

Я хочу отсортировать полученные массивы 1, 2 и 3 в порядке, указанном моим ссылочным массивом.

Ожидаемый результат:
Полученный массив после сортировки: {"A","B","C"}
Получено Array2 после сортировки: {"aa","bb","cc"}
Получено Array3 после сортировки: {"asrd","sdhg","123"}

PS: Порядок элементов ссылочного массива может быть любым ([A,B,C] или [C,B,A] и т. Д.). Полученные массивы 2 и 3 должны быть отсортированы соответственно.

Я знаю, как сортировать полученный массив 1 в порядке моего массива ссылок. Я пробовал логику для сортировки полученных массивов 2 и 3, но результат, который я получаю, неверен

String[] referenceArray = new String[] { "A", "B", "C" };
String[] obtainedArray1 = new String[] { "C", "A", "B" };
String[] obtainedArray2 = new String[] { "cc", "aa", "bb" };
String[] obtainedArray3 = new String[] { "123", "asrd", "sdhg" };

final List<String> referenceArrayList= Arrays.asList(referenceArray);
ArrayList<String> obtainedArray1_List= new ArrayList<String>(Arrays.asList(obtainedArray1));
ArrayList<String> obtainedArray2_List= new ArrayList<String>(Arrays.asList(obtainedArray2));
ArrayList<String> obtainedArray3_List= new ArrayList<String>(Arrays.asList(obtainedArray3));


// Sorting ObtainedArray1_List - This works Fine
Collections.sort(obtainedArray1_List, Comparator.comparing(s -> referenceArrayList.indexOf(s)));

//Sorting obtainedArray2_List - Not Working
Collections.sort(obtainedArray2_List, Comparator.comparing(s -> referenceArrayList.indexOf(obtainedArray1[obtainedArray2_List.indexOf(s)])));

Результат, полученный Array2_List после сортировки: ["aa","cc","bb"]

Ожидаемый результат ["aa","bb","cc"]

1 Ответ

0 голосов
/ 21 июня 2019

Как уже сказал Дж. Б. Низет, вы усложняете свою жизнь.У вас есть три отдельных массива, а их содержимое связано.Вы говорите, что A, aa и asrd принадлежат друг другу, а также B, bb и sdhg и C, cc и 123.

Это можно представить как три свойства одного объекта.Это точка объектной ориентации.Вы должны определить класс, который представляет эти три свойства:

public class Holder {

    private String letter;
    private String lower;
    private String text;

    public Holder(String letter, String lower, String text) {
        this.letter = letter;
        this.lower = lower;
        this.text = text;
    }

    public String getLetter() {
        return this.letter;
    }

    @Override
    public String toString() {
        return String.format("Holder(letter=%s, lower=%s, text=%s)",
            this.letter, this.lower, this.text);
    }
}

Ваши три массива никогда не должны существовать в первую очередь, а вместо этого должны быть массивом или коллекцией с Holder объектами.Для удобства приведем преобразование в List<Holder>.

List<Holder> holders = IntStream.range(0, obtainedArray1.length)
    .mapToObj(i -> new Holder(obtainedArray1[i], obtainedArray2[i], obtainedArray3[i]))
    .collect(Collectors.toList());

Теперь вы можете просто отсортировать собрать новый отсортированный список вместо трех отдельных отсортированных массивов.

List<String> referenceList = Arrays.asList("A", "B", "C");
List<Holder> sorted = holders.stream()
    .sorted(Comparator.comparing(t -> referenceList.indexOf(t.letter)))
    .collect(Collectors.toList());
...