Java - получить индексы в порядке возрастания массива int - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть массив int как [2,4,1,0,0,3], и мне нужно получить из него массив индексов в порядке возрастания, значит [3,4,2,0,5,1].

Я попытался решить эту проблему, используя отсортированный массив, чтобы упорядочить числа, а затем перебрать исходный массив, чтобы найти индекс при совпадении.Как показано ниже:

public class IndexAscendingSorter {
    public static void main (String[] args) {
        int[] array = {2,4,1,0,0,3};
        IndexAscendingSorter finder = new IndexAscendingSorter();
        int[] indixes = finder.orderIndexAscending(array);

        System.out.println("Indexes of the array in ascending order: " +
                            Arrays.toString(indixes));
    }

    public int[] orderIndexAscending(int[] array) {
        int[] minimumIndexes = new int[array.length];
        int[] sortedArray = array.clone();
        Arrays.sort(sortedArray);

        for (int index = 0; index < array.length; index++){
            int minIndex = 0;
            for (int number : array) {
                if (number == sortedArray[index]) { 
                    minimumIndexes[index] = minIndex;
                    break;
                }
                minIndex++;
            }
        }
        return minimumIndexes;
    }
}

Проблема в том, что для тех же чисел не возвращаются правильные индексы, результат выполнения этого кода:

Индексы массива в порядке возрастанияorder: [3, 3, 2, 0, 5, 1] ​​Второй массив значений [1] должен был быть 4 вместо 3. Кто-нибудь знает, как я могу улучшить это?

Ответы [ 5 ]

0 голосов
/ 20 сентября 2018

Вы можете просто обновить значение, которое уже посещено, любым значением, которого нет в массиве.

for (int index = 0; index < array.length; index++){
    int minIndex = 0;
    for (int number : array) {
        if (number == sortedArray[index]) { 
            minimumIndexes[index] = minIndex;
            array[minIndex]=Integer.MAX_VALUE;
            break;
        }
        minIndex++;
    }
}
0 голосов
/ 17 сентября 2018
 for (int index = 0; index < array.length; index++){
        int minIndex = 0;
        for (int number : array) {
            if (number == sortedArray[index]) { 
                minimumIndexes[index] = minIndex;
                array[minIndex]=Integer.MAX_VALUE;
                break;
            }
            minIndex++;
        }
    }

Вы можете просто обновить уже посещенное значение любым значением, которое никогда не присутствует в массиве.

0 голосов
/ 17 сентября 2018

Соедините числа с их исходными индексами:

[2,4,1,0,0,3] => [[2,0],[4,1],[1,2],[0,3],[0,4],[3,5]]]

Затем сортируйте по исходному значению:

=> [[0,3],[0,4],[1,2],[2,0],[3,5],[4,1]]]

И, наконец, извлечь индексы:

=> [3,4,2,0,5,1]
0 голосов
/ 17 сентября 2018

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

0 голосов
/ 17 сентября 2018

Продолжая ваш подход, можно быстро использовать хэш-набор, в который вы добавите уже использованные индексы, а затем сможете проверить, является ли он повторяющимся индексом.Просто измените функцию orderIndexAscending () на:

    public int[] orderIndexAscending(int[] array) {
        int[] minimumIndexes = new int[array.length];
        int[] sortedArray = array.clone();
        Arrays.sort(sortedArray);
        Set<Integer> savedIndexes = new HashSet<>();

        for (int index = 0; index < array.length; index++){
            int minIndex = 0;
            // Add the index in ascending order, we need to keep the indexes already
            // saved, so won't miss indexes from repeted values
            for (int number : array) {
                if (number == sortedArray[index] && !savedIndexes.contains(minIndex)) { 
                    savedIndexes.add(minIndex);
                    minimumIndexes[index] = minIndex;
                    break;
                }
                minIndex++;
            }
        }
        return minimumIndexes;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...