查找数组中的第三小的索引

时间:2018-09-13 17:15:42

标签: java arrays indexing

我正在尝试查找数组中三个最小元素的索引。我的评论是挪威语,如果需要的话,我可以翻译它们!

这是一项任务,我必须执行以下操作: -返回具有三个最小值的索引的数组 -具有三个用于索引的帮助变量,以及三个用于它们的值 -使用“ 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的三个第一个值匹配。

我整天都在工作,而我基本上不知道出什么问题了。提前非常感谢您!

编辑:添加信息

1 个答案:

答案 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]);