Я пытаюсь найти индексы трех самых маленьких элементов в массиве. Мои комментарии на норвежском, я могу перевести их, если это необходимо!
Это задание, и я должен сделать следующее:
- вернуть массив с индексами трех наименьших значений
- иметь три справочные переменные для индекса и три для их значений
- используйте метод «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.
Я работал над этим весь день, и я в основном слеп к тому, что не так. Большое спасибо заранее !!
Правки: добавление информации