Найдите третий наименьший индекс в массиве

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

Это задание, и я должен сделать следующее: - вернуть массив с индексами трех наименьших значений - иметь три справочные переменные для индекса и три для их значений - используйте метод "indexssortering", чтобы присвоить индексам начальное значение

Этот метод пытается найти индексы. У меня есть m1, m2 и m3 в качестве начальных индексов, но они будут изменены в цикле for, если мы найдем меньшее число. m1_verdi, m2_verdi и m3_verdi - это значения. Они основаны на индексах m1, m2 и m3.

//oppgave 9
    public static int[] tredjeMin(int[] a){
        if (a.length < 3) {
            throw new java.util.NoSuchElementException("Arrayet har lengden " + a.length + ", skal ha lengde  >= 3!");
        }

        int[] tre = Arrays.copyOfRange(a, 0, 3); //Kopierer de tre forste tallene i arrayet a
        int[] in = indekssortering(tre); //Indekssorterer de tre forste tallene

        int m1 = in[0]; // STARTVERDI: index til minste verdi
        int m2 = in[1]; // STARTVERDI: index til nest minste verdi
        int m3 = in[2]; // STARTVERDI: index til nest, nest minste verdi

        int m1_verdi = a[m1]; //  STARTVERDI: minste verdi
        int m2_verdi = a[m2]; // STARTVERDI: nest minste verdi
        int m3_verdi = a[m3]; // STARTVERDI: nest, nest minste verdi

        for (int i = 0; i < a.length; i++) { // Looper gjennom arrayet a
            if (a[i] < m3_verdi) {
                if (a[i] < m2_verdi) {
                    if (a[i] < m1_verdi) {
                        m2 = m1;
                        m2_verdi = m1_verdi; // Ny nest minst

                        m1 = i;
                        m1_verdi = a[m1]; // Ny minst
                    } else {
                        m3 = m2;
                        m3_verdi = m2_verdi; // ny nest, nest minst

                        m2 = i;
                        m2_verdi = a[m2]; // Ny nest minst
                    }
                } else {
                    m3 = i;
                    m3_verdi = a[m3]; // Ny nest, nest minst
                }
            }
        }

        return new int[] {m1, m2, m3};
    }

Метод вызывает метод indexssortering (индексная сортировка), который является следующим:

//oppgave 8
    public static int [] indekssortering(int[] a){
        int[] indeks = new int[a.length]; //Oppretter tomt array med samme lengde som a
        int[] kopi = Arrays.copyOf(a, a.length); // Oppretter kopi av a
        for (int i = 0; i < kopi.length; i++) { // Bubble sort av kopi:
            for (int j = 0; j < kopi.length-1; j++) {
                if (kopi[j] > kopi[j+1]) {
                    int temp = kopi[j];
                    kopi[j] = kopi[j+1];
                    kopi[j+1] = temp;
                }
            }
        }

        int i = 0;
        while (i < kopi.length) {
            for (int j = 0; j < kopi.length; j++) { // Per tall i sortert kopi, loop gjennom hele arrayet
                if (kopi[i] == a[j]) { // Sjekker om valgt tall matcher et tall fra original arrayet a
                    indeks[i] = j; // Setter indeksen til original array a som innhold i arrayet indeks
                    i++; // Oker indeksen
                    if (i == kopi.length) { // Om den valgte indeksen er storre enn arrayets lengde; break
                        break;
                    }
                }
            }
        }
        return indeks; // Returnerer arrayet indeks
    }

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

У меня есть длинный тестовый файл, который я не писал, но он в основном показывает, что метод tredjeMin возвращает неправильные индексы. Метод «индекссортинг» работает и возвращает то, что должен. У меня нет основного метода, но когда я тестировал его самостоятельно, я сделал что-то вроде этого:

int[] a = {2, 0, 8, 12, 4, 0, 13, 3, 0, 0};

        Oblig1 tester = new Oblig1();
        int[] z = tester.indekssortering(a);
        int[] u = tester.tredjeMin(a);

        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(z));
        System.out.println(Arrays.toString(u));

Предполагается, что массив u соответствует трем первым значениям inn z.

Я работал над этим весь день и практически не понимал, что случилось. Огромное спасибо заранее!!

Правки: добавление информации

Можете поделиться выводом 3 System.out.println();

Maruthi Adithya 13.09.2018 19:20

Вы не используете i из for (int i = 0; i < kopi.length; i++) { нигде в методе indekssortering.

Jaydip Rakholiya 13.09.2018 19:23
[2, 0, 8, 12, 4, 0, 13, 3, 0, 0] [1, 5, 8, 9, 0, 7, 4, 2, 3, 6] [1, 1, 5]
Tara J 13.09.2018 19:24

Можете ли вы использовать стандартные методы сортировки Java? Кажется, ваша реализация слишком сложна

Maxim 13.09.2018 19:36

Каков ваш ожидаемый результат, если есть дубликаты (например, ваш пример ввода выше)?

Jaydip Rakholiya 13.09.2018 19:42

второй - это сортировка первого, поэтому ожидаемый результат третьего должен быть [1, 5, 8], то есть тремя первыми числами второго массива.

Tara J 13.09.2018 19:52

Тогда вам не нужен метод tredjeMin(). Подробности я опубликовал в своем ответе.

Jaydip Rakholiya 13.09.2018 19:59
1
7
131
2

Ответы 2

Мне немного сложно понять ваш код, поскольку переменные / методы / комментарии на норвежском языке, но я думаю, что ваш метод поиска трех наименьших индексов можно было бы значительно упростить, следуя приведенному ниже псевдокоду. Упростив его, будет легче отлаживать.

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

Второй - просто отслеживать индексы, а не индексы и значения. Чтобы получить значение, просто проверьте массив по этому индексу.

for (int i = 0; i < a.length(); i++) {
    if (a[i] < max(a[m1], a[m2], a[m3])) { // you have to implement max()
        // replace max of m1, m2, m3 with i
    }
}

int[] result = new int[] {m1, m2, m3)

// sort the array of 3

Судя по вашим комментариям - вам вообще не нужен метод tredjeMin.

Вы можете просто сделать следующее, чтобы проверить -

int[] a ={2, 0, 8, 12, 4, 0, 13, 3, 0, 0};
int sortedIndex[] = indekssortering(a);
System.out.println("Min 3 Indexes - " + sortedIndex[0]+" , "+ sortedIndex[1]+" , "+ sortedIndex[2]);

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

Tara J 13.09.2018 20:03

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