合并排序在使用字符串实现时会生成任意顺序 - java

我正在编写用于分配的程序,但是当我尝试使归并排序适应字符串(按字母顺序排序)时,它将生成看似随机的标题顺序,如下所示。不久前我问了这个问题,但没有得到真正的答案,所以我觉得我需要更好地表达它并包括我的完整代码。

按标题升序

Titanic, 1997 by Paramount, Marvel's The Avengers, 2012 by Disney  
Harry Potter and the Deathly Hallows Part 2, 2012 by Warner Brothers  
Furious 7, 2015 by Universal  
Avengers: Age of Ultron, 2015 by Disney  
Avatar, 2009 by Fox  
Star Wars: The Force Awakens, 2015 by Disney  
Jurassic World, 2015 by Universal  
Avengers: Infinity War, 2018 by Disney  
Black Panther, 2018 by Disney  

I have to arrange alphabetically specifically using merge sort that I write myself, and while I have tried all sorts of different configurations of the compareTo statement, like:

else if ((a[j].getTitle()).compareTo(a[i].getTitle()) > 0)
else if ((a[i].getTitle()).compareTo(a[j].getTitle()) < 0)
else if ((a[i].getTitle()).compareTo(a[j].getTitle()) > 0)

他们都没有工作。

/**
 * Write a description of class MovieV3Tester here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class MovieV3Tester
{
    public static void main(String [] args)
    {
        MovieV3 [] movies = {new MovieV3 ("Avatar", 2009, "Fox"), 
                           new MovieV3 ("Titanic", 1997, "Paramount"), 
                           new MovieV3 ("Star Wars: The Force Awakens", 2015, "Disney"),
                           new MovieV3 ("Avengers: Infinity War", 2018, "Disney"),
                           new MovieV3 ("Jurassic World", 2015, "Universal"),
                           new MovieV3 ("Marvel's The Avengers", 2012, "Disney"),
                           new MovieV3 ("Furious 7", 2015, "Universal"),
                           new MovieV3 ("Avengers: Age of Ultron", 2015, "Disney"),
                           new MovieV3 ("Black Panther", 2018, "Disney"),
                           new MovieV3 ("Harry Potter and the Deathly Hallows Part 2", 2012, "Warner Brothers")
                           };
    System.out.println("Original\n");
    print(movies);
    System.out.println("\nBy Title Ascending\n");
    mergeTitle(movies, 0, (movies.length-1));
    mergeTitle(movies, 0, (movies.length-1));
    print(movies);
    System.out.println("\nBy Year Ascending\n");
    mergeYear(movies, 0, (movies.length-1));
    print(movies);
}
public static void print(MovieV3 [] movies)
{
    for(MovieV3 movie : movies)
    {
        System.out.println(movie.getTitle() + ", " + movie.getYear() + " by " + movie.getStudio());
    }
}
public static void merge( MovieV3[] a, int low, int mid, int high, int compare)
{
    MovieV3[] temp = new MovieV3[ high - low + 1 ];

    int i = low, j = mid + 1, n = 0;
    if(compare == 1)
    {
    while( i <= mid || j <= high )
    {
        if( i > mid )
        {
            temp[ n ] = a[ j ];
            j++;
        }
        else if( j > high )
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else if( a[ i ].getYear() < a[ j ].getYear() )
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else
        {
            temp[ n ] = a[ j ];
            j++;
        }
        n++;
    }
    }
    else if(compare ==2)
    {
        while( i <= mid || j <= high )
    {
        if( i > mid )
        {
            temp[ n ] = a[ j ];
            j++;
        }
        else if( j > high )
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else if((a[ j ].getTitle()).compareTo(a[i].getTitle())< 0)
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else
        {
            temp[ n ] = a[ j ];
            j++;
        }
        n++;
    }
    }
    else
    {
        while( i <= mid || j <= high )
    {
        if( i > mid )
        {
            temp[ n ] = a[ j ];
            j++;
        }
        else if( j > high )
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else if( a[ i ].getYear() < a[ j ].getYear() )
        {
            temp[ n ] = a[ i ];
            i++;
        }
        else
        {
            temp[ n ] = a[ j ];
            j++;
        }
        n++;
    }
    }
    for( int k = low ; k <= high ; k++ )
        a[ k ] = temp[ k - low ];
} // end of merge
public static void mergeYear(MovieV3[] a, int low, int high)
{
    if( low == high )
        return;

    int mid = ( low + high ) / 2;

    mergeYear( a, low, mid );       // recursive call
    mergeYear( a, mid + 1, high);   // recursive call

    //Debugging Statements 
    //uncomment to print the listings after each pass through the sort
    //System.out.println("\nCurrent list");
    //for(Movie h : a)  
    //    if( h != null) System.out.printf("$%10.2f \n", h.getCost() );

    merge( a, low, mid, high, 1);
}

public static void mergeTitle(MovieV3[] a, int low, int high)
{
    if( low == high )
        return;

    int mid = ( low + high ) / 2;

    mergeYear( a, low, mid );       // recursive call
    mergeYear( a, mid + 1, high);   // recursive call

    //Debugging Statements 
    //uncomment to print the listings after each pass through the sort
    //System.out.println("\nCurrent list");
    //for(Movie h : a)  
    //    if( h != null) System.out.printf("$%10.2f \n", h.getCost() );

    merge( a, low, mid, high, 2);
}
public static MovieV3 [] insertionTitle(MovieV3[] source,int compare)
{
   MovieV3[] dest = new MovieV3[ source.length ];

    for( int i = 0 ; i < source.length ; i++ )
    {
        MovieV3 next = source[ i ];
        int insertIndex = 0;
        int k = i;
        while( k > 0 && insertIndex == 0 )
        {
            if(compare == 1)
            {
            if( next.getTitle().compareTo( dest[k-1].getTitle() ) > 0 )
            {
                insertIndex = k;
            }
            else
            {
                dest[ k ] = dest[ k - 1 ];
            }
            }
            else
            {
            if( next.getTitle().compareTo( dest[k-1].getTitle() ) < 0 )
            {
                insertIndex = k;
            }
            else
            {
                dest[ k ] = dest[ k - 1 ];
            }  
            }
            k--;
        }

        dest[ insertIndex ] = next;

        //Debugging Statements 
        //uncomment to print the listings after each pass through the sort
        //System.out.println("\nPass # " + i);
        //for(MovieV3 h : dest)  
        //    if( h != null) System.out.printf("%-15s \n", h.getCity() );
    } // end of for
    return dest;
}

}

希望它将最终输出以下内容

《阿凡达》,2009年,福克斯,
迪士尼复仇者联盟:奥创纪元,2015年,
迪士尼《复仇者联盟:无限战争》,2018年,
《黑豹》,2018年,迪士尼,
环球影业的《 Furious 7》,2015年,
《哈利·波特与死亡圣器》第2部分,2012年,华纳兄弟出版社,
环球影业的《侏罗纪世界》,2015年,
迪士尼的《漫威复仇者》,2012年,
迪士尼,《星球大战:原力觉醒》,2015年,
《泰坦尼克号》,1997年,派拉蒙公司

该程序对int进行排序就很好了,这是String排序不起作用的原因。

参考方案

您的大多数程序都是正确的;只有几个小错误。

这是您的代码版本,带有较小的修复程序和注释:

public class MovieV3Tester
{
    public static void main(String[] args)
    {
        MovieV3[] movies = {
            new MovieV3 ("Avatar", 2009, "Fox"), 
            new MovieV3 ("Titanic", 1997, "Paramount"), 
            new MovieV3 ("Star Wars: The Force Awakens", 2015, "Disney"),
            new MovieV3 ("Avengers: Infinity War", 2018, "Disney"),
            new MovieV3 ("Jurassic World", 2015, "Universal"),
            new MovieV3 ("Marvel's The Avengers", 2012, "Disney"),
            new MovieV3 ("Furious 7", 2015, "Universal"),
            new MovieV3 ("Avengers: Age of Ultron", 2015, "Disney"),
            new MovieV3 ("Black Panther", 2018, "Disney"),
            new MovieV3 ("Harry Potter and the Deathly Hallows Part 2", 2012, "Warner Brothers")
        };

        System.out.println("Original\n");
        print(movies);
        System.out.println("\nBy Title Ascending\n");
        mergeTitle(movies, 0, (movies.length-1)); 
        // Removed extra unnecessary call to `mergeTitle()`
        print(movies);
        System.out.println("\nBy Year Ascending\n");
        mergeYear(movies, 0, (movies.length-1));
        print(movies);
    }

    public static void print(MovieV3[] movies)
    {
        for (MovieV3 movie : movies)
        {
            System.out.println(movie.getTitle() + ", " + movie.getYear() + " by " + movie.getStudio());
        }
    }

    public static void merge(MovieV3[] a, int low, int mid, int high, int compare)
    {
        MovieV3[] temp = new MovieV3[high - low + 1];

        int i = low, j = mid + 1, n = 0;
        // Changed from `compare == 1` to this so that the last `else` block could be 
        // removed, as it was identical to this first block
        if (compare != 2)
        {
            while (i <= mid || j <= high)
            {
                if (i > mid)
                {
                    temp[n] = a[j];
                    j++;
                }
                else if (j > high)
                {
                    temp[n] = a[i];
                    i++;
                }
                else if (a[i].getYear() < a[j].getYear())
                {
                    temp[n] = a[i];
                    i++;
                }
                else
                {
                    temp[n] = a[j];
                    j++;
                }
                n++;
            }
        }
        else if (compare == 2)
        {
            while (i <= mid || j <= high)
            {
                if (i > mid)
                {
                    temp[n] = a[j];
                    j++;
                }
                else if (j > high)
                {
                    temp[n] = a[i];
                    i++;
                }
                // Changed the operator from `<` to `>` so that the titles are printed 
                // the way you showed in your post
                else if ((a[j].getTitle()).compareTo(a[i].getTitle()) > 0)
                {
                    temp[n] = a[i];
                    i++;
                }
                else
                {
                    temp[n] = a[j];
                    j++;
                }
                n++;
            }
        }

        for (int k = low ; k <= high ; k++)
            a[k] = temp[k - low];

    } // end of merge

    public static void mergeYear(MovieV3[] a, int low, int high)
    {
        if (low == high)
            return;

        int mid = (low + high) / 2;

        mergeYear(a, low, mid);       // recursive call
        mergeYear(a, mid + 1, high);   // recursive call

        merge(a, low, mid, high, 1);
    }

    public static void mergeTitle(MovieV3[] a, int low, int high)
    {
        if (low == high)
            return;

        int mid = (low + high) / 2;

        // I'm not sure if it was just a typo but in your code you had called `mergeYear()` 
        // twice instead of `mergeTitle()`, which was causing the sorting to not work
        mergeTitle(a, low, mid);       // recursive call
        mergeTitle(a, mid + 1, high);   // recursive call

        merge(a, low, mid, high, 2);
    }
}

即使所做的修改很小,并且您基本上已在正确的位置编写了代码,但希望这会有所帮助。

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

如何在Wiremock中为JUNIT匹配精确的json - java

我正在使用Wiremock在Spring启动应用程序中模拟Junit的REST服务。我的问题是,我无法匹配多个匹配模式。 Junit.javaStringValuePattern pattern = WireMock.matching(".*"); givenThat(post(urlEqualTo("/softwares�…

在Map中,如果我们使用现有键进行修改,则不会获得ConcurrentModificationException - java

我有以下代码,我希望从情况2的情况下抛出ConcurrentModificationException,但它运行成功。据我所知,如果我对地图中的单个键执行相同的操作,则不会抛出异常,因为here但是当我重现这种具有两个案例的多个密钥的场景时,通过新密钥修改。通过现有密钥进行修改。情况1: Map<String,String> mp = new H…

春天的多属性文件 - java

我在spring中加载属性文件: <context:property-placeholder location="classpath:foo.properties"/> 但是,如果我尝试在另一个上下文文件中加载另一个文件,则会出现错误。 java大神给出的解决方案 如果您需要覆盖属性,则可以执行以下操作:<context…