Java 在值数组中查找第一个和第二个?

Java 在值数组中查找第一个和第二个?,java,arrays,sorting,Java,Arrays,Sorting,我试图根据函数对各种“pc规格”的值进行排序,并根据函数输出第一和第二最佳pc分数: score[i]=2*pcram[i]+3*pccpu[i]+pchdd[i] 分类如下: //place sorted data into seperate arrays to make calculations more logical to look at for (i = 0; i < numpc; i++){ pcram[i] = Integer.parseIn

我试图根据函数对各种“pc规格”的值进行排序,并根据函数输出第一和第二最佳pc分数:

score[i]=2*pcram[i]+3*pccpu[i]+pchdd[i]

分类如下:

    //place sorted data into seperate arrays to make calculations more logical to look at
    for (i = 0; i < numpc; i++){

        pcram[i] = Integer.parseInt(pcname[i][1]);
        pccpu[i] = Integer.parseInt(pcname[i][2]);
        pchdd[i] = Integer.parseInt(pcname[i][3]);

    }

    //solve the score and find first and second place
    for (i = 0; i < numpc; i++){
        score[i] = 2*pcram[i] + 3*pccpu[i] + pchdd[i];
    }

    for (i = 0; i < numpc - 1; i++){
        if (i == 0 && score[i + 1] > score[i]){
            first = i + 1;
            second = i;
        }
        if(i == 0 && score[i + 1] > score[i]){
            first = i;
            second = i+1;
        }
        if (score[i + 1] > score[i]){
            second = first;
            first = i+1;
        }
        if (score[i] > score[i+1]){
            second = first;
            first = i;
        }
    }
    System.out.println(pcname[first][0] + "  " + score[first]);
    System.out.println(pcname[second][0] + "  " + score[second] + " " + score[0]);
很明显,该程序输出Custom(自定义)为第一个,但随后表示Dell为第二个。我试图涵盖所有场景,但没有任何效果。提前谢谢

编辑:根据要求,完整的程序。(这实现了一种建议的排序方法,原始排序方法张贴在上面)

publicstaticvoidmain(字符串[]args){
扫描仪名称输入=新扫描仪(System.in);
扫描仪数据输入=新扫描仪(System.in);
int numpc=datainput.nextInt();
String[]pcname=新字符串[numpc][5];//保留已排序的数据
String[]pcdata=新字符串[numpc];//保留未排序的数据
int i=0;
int first=0;
int秒=0;
int[]分数=新int[numpc];
int[]pcram=新的int[numpc];
int[]pccpu=新的int[numpc];
int[]pchdd=新的int[numpc];
//开始程序
对于(i=0;i第一){
第一个=分数[i];
}
如果(分数[i+1]>秒){
第二名=得分[i+1];
}
}否则{
如果(分数[i+1]>第一){
第一名=得分[i+1];
}
如果(分数[i]>秒){
第二=得分[i];
}
}   
}

因为(i=0;i看起来你只是混淆了比较符号

for (i = 0; i < numpc - 1; i++){
    if (i == 0 && score[i + 1] > score[i]){
        first = i + 1;
        second = i;
    }
    if(i == 0 && score[i + 1] < score[i]){  //<--- you had > here
        first = i;
        second = i+1;
    }
    if (score[i + 1] > score[i]){
        second = first;
        first = i+1;
    }
    if (score[i] > score[i+1]){
        second = first;
        first = i;
    }
}
for(i=0;iscore[i]){
第一个=i+1;
第二个=i;
}
如果(i==0&&score[i+1]分数[i]){
第二=第一;
第一个=i+1;
}
如果(分数[i]>分数[i+1]){
第二=第一;
第一个=i;
}
}
*编辑* 我认为问题在于,如果I的值实际上大于或小于第一个或第二个值,则不进行比较,您应该尝试以下方法:

    int first = 0, second = 0;
     for(i = 0; i<score.length-1; i++){     //first find and store the highest values
        if(score[i]> score[i+1]){
            if(score[i]>first){
                second = first;   // *NEW* the former first place is now the second !
                first = score[i]; //first = 541 //NAN // NAN
            }
            if(score[i+1]>second){ //second = 538 //NAN // NAN
                second = score[i+1];
            }
        } else {
            if(score[i+1]>first){
                second = first;
                first = score[i+1];//NAN // 522< 541 // first = 6000
            }
            if(score[i]>second){
                second = score[i];//NAN // NAN // NAN
            }
        }   
    }
int first=0,second=0;
对于(i=0;i得分[i+1]){
如果(分数[i]>第一){
第二名=第一名;//*新*前第一名现在是第二名!
第一个=得分[i];//第一个=541//NAN//NAN
}
如果(分数[i+1]>second){//second=538//NAN//NAN
第二名=得分[i+1];
}
}否则{
如果(分数[i+1]>第一){
第二=第一;
第一名=得分[i+1];//南//522<541//第一名=6000
}
如果(分数[i]>秒){
秒=得分[i];//NAN//NAN//NAN
}
}   
}

注意:奇怪的注释是跟随循环中发生的事情。将它们解释为列(其中每列=循环的一个周期)

为什么不创建一个自定义类,并为该类创建一个
比较器呢?我被要求在单个类中进行此操作:p我不明白程序为什么忽略
分数[0]
比较时。好吧,你知道,封闭类存在……最终结果仍然是一个类……是的,这是真的;但是,如果我使用比较器Inferace,它将遵循与我现有代码中的检查相同的逻辑。我想知道如何更改逻辑以使其工作。哈哈,似乎是这样(我感觉非常糟糕)但我测试了一下,它仍然不起作用。输入和我在问题中概述的一样,它输出Custom作为第一个,Dell作为第二个(苹果应该是第二个).是的,我认为问题在于你实际上没有比较第一个和第二个中已经存在的值。参见编辑的回答我不明白为什么编辑的代码不起作用,但程序继续抛出错误的结果。如果你想查看整个代码,我很乐意与你分享。谢谢你的帮助。你考虑过了吗检查分数数组的打印输出?可能有问题。无论如何,我愿意提供帮助。是的,我这样做了,我打印了
score[0]
的值以及
first
second
的分数,以便我可以手动检查它们。
score[0]当使用我包含的样本输入时,
明显大于
second
for (i = 0; i < numpc - 1; i++){
    if (i == 0 && score[i + 1] > score[i]){
        first = i + 1;
        second = i;
    }
    if(i == 0 && score[i + 1] < score[i]){  //<--- you had > here
        first = i;
        second = i+1;
    }
    if (score[i + 1] > score[i]){
        second = first;
        first = i+1;
    }
    if (score[i] > score[i+1]){
        second = first;
        first = i;
    }
}
    int first = 0, second = 0;
     for(i = 0; i<score.length-1; i++){     //first find and store the highest values
        if(score[i]> score[i+1]){
            if(score[i]>first){
                second = first;   // *NEW* the former first place is now the second !
                first = score[i]; //first = 541 //NAN // NAN
            }
            if(score[i+1]>second){ //second = 538 //NAN // NAN
                second = score[i+1];
            }
        } else {
            if(score[i+1]>first){
                second = first;
                first = score[i+1];//NAN // 522< 541 // first = 6000
            }
            if(score[i]>second){
                second = score[i];//NAN // NAN // NAN
            }
        }   
    }