Java交换无效。

6
我正在研究一种方法,旨在按升序对数组进行排序。 该数组由地震标记对象组成,我需要做的是按对象的“magnitude”属性对数组进行排序。我尝试使用选择排序,但似乎元素没有正确交换。
这是我的代码:
private void sortAndPrint(int numToPrint){
    Object[] quakeArray= quakeMarkers.toArray();

    int indexMax;
    for(int i=0; i<quakeArray.length-1; i++) {
        indexMax = i;
        float max = ((EarthquakeMarker)(quakeArray[i])).getMagnitude();

        for( int j =i+1; j<quakeArray.length;j++){
            if(((EarthquakeMarker)(quakeArray[j])).getMagnitude()>max)
                indexMax = j;
        }
        //swap it
        Object temp = quakeArray[i];
        quakeArray[i] = quakeArray[indexMax];
        quakeArray[indexMax] = temp;
    }
    //sort finished

    for(int i =0; i< numToPrint; i++) {
        System.out.println(((EarthquakeMarker)quakeArray[i]).getProperty("title").toString());
    }
}

事实证明,这些地震并不是按其震级排序的。

控制台输出

在我看来,可能是交换时出了问题,因为Java是按值传递的。如果是这样,我该如何解决呢?还是问题出在其他地方?


你没有更新你的 max - mroman
2个回答

4
你的选择排序逻辑是不正确的。当你检测到一个新的高值条目时,你从来没有设置max。你可能想要在更新indexMax时更新max,或者删除max并只使用indexMax。
对于更实用的方法,在大多数情况下,当可用时,你应该使用内置功能,如Array.sort()。

3
您可以考虑使用Java内置的Arrays.sort,并传递一个比较地震大小的lambda函数。
编辑:Integer.compare可用于比较。
Arrays.sort( (a, b) -> Integer.compare( a.magnitude, b.magnitude) );

2
或者使用 Integer.compare(a.magnitude, b.magnitude) 代替 a.magnitude - b.magnitude - Socowi
好观点,谢谢!这是我经常忘记的事情。 - Tavi Kohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接