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

Java 查找数组中第三小的索引,java,arrays,indexing,Java,Arrays,Indexing,我试图找到数组中三个最小元素的索引。我的评论是挪威语,如果有必要,我可以翻译 这是一项任务,我必须做以下工作: -返回索引为三个最小值的数组 -索引有三个帮助变量,值有三个 -使用“IndexSortering”方法为索引提供一个起始值 此方法正在尝试查找索引。我有m1、m2和m3作为起始索引,但是如果我们找到一个较小的数字,它们将在for循环中改变。m1_verdi、m2_verdi和m3_verdi为数值。它们基于m1、m2和m3的指数 //oppgave 9 public stat

我试图找到数组中三个最小元素的索引。我的评论是挪威语,如果有必要,我可以翻译

这是一项任务,我必须做以下工作: -返回索引为三个最小值的数组 -索引有三个帮助变量,值有三个 -使用“IndexSortering”方法为索引提供一个起始值

此方法正在尝试查找索引。我有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};
    }
数组u基本上应该与z中的前三个值相匹配

我已经为此工作了一整天,我基本上看不到哪里出了问题。提前非常感谢你


编辑:添加信息

由于变量/方法/注释是挪威语,我在理解您的代码时有点困难,但我认为您查找三个最小索引的方法可以通过以下伪代码简化很多。通过简化它,将更容易调试

我所做的第一个区别是,与其一直保持三个min索引的排序,不如在最后对它们进行排序

第二种方法是只跟踪索引,而不是跟踪索引和值。要获取该值,只需检查该索引处的数组

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
for(int i=0;i
根据您的评论-您根本不需要
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]);

你能分享3
System.out.println();
的输出吗?你没有使用
中的
i
for(int i=0;i
索引排序方法中的任何地方。
[2,0,8,12,4,0,13,3,0,0][1,5,8,9,0,7,4,2,3,6][1,1,5]
您可以使用标准Java的排序方法吗?您的实现似乎太复杂了。如果存在重复项(即上面的示例输入),您的预期输出是什么?问题是这是一个赋值,我必须以特定的方式解决。很抱歉,我应该在我的原始帖子中指定,我将对其进行编辑和添加。
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
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]);