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