我正在尝试查找数组中三个最小元素的索引。我的评论是挪威语,如果需要的话,我可以翻译它们!
这是一项任务,我必须执行以下操作: -返回具有三个最小值的索引的数组 -具有三个用于索引的帮助变量,以及三个用于它们的值 -使用“ 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的三个第一个值匹配。
我整天都在工作,而我基本上不知道出什么问题了。提前非常感谢您!
编辑:添加信息
答案 0 :(得分:0)
根据您的评论-根本不需要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]);