Найти третий наименьший индекс в массиве - PullRequest
0 голосов
/ 13 сентября 2018

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

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

Этот метод пытается найти индексы. У меня есть стартовые индексы 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};
    }

Метод вызывает метод «indekssortering» (сортировка по индексу), который таков:

//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" возвращает неправильные индексы. Метод indekssortering работает и возвращает то, что должен. У меня нет основного метода, но когда я проверил его самостоятельно, я сделал что-то вроде этого:

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.

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

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

Ответы [ 2 ]

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

Основываясь на ваших комментариях - вам не нужен метод 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]);
0 голосов
/ 13 сентября 2018

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

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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...